44#include <drain/UniTuple.h>
68 prefix(this->next()), separator(this->next()), suffix(this->next()){
73 return ((prefix==0) && (separator==0) && (suffix==0));
92 set(prefix, 0, suffix);
96 TypeLayout(cstr_t prefix, cstr_t separator, cstr_t suffix){
97 set(prefix, separator, suffix);
119 TypeLayout &
setLayout(
const char *layout);
151 SprinterLayout(
const char *arrayChars=
"[,]",
const char *mapChars=
"{,}",
const char *pairChars=
"(,)",
152 const char *stringChars=
nullptr,
const char *keyChars=
nullptr,
const char *mapPairChars=
nullptr){
157 this->stringChars.
setLayout(stringChars);
161 this->mapPairChars.
setLayout(mapPairChars);
165 arrayChars(layout.arrayChars), mapChars(layout.mapChars), pairChars(layout.pairChars),
166 stringChars(layout.stringChars), keyChars(layout.keyChars), mapPairChars(layout.mapPairChars){
171 arrayChars.separator = itemSeparator;
172 mapChars.separator = itemSeparator;
173 pairChars.separator = itemSeparator;
174 mapPairChars.separator = itemSeparator;
183std::ostream & operator<<(std::ostream & ostr,
const SprinterLayout & layout){
184 ostr <<
"arrayChars: " << layout.arrayChars <<
'\n';
185 ostr <<
"mapChars: " << layout.mapChars <<
'\n';
186 ostr <<
"pairChars: " << layout.pairChars <<
'\n';
187 ostr <<
"stringChars: " << layout.stringChars <<
'\n';
188 ostr <<
"keyChars: " << layout.keyChars <<
'\n';
189 ostr <<
"mapPairChars: " << layout.mapPairChars <<
'\n';
259 ostr << layout.prefix;
263 void separatorToStream(std::ostream & ostr,
const TypeLayout & layout){
264 if (layout.separator)
265 ostr << layout.separator;
269 void suffixToStream(std::ostream & ostr,
const TypeLayout & layout){
271 ostr << layout.suffix;
276 template <
class K,
class V>
278 std::ostream & pairToStream(std::ostream & ostr,
const std::pair<K,V> & x,
const SprinterLayout & layout){
286 suffixToStream(ostr, layout.keyChars);
288 separatorToStream(ostr, layout.pairChars);
292 suffixToStream(ostr, layout.pairChars);
298 template <
class K,
class V>
308 suffixToStream(ostr, layout.keyChars);
310 separatorToStream(ostr, layout.mapPairChars);
314 suffixToStream(ostr, layout.mapPairChars);
337 for (
const auto & elem: x){
342 separatorToStream(ostr, myChars);
347 suffixToStream(ostr, myChars);
361 template <
class M,
class K>
369 const bool MAP_PAIRS = !layout.mapPairChars.empty();
372 for (
typename K::const_iterator it=keys.begin(); it != keys.end(); ++it){
374 if (it != keys.begin())
375 separatorToStream(ostr, layout.mapChars);
377 typename M::const_iterator mit = m.find(*it);
387 std::cerr << __FILE__ << __FUNCTION__ <<
':' <<
"missing key: " << *it << std::endl;
392 suffixToStream(ostr, layout.mapChars);
414 suffixToStream(ostr, myChars);
428 template <
class K,
class V>
431 return pairToStream(ostr, x, layout);
436 std::ostream &
toStream(std::ostream & ostr,
const std::vector<D> & x,
const SprinterLayout & layout =
defaultLayout){
442 std::ostream &
toStream(std::ostream & ostr,
const std::list<D> & x,
const SprinterLayout & layout =
defaultLayout){
448 std::ostream &
toStream(std::ostream & ostr,
const std::set<D> & x,
const SprinterLayout & layout =
defaultLayout){
452 template <
class K,
class V>
454 std::ostream &
toStream(std::ostream & ostr,
const std::map<K,V> & x,
const SprinterLayout & layout =
UNSET_LAYOUT){
465 template <
class D,
size_t N>
495 return ostr << (b ?
"true":
"false");
504 return ostr <<
"null";
506 return ostr <<
"null";
536 const bool DATA = !tree.data.empty();
537 const bool CHILDREN = !tree.empty();
539 if (! (DATA||CHILDREN)){
541 ostr << layout.mapChars.prefix << layout.mapChars.suffix;
545 const std::string pad(2*indent,
' ');
566 ostr << layout.mapChars.separator;
570 ostr << layout.mapChars.prefix <<
'\n';
574 for (
const auto & entry: tree){
580 sep = layout.mapChars.separator;
582 ostr << pad <<
" " <<
'"' << entry.first <<
'"' << layout.pairChars.separator <<
' ';
588 ostr << pad << layout.mapChars.suffix;
605template <
class T,
class L=Spr
interLayout>
617 std::ostream & toStream(std::ostream & ostr)
const {
621 std::string str()
const {
622 std::stringstream sstr;
630template <
class T,
class L>
632std::ostream & operator<<(std::ostream & ostr,
const Sprintlet<T,L> & sp){
633 return sp.toStream(ostr);
641Sprintlet<T> sprinter(
const T & x,
const char *arrayCaps,
const char *mapCaps=
"{,}",
const char *pairCaps=
"(:)",
const char *stringCaps=
"\""){
642 return Sprintlet<T>(x, SprinterLayout(arrayCaps,mapCaps,pairCaps,stringCaps));
649 return Sprintlet<T>(x, layout);
Definition Sprinter.h:198
static std::ostream & toStream(std::ostream &ostr, const std::initializer_list< T > &x, const SprinterLayout &layout=defaultLayout)
New (experimental)
Definition Sprinter.h:423
static std::ostream & mapPairToStream(std::ostream &ostr, const std::pair< K, V > &x, const SprinterLayout &layout)
If (key,value) pairs needs specific layout in maps, use this. (Compare with list of tuples).
Definition Sprinter.h:300
static const SprinterLayout xmlAttributeLayout
Like attributes in XML (HTML, SVG, ...) tags.
Definition Sprinter.h:230
static std::ostream & toStream(std::ostream &ostr, const char *x, const SprinterLayout &layout=defaultLayout)
Conventional type: C string.
Definition Sprinter.h:480
static std::ostream & sequenceToStream(std::ostream &ostr, const T &x, const SprinterLayout &layout)
Convenience: if sequence type (array, list, set, map) not given, assume array.
Definition Sprinter.h:324
static const SprinterLayout pythonLayout
C++ code initializer list style: all objects with {...}, with comma ',' separator.
Definition Sprinter.h:248
static const SprinterLayout emptyLayout
Simply concatenate values without punctuation.
Definition Sprinter.h:209
static const SprinterLayout plainLayout
Display plain values, concatenating them with comma (except for strings).
Definition Sprinter.h:212
static void prefixToStream(std::ostream &ostr, const TypeLayout &layout)
Output Dictionary, which is a list.
Definition Sprinter.h:257
static std::ostream & toStream(std::ostream &ostr, const std::string &x, const SprinterLayout &layout=defaultLayout)
Conventional type: std::string. Notice prefix revealed.
Definition Sprinter.h:473
static const SprinterLayout defaultLayout
Displays objects with {...}, arrays with [...], pairs with (,) and strings without hyphens.
Definition Sprinter.h:206
static const SprinterLayout jsLayout
JavaScript layout. Like JSON layout, but keys without hyphens.
Definition Sprinter.h:227
static std::ostream & toStream(std::ostream &ostr, bool b, const SprinterLayout &layout=defaultLayout)
Single char gets styled same way as strings.
Definition Sprinter.h:493
static std::ostream & toStream(std::ostream &ostr, D *x, const SprinterLayout &layout=defaultLayout)
Pointer: redirect to actual target object.
Definition Sprinter.h:502
static std::ostream & treeToStream(std::ostream &ostr, const T &tree, const drain::SprinterLayout &layout, short indent=0)
Write drain::Tree's or any trees that have tree::data[] member.
Definition Sprinter.h:532
static const SprinterLayout lineLayout
Put each array and object element on a separate line.
Definition Sprinter.h:215
static std::ostream & basicToStream(std::ostream &ostr, const T &x, const TypeLayout &myChars)
Routine for non-sequence types that may like prefix and suffix, anyway.
Definition Sprinter.h:411
static const SprinterLayout cppLayout
C++ code initializer list style: all objects with {...}, with comma ',' separator.
Definition Sprinter.h:239
static std::ostream & sequenceToStream(std::ostream &ostr, const T &x, const TypeLayout &myChars, const SprinterLayout &layout)
Print sequence x with myChars, continue recursively with layout.
Definition Sprinter.h:332
static std::ostream & toStream(std::ostream &ostr, char c, const SprinterLayout &layout=defaultLayout)
Single char gets styled same way as strings.
Definition Sprinter.h:487
static std::ostream & toStream(std::ostream &ostr, const D *x, const SprinterLayout &layout=defaultLayout)
Pointer: redirect to actual target object.
Definition Sprinter.h:514
static std::ostream & mapToStream(std::ostream &ostr, const M &m, const SprinterLayout &layout, const K &keys)
Given a sequence or subsequence of keys, output values of a map in that order.
Definition Sprinter.h:363
static const SprinterLayout UNSET_LAYOUT
Marker for unset layout.
Definition Sprinter.h:203
static const SprinterLayout cmdLineLayout
Simulates how arguments are given to command line options.
Definition Sprinter.h:251
static std::ostream & toStream(std::ostream &ostr, const D &x, const SprinterLayout &layout=defaultLayout)
Default, unformatted output for basetypes and types not matching the other templates.
Definition Sprinter.h:521
static const SprinterLayout jsonLayout
Resembles JSON structure: {"a":1,"b":22,"c":3}.
Definition Sprinter.h:224
Definition Sprinter.h:606
tuplebase_t & assignSequence(T &sequence, bool LENIENT=false)
Proposed for tuples only; derived classes should not shadow this.
Definition TupleBase.h:287
Small container for printing style for putting of structured objects (array, maps,...
Definition Sprinter.h:57
Tuple of N elements of type T.
Definition UniTuple.h:65
Definition DataSelector.cpp:1277
Definition Sprinter.h:136
TypeLayout(const char layout[4])
Constructor accepting three-letter chars: {prefix,separator,suffix}.
Definition Sprinter.h:101
TypeLayout & setLayout(const char *layout)
Set layout with a single string, for example: "{,}" .
Definition Sprinter.cpp:41
TypeLayout(cstr_t prefix, cstr_t separator, cstr_t suffix)
Constructor.
Definition Sprinter.h:96
TypeLayout(cstr_t separator=',')
Constructor for simple layout using a separator but no parentheses/braces.
Definition Sprinter.h:83
TypeLayout(cstr_t prefix, cstr_t suffix)
Constructor.
Definition Sprinter.h:91