12 #ifndef ZYPP_BASE_JSON_H
13 #define ZYPP_BASE_JSON_H
32 inline static const std::string &
nullJSON() {
static const std::string _s(
"null" );
return _s; }
33 inline static const std::string &
trueJSON() {
static const std::string _s(
"true" );
return _s; }
34 inline static const std::string &
falseJSON() {
static const std::string _s(
"false" );
return _s; }
41 typedef unsigned char uchar;
44 for_( r, val_r.begin(), val_r.end() )
46 if ( uchar(*r) < 32u )
75 val_r.resize( val_r.size() + add,
'@' );
76 auto w( val_r.rbegin() );
80 for ( ; r != val_r.rend(); ++r )
82 if ( uchar(*r) < 32u )
84 static const char * digit =
"0123456789abcdef";
108 *w++ = digit[uchar(*r) % 15];
109 *w++ = digit[uchar(*r) / 16];
119 switch ( (*w++ = *r) )
159 template <
class V> std::string
toJSON(
const std::vector<V> & cont_r );
160 template <
class V> std::string
toJSON(
const std::list<V> & cont_r );
161 template <
class V> std::string
toJSON(
const std::set<V> & cont_r );
164 template <
class K,
class V> std::string
toJSON(
const std::map<K,V> & cont_r );
176 std::string
toJSON(
const T & val_r ) {
return val_r.asJSON(); }
223 std::ostream &
dumpOn( std::ostream & str )
const
224 {
return str <<
_data; }
232 {
return obj.
dumpOn( str ); }
261 template <
class Iterator>
262 Array( Iterator begin, Iterator end )
263 {
for_( it, begin, end )
add( *it ); }
266 Array(
const std::initializer_list<Value> & contents_r )
267 :
Array( contents_r.begin(), contents_r.end() )
275 void add(
const std::initializer_list<Value> & contents_r )
276 {
for_( it, contents_r.begin(), contents_r.end() )
add( *it ); }
287 std::ostream &
dumpOn( std::ostream & str )
const
291 str <<
'[' << *
_data.begin();
303 {
return obj.
dumpOn( str ); }
306 std::string
toJSON(
const std::vector<V> & cont_r )
307 {
return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); }
310 std::string
toJSON(
const std::list<V> & cont_r )
311 {
return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); }
314 std::string
toJSON(
const std::set<V> & cont_r )
315 {
return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); }
326 template <
class Iterator>
328 {
for_( it, begin, end )
add( it->first, it->second ); }
331 Object(
const std::initializer_list<std::pair<String, Value>> & contents_r )
332 :
Object( contents_r.begin(), contents_r.end() )
340 void add(
const std::initializer_list<std::pair<String, Value>> & contents_r )
341 {
for_( it, contents_r.begin(), contents_r.end() )
add( it->first, it->second ); }
352 std::ostream &
dumpOn( std::ostream & str )
const
359 dumpOn( str <<
',' << endl, val );
360 return str << endl <<
'}';
364 std::ostream &
dumpOn( std::ostream & str, std::map<std::string,std::string>::const_iterator val_r )
const
365 {
return str << val_r->first <<
": " << val_r->second; }
367 std::map<std::string,std::string>
_data;
372 {
return obj.
dumpOn( str ); }
374 template <
class K,
class V>
375 std::string
toJSON(
const std::map<K,V> & cont_r )
376 {
return json::Object( cont_r.begin(), cont_r.end() ).asJSON(); }
383 #endif // ZYPP_BASE_JSON_H