25#ifndef JOIN_DATA_SAX_HPP
26#define JOIN_DATA_SAX_HPP
35#include <system_error>
72 virtual const char*
name ()
const noexcept;
79 virtual std::string
message (
int code)
const;
251 ,
_out (document.rdbuf ())
302 switch (value.
index ())
348 for (
auto const& element : array)
371 for (
auto const& member :
object)
373 if (
setKey (member.first) == -1)
400 inline void append2 (
const char* data)
noexcept
402 _out->sputc (data[0]);
403 _out->sputc (data[1]);
410 inline void append3 (
const char* data)
noexcept
412 _out->sputc (data[0]);
413 _out->sputc (data[1]);
414 _out->sputc (data[2]);
421 inline void append4 (
const char* data)
noexcept
423 _out->sputc (data[0]);
424 _out->sputc (data[1]);
425 _out->sputc (data[2]);
426 _out->sputc (data[3]);
433 inline void append5 (
const char* data)
noexcept
435 _out->sputc (data[0]);
436 _out->sputc (data[1]);
437 _out->sputc (data[2]);
438 _out->sputc (data[3]);
439 _out->sputc (data[4]);
447 inline void append (
const char* data, uint32_t size)
noexcept
449 _out->sputn (data, size);
510 virtual int deserialize (
const char* document,
size_t length) = 0;
518 virtual int deserialize (
const char* first,
const char* last) = 0;
594 virtual int setInt (int32_t value)
override
644 virtual int setString (
const std::string& value)
override
657 array.reserve (size ? size : 8);
661 _root = std::move (array);
676 _stack.push (&parent->
insert ({std::move (_curkey), std::move (array)}));
708 object.reserve (size ? size : 8);
712 _root = std::move (
object);
727 _stack.push (&parent->
insert ({std::move (_curkey), std::move (object)}));
783 parent->
pushBack (std::move (value));
807 struct is_error_condition_enum<
join::SaxErrc> :
public true_type
SAX API generic error category.
Definition sax.hpp:66
virtual std::string message(int code) const
translate SAX API generic error code to human readable error string.
Definition sax.cpp:44
virtual const char * name() const noexcept
get SAX API generic error category name.
Definition sax.cpp:35
SAX API interface class.
Definition sax.hpp:106
virtual int setInt(int32_t value)=0
set integer value.
virtual int setInt64(int64_t value)=0
set 64 bits integer value.
virtual int setString(const std::string &value)=0
set string value.
SaxHandler(SaxHandler &&other)=default
move constructor.
virtual int startArray(uint32_t size=0)=0
start array.
SaxHandler()=default
default constructor.
virtual int setNull()=0
set null value.
virtual int stopArray()
stop array.
Definition sax.hpp:210
SaxHandler(const SaxHandler &other)=default
copy constructor.
virtual int setBool(bool value)=0
set boolean value.
virtual int setDouble(double value)=0
set real value.
virtual int setKey(const Value &key)=0
set key.
virtual int startObject(uint32_t size=0)=0
start object.
virtual int setUint64(uint64_t value)=0
set unsigned 64 bits integer value.
virtual ~SaxHandler()=default
destroy instance.
virtual int setUint(uint32_t value)=0
set unsigned integer value.
virtual int stopObject()
stop object.
Definition sax.hpp:233
stream deserializer abstract class.
Definition sax.hpp:461
virtual int stopObject() override
stop object.
Definition sax.hpp:752
virtual int startArray(uint32_t size=0) override
start array.
Definition sax.hpp:654
virtual int deserialize(std::ifstream &document)=0
deserialize a document.
StreamReader(Value &root)
default constructor.
Definition sax.hpp:467
virtual int setInt64(int64_t value) override
set 64 bits integer value.
Definition sax.hpp:614
virtual int setUint(uint32_t value) override
set unsigned integer value.
Definition sax.hpp:604
virtual int deserialize(std::istringstream &document)=0
deserialize a document.
StreamReader(StreamReader &&other)=delete
move constructor.
std::stack< Value * > _stack
stack.
Definition sax.hpp:793
Value _curkey
current key.
Definition sax.hpp:796
virtual int setNull() override
set null value.
Definition sax.hpp:574
virtual int deserialize(std::istream &document)=0
deserialize a document.
virtual int deserialize(std::iostream &document)=0
deserialize a document.
virtual int setValue(Value &&value)
set value.
Definition sax.hpp:767
virtual int deserialize(const char *document, size_t length)=0
deserialize a document.
static constexpr size_t _maxdepth
max stack depth.
Definition sax.hpp:790
virtual int setUint64(uint64_t value) override
set unsigned 64 bits integer value.
Definition sax.hpp:624
virtual int deserialize(const char *first, const char *last)=0
deserialize a document.
virtual int deserialize(std::stringstream &document)=0
deserialize a document.
virtual int setKey(const Value &key) override
set key.
Definition sax.hpp:742
StreamReader(const StreamReader &other)=delete
copy constructor.
virtual int deserialize(std::fstream &document)=0
deserialize a document.
virtual int deserialize(const std::string &document)=0
deserialize a document.
StreamReader & operator=(const StreamReader &other)=delete
copy assignment.
virtual int setInt(int32_t value) override
set integer value.
Definition sax.hpp:594
virtual int startObject(uint32_t size=0) override
start object.
Definition sax.hpp:705
virtual int setBool(bool value) override
set boolean value.
Definition sax.hpp:584
virtual int stopArray() override
stop array.
Definition sax.hpp:690
Value & _root
root.
Definition sax.hpp:799
virtual int setDouble(double value) override
set real value.
Definition sax.hpp:634
virtual int setString(const std::string &value) override
set string value.
Definition sax.hpp:644
virtual ~StreamReader()=default
destroy instance.
stream serializer abstract class.
Definition sax.hpp:243
void append(const char *data, uint32_t size) noexcept
append characters to output stream in batch.
Definition sax.hpp:447
virtual ~StreamWriter()=default
Destroy the Writer instance.
int setValue(const Value &value)
set value.
Definition sax.hpp:300
virtual int setArray(const Array &array)
set array value.
Definition sax.hpp:341
std::streambuf * _out
underlying output stream.
Definition sax.hpp:454
virtual int setObject(const Object &object)
set object value.
Definition sax.hpp:364
virtual int serialize(const Value &value)
Serialize data.
Definition sax.hpp:289
StreamWriter(StreamWriter &&other)=delete
Create the Writer instance by move.
void append3(const char *data) noexcept
append 3-character literal to output stream in batch.
Definition sax.hpp:410
StreamWriter(const StreamWriter &other)=delete
Create the Writer instance by copy.
void append(char data) noexcept
append character to output stream in batch.
Definition sax.hpp:391
StreamWriter & operator=(const StreamWriter &other)=delete
Assign the Writer instance by copy.
void append5(const char *data) noexcept
append 5-character literal to output stream in batch.
Definition sax.hpp:433
StreamWriter(std::ostream &document)
create instance.
Definition sax.hpp:249
void append4(const char *data) noexcept
append 4-character literal to output stream in batch.
Definition sax.hpp:421
void append2(const char *data) noexcept
append 2-character literal to output stream in batch.
Definition sax.hpp:400
value class.
Definition value.hpp:63
@ Integer64
Definition value.hpp:74
@ Unsigned64
Definition value.hpp:75
@ Real
Definition value.hpp:76
@ Boolean
Definition value.hpp:71
@ String
Definition value.hpp:77
@ ArrayValue
Definition value.hpp:78
@ Integer
Definition value.hpp:72
@ Unsigned
Definition value.hpp:73
@ ObjectValue
Definition value.hpp:79
Value & pushBack(const Value &value)
appends element at the end of the nested container.
Definition value.hpp:1278
Value & insert(const Member &member)
insert element in the nested container.
Definition value.hpp:1215
constexpr std::enable_if_t< is_unique< T, Ts... >::value, T & > get()
get the variable value of the object type identified by type.
Definition variant.hpp:548
constexpr std::size_t index() const noexcept
return the index of the alternative that is currently held by the variant.
Definition variant.hpp:659
const std::string key(65, 'a')
key.
Definition acceptor.hpp:32
const std::error_category & saxCategory() noexcept
get error category.
Definition sax.cpp:67
SaxErrc
SAX API generic error codes.
Definition sax.hpp:54
std::vector< Value > Array
array.
Definition value.hpp:50
std::error_code make_error_code(join::Errc code) noexcept
Create an std::error_code object.
Definition error.cpp:195
thread_local std::error_code lastError
last error.
Definition error.cpp:32
std::vector< Member > Object
object.
Definition value.hpp:56
std::error_condition make_error_condition(join::Errc code) noexcept
Create an std::error_condition object.
Definition error.cpp:204
disambiguation tag to indicate that the contained object should be constructed in-place.
Definition traits.hpp:57
#define JOIN_LIKELY(x)
Definition utils.hpp:45
#define JOIN_UNLIKELY(x)
Definition utils.hpp:46