25#ifndef JOIN_DATA_SAX_HPP
26#define JOIN_DATA_SAX_HPP
35#include <system_error>
73 virtual const char*
name ()
const noexcept;
80 virtual std::string
message (
int code)
const;
252 ,
_out (document.rdbuf ())
303 switch (value.
index ())
349 for (
auto const& element : array)
372 for (
auto const& member :
object)
374 if (
setKey (member.first) == -1)
401 inline void append2 (
const char* data)
noexcept
403 _out->sputc (data[0]);
404 _out->sputc (data[1]);
411 inline void append3 (
const char* data)
noexcept
413 _out->sputc (data[0]);
414 _out->sputc (data[1]);
415 _out->sputc (data[2]);
422 inline void append4 (
const char* data)
noexcept
424 _out->sputc (data[0]);
425 _out->sputc (data[1]);
426 _out->sputc (data[2]);
427 _out->sputc (data[3]);
434 inline void append5 (
const char* data)
noexcept
436 _out->sputc (data[0]);
437 _out->sputc (data[1]);
438 _out->sputc (data[2]);
439 _out->sputc (data[3]);
440 _out->sputc (data[4]);
448 inline void append (
const char* data, uint32_t size)
noexcept
450 _out->sputn (data, size);
511 virtual int deserialize (
const char* document,
size_t length) = 0;
519 virtual int deserialize (
const char* first,
const char* last) = 0;
595 virtual int setInt (int32_t value)
override
645 virtual int setString (
const std::string& value)
override
658 array.reserve (size ? size : 8);
662 _root = std::move (array);
677 _stack.push (&parent->
insert ({std::move (_curkey), std::move (array)}));
709 object.reserve (size ? size : 8);
713 _root = std::move (
object);
728 _stack.push (&parent->
insert ({std::move (_curkey), std::move (object)}));
784 parent->
pushBack (std::move (value));
808 struct is_error_condition_enum<
join::SaxErrc> :
public true_type
SAX API generic error category.
Definition sax.hpp:67
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:107
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:211
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:234
stream deserializer abstract class.
Definition sax.hpp:462
virtual int stopObject() override
stop object.
Definition sax.hpp:753
virtual int startArray(uint32_t size=0) override
start array.
Definition sax.hpp:655
virtual int deserialize(std::ifstream &document)=0
deserialize a document.
StreamReader(Value &root)
default constructor.
Definition sax.hpp:468
virtual int setInt64(int64_t value) override
set 64 bits integer value.
Definition sax.hpp:615
virtual int setUint(uint32_t value) override
set unsigned integer value.
Definition sax.hpp:605
virtual int deserialize(std::istringstream &document)=0
deserialize a document.
StreamReader(StreamReader &&other)=delete
move constructor.
std::stack< Value * > _stack
stack.
Definition sax.hpp:794
Value _curkey
current key.
Definition sax.hpp:797
virtual int setNull() override
set null value.
Definition sax.hpp:575
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:768
virtual int deserialize(const char *document, size_t length)=0
deserialize a document.
static constexpr size_t _maxdepth
max stack depth.
Definition sax.hpp:791
virtual int setUint64(uint64_t value) override
set unsigned 64 bits integer value.
Definition sax.hpp:625
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:743
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:595
virtual int startObject(uint32_t size=0) override
start object.
Definition sax.hpp:706
virtual int setBool(bool value) override
set boolean value.
Definition sax.hpp:585
virtual int stopArray() override
stop array.
Definition sax.hpp:691
Value & _root
root.
Definition sax.hpp:800
virtual int setDouble(double value) override
set real value.
Definition sax.hpp:635
virtual int setString(const std::string &value) override
set string value.
Definition sax.hpp:645
virtual ~StreamReader()=default
destroy instance.
stream serializer abstract class.
Definition sax.hpp:244
void append(const char *data, uint32_t size) noexcept
append characters to output stream in batch.
Definition sax.hpp:448
virtual ~StreamWriter()=default
Destroy the Writer instance.
int setValue(const Value &value)
set value.
Definition sax.hpp:301
virtual int setArray(const Array &array)
set array value.
Definition sax.hpp:342
std::streambuf * _out
underlying output stream.
Definition sax.hpp:455
virtual int setObject(const Object &object)
set object value.
Definition sax.hpp:365
virtual int serialize(const Value &value)
Serialize data.
Definition sax.hpp:290
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:411
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:392
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:434
StreamWriter(std::ostream &document)
create instance.
Definition sax.hpp:250
void append4(const char *data) noexcept
append 4-character literal to output stream in batch.
Definition sax.hpp:422
void append2(const char *data) noexcept
append 2-character literal to output stream in batch.
Definition sax.hpp:401
value class.
Definition value.hpp:64
@ Integer64
Definition value.hpp:75
@ Unsigned64
Definition value.hpp:76
@ Real
Definition value.hpp:77
@ Boolean
Definition value.hpp:72
@ String
Definition value.hpp:78
@ ArrayValue
Definition value.hpp:79
@ Integer
Definition value.hpp:73
@ Unsigned
Definition value.hpp:74
@ ObjectValue
Definition value.hpp:80
Value & pushBack(const Value &value)
appends element at the end of the nested container.
Definition value.hpp:1279
Value & insert(const Member &member)
insert element in the nested container.
Definition value.hpp:1216
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:55
std::vector< Value > Array
array.
Definition value.hpp:51
std::error_code make_error_code(join::Errc code) noexcept
Create an std::error_code object.
Definition error.cpp:150
thread_local std::error_code lastError
last error.
Definition error.cpp:32
std::vector< Member > Object
object.
Definition value.hpp:57
std::error_condition make_error_condition(join::Errc code) noexcept
Create an std::error_condition object.
Definition error.cpp:159
disambiguation tag to indicate that the contained object should be constructed in-place.
Definition traits.hpp:57
#define JOIN_LIKELY(x)
Definition utils.hpp:46
#define JOIN_UNLIKELY(x)
Definition utils.hpp:47