27 using ArrayReader = TREE_VECTOR(Reader);
33 using MapReader = TREE_MAP(std::string, Reader);
44 std::shared_ptr<std::string> data;
62 explicit Reader(
const std::string &data);
68 explicit Reader(std::string &&data);
75 Reader(
const Reader &parent,
size_t offset,
size_t length);
80 Reader slice(
size_t offset,
size_t length)
const;
85 uint8_t read_at(
size_t offset)
const;
93 uint64_t read_intlike(uint8_t info,
size_t &offset)
const;
101 void read_stringlike(
size_t &offset, std::ostream &s)
const;
107 void check_and_seek(
size_t &offset)
const;
128 const char *get_type_name()
const;
135 bool is_null()
const;
141 void as_null()
const;
146 bool is_bool()
const;
152 bool as_bool()
const;
164 int64_t as_int()
const;
170 bool is_float()
const;
177 double as_float()
const;
182 bool is_string()
const;
189 std::string as_string()
const;
194 bool is_binary()
const;
201 std::string as_binary()
const;
206 bool is_array()
const;
214 void read_array_item(
size_t &offset, ArrayReader &ar)
const;
222 ArrayReader as_array()
const;
235 void read_map_item(
size_t &offset, MapReader &map)
const;
243 MapReader as_map()
const;
248 std::string get_contents()
const;
261 class StructureWriter {
280 explicit StructureWriter(Writer &writer);
286 std::ostream &stream();
296 void write_bool(
bool value);
303 void write_int(int64_t value, uint8_t major=0);
308 void write_float(
double value);
313 void write_string(
const std::string &value);
318 void write_binary(
const std::string &value);
325 ArrayWriter write_array();
332 MapWriter write_map();
340 virtual ~StructureWriter();
344 StructureWriter(StructureWriter &src) =
delete;
345 StructureWriter &operator=(
const StructureWriter &src) =
delete;
350 StructureWriter(StructureWriter &&src);
351 StructureWriter &operator=(StructureWriter &&src);
364 class ArrayWriter :
public StructureWriter {
370 friend class StructureWriter;
376 explicit ArrayWriter(Writer &writer);
388 void append_bool(
bool value);
393 void append_int(int64_t value);
398 void append_float(
double value);
403 void append_string(
const std::string &value);
408 void append_binary(
const std::string &value);
415 ArrayWriter append_array();
422 MapWriter append_map();
429 class MapWriter :
public StructureWriter {
440 friend class StructureWriter;
446 explicit MapWriter(Writer &writer);
453 void append_null(
const std::string &key);
458 void append_bool(
const std::string &key,
bool value);
463 void append_int(
const std::string &key, int64_t value);
469 void append_float(
const std::string &key,
double value);
474 void append_string(
const std::string &key,
const std::string &value);
479 void append_binary(
const std::string &key,
const std::string &value);
487 ArrayWriter append_array(
const std::string &key);
495 MapWriter append_map(
const std::string &key);
508 friend StructureWriter;
513 std::ostream &stream;
520 std::stack<size_t> stack;
532 Writer(std::ostream &stream);