45#include <drain/UniTuple.h>
69 prefix(this->next()), separator(this->next()), suffix(this->next()){
74 return ((prefix==0) && (separator==0) && (suffix==0));
93 set(prefix, 0, suffix);
97 TypeLayout(cstr_t prefix, cstr_t separator, cstr_t suffix){
98 set(prefix, separator, suffix);
120 TypeLayout &
setLayout(
const char *layout);
152 SprinterLayout(
const char *arrayChars=
"[,]",
const char *mapChars=
"{,}",
const char *pairChars=
"(,)",
153 const char *stringChars=
nullptr,
const char *keyChars=
nullptr,
const char *mapPairChars=
nullptr){
158 this->stringChars.
setLayout(stringChars);
162 this->mapPairChars.
setLayout(mapPairChars);
166 arrayChars(layout.arrayChars), mapChars(layout.mapChars), pairChars(layout.pairChars),
167 stringChars(layout.stringChars), keyChars(layout.keyChars), mapPairChars(layout.mapPairChars){
172 arrayChars.separator = itemSeparator;
173 mapChars.separator = itemSeparator;
174 pairChars.separator = itemSeparator;
175 mapPairChars.separator = itemSeparator;
184std::ostream & operator<<(std::ostream & ostr,
const SprinterLayout & layout){
185 ostr <<
"arrayChars: " << layout.arrayChars <<
'\n';
186 ostr <<
"mapChars: " << layout.mapChars <<
'\n';
187 ostr <<
"pairChars: " << layout.pairChars <<
'\n';
188 ostr <<
"stringChars: " << layout.stringChars <<
'\n';
189 ostr <<
"keyChars: " << layout.keyChars <<
'\n';
190 ostr <<
"mapPairChars: " << layout.mapPairChars <<
'\n';
260 ostr << layout.prefix;
264 void separatorToStream(std::ostream & ostr,
const TypeLayout & layout){
265 if (layout.separator)
266 ostr << layout.separator;
270 void suffixToStream(std::ostream & ostr,
const TypeLayout & layout){
272 ostr << layout.suffix;
277 template <
class K,
class V>
279 std::ostream & pairToStream(std::ostream & ostr,
const std::pair<K,V> & x,
const SprinterLayout & layout){
287 suffixToStream(ostr, layout.keyChars);
289 separatorToStream(ostr, layout.pairChars);
293 suffixToStream(ostr, layout.pairChars);
299 template <
class K,
class V>
309 suffixToStream(ostr, layout.keyChars);
311 separatorToStream(ostr, layout.mapPairChars);
315 suffixToStream(ostr, layout.mapPairChars);
338 for (
const auto & elem: x){
343 separatorToStream(ostr, myChars);
348 suffixToStream(ostr, myChars);
362 template <
class M,
class K>
370 const bool MAP_PAIRS = !layout.mapPairChars.empty();
373 for (
typename K::const_iterator it=keys.begin(); it != keys.end(); ++it){
375 if (it != keys.begin())
376 separatorToStream(ostr, layout.mapChars);
378 typename M::const_iterator mit = m.find(*it);
388 std::cerr << __FILE__ << __FUNCTION__ <<
':' <<
"missing key: " << *it << std::endl;
393 suffixToStream(ostr, layout.mapChars);
415 suffixToStream(ostr, myChars);
429 template <
class K,
class V>
432 return pairToStream(ostr, x, layout);
437 std::ostream &
toStream(std::ostream & ostr,
const std::vector<D> & x,
const SprinterLayout & layout =
defaultLayout){
443 std::ostream &
toStream(std::ostream & ostr,
const std::list<D> & x,
const SprinterLayout & layout =
defaultLayout){
449 std::ostream &
toStream(std::ostream & ostr,
const std::set<D> & x,
const SprinterLayout & layout =
defaultLayout){
453 template <
class K,
class V>
455 std::ostream &
toStream(std::ostream & ostr,
const std::map<K,V> & x,
const SprinterLayout & layout =
UNSET_LAYOUT){
466 template <
class D,
size_t N>
496 return ostr << (b ?
"true":
"false");
505 return ostr <<
"null";
507 return ostr <<
"null";
537 const bool DATA = !tree.data.empty();
538 const bool CHILDREN = !tree.empty();
540 if (! (DATA||CHILDREN)){
542 ostr << layout.mapChars.prefix << layout.mapChars.suffix;
546 const std::string pad(2*indent,
' ');
567 ostr << layout.mapChars.separator;
571 ostr << layout.mapChars.prefix <<
'\n';
575 for (
const auto & entry: tree){
581 sep = layout.mapChars.separator;
583 ostr << pad <<
" " <<
'"' << entry.first <<
'"' << layout.pairChars.separator <<
' ';
589 ostr << pad << layout.mapChars.suffix;
606template <
class T,
class L=Spr
interLayout>
618 std::ostream & toStream(std::ostream & ostr)
const {
622 std::string str()
const {
623 std::stringstream sstr;
631template <
class T,
class L>
633std::ostream & operator<<(std::ostream & ostr,
const Sprintlet<T,L> & sp){
634 return sp.toStream(ostr);
642Sprintlet<T> sprinter(
const T & x,
const char *arrayCaps,
const char *mapCaps=
"{,}",
const char *pairCaps=
"(:)",
const char *stringCaps=
"\""){
643 return Sprintlet<T>(x, SprinterLayout(arrayCaps,mapCaps,pairCaps,stringCaps));
648Sprintlet<T> sprinter(
const T & x,
const SprinterLayout & layout = SprinterLayout()){
649 return Sprintlet<T>(x, layout);
Definition Sprinter.h:199
static std::ostream & toStream(std::ostream &ostr, const std::initializer_list< T > &x, const SprinterLayout &layout=defaultLayout)
New (experimental)
Definition Sprinter.h:424
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:301
static const SprinterLayout xmlAttributeLayout
Like attributes in XML (HTML, SVG, ...) tags.
Definition Sprinter.h:231
static std::ostream & toStream(std::ostream &ostr, const char *x, const SprinterLayout &layout=defaultLayout)
Conventional type: C string.
Definition Sprinter.h:481
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:325
static const SprinterLayout pythonLayout
C++ code initializer list style: all objects with {...}, with comma ',' separator.
Definition Sprinter.h:249
static const SprinterLayout emptyLayout
Simply concatenate values without punctuation.
Definition Sprinter.h:210
static const SprinterLayout plainLayout
Display plain values, concatenating them with comma (except for strings).
Definition Sprinter.h:213
static void prefixToStream(std::ostream &ostr, const TypeLayout &layout)
Output Dictionary, which is a list.
Definition Sprinter.h:258
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:474
static const SprinterLayout defaultLayout
Displays objects with {...}, arrays with [...], pairs with (,) and strings without hyphens.
Definition Sprinter.h:207
static const SprinterLayout jsLayout
JavaScript layout. Like JSON layout, but keys without hyphens.
Definition Sprinter.h:228
static std::ostream & toStream(std::ostream &ostr, bool b, const SprinterLayout &layout=defaultLayout)
Single char gets styled same way as strings.
Definition Sprinter.h:494
static std::ostream & toStream(std::ostream &ostr, D *x, const SprinterLayout &layout=defaultLayout)
Pointer: redirect to actual target object.
Definition Sprinter.h:503
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:533
static const SprinterLayout lineLayout
Put each array and object element on a separate line.
Definition Sprinter.h:216
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:412
static const SprinterLayout cppLayout
C++ code initializer list style: all objects with {...}, with comma ',' separator.
Definition Sprinter.h:240
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:333
static std::ostream & toStream(std::ostream &ostr, char c, const SprinterLayout &layout=defaultLayout)
Single char gets styled same way as strings.
Definition Sprinter.h:488
static std::ostream & toStream(std::ostream &ostr, const D *x, const SprinterLayout &layout=defaultLayout)
Pointer: redirect to actual target object.
Definition Sprinter.h:515
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:364
static const SprinterLayout UNSET_LAYOUT
Marker for unset layout.
Definition Sprinter.h:204
static const SprinterLayout cmdLineLayout
Simulates how arguments are given to command line options.
Definition Sprinter.h:252
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:522
static const SprinterLayout jsonLayout
Resembles JSON structure: {"a":1,"b":22,"c":3}.
Definition Sprinter.h:225
Definition Sprinter.h:607
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:58
Tuple of N elements of type T.
Definition UniTuple.h:65
Definition DataSelector.cpp:1277
Definition Sprinter.h:137
TypeLayout(const char layout[4])
Constructor accepting three-letter chars: {prefix,separator,suffix}.
Definition Sprinter.h:102
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:97
TypeLayout(cstr_t separator=',')
Constructor for simple layout using a separator but no parentheses/braces.
Definition Sprinter.h:84
TypeLayout(cstr_t prefix, cstr_t suffix)
Constructor.
Definition Sprinter.h:92