25#ifndef __JOIN_SAX_HPP__
26#define __JOIN_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 ())
344 for (
auto const& element : array)
360 for (
auto const& member :
object)
382 inline void append2 (
const char* data)
noexcept
384 _out->sputc (data[0]);
385 _out->sputc (data[1]);
392 inline void append3 (
const char* data)
noexcept
394 _out->sputc (data[0]);
395 _out->sputc (data[1]);
396 _out->sputc (data[2]);
403 inline void append4 (
const char* data)
noexcept
405 _out->sputc (data[0]);
406 _out->sputc (data[1]);
407 _out->sputc (data[2]);
408 _out->sputc (data[3]);
415 inline void append5 (
const char* data)
noexcept
417 _out->sputc (data[0]);
418 _out->sputc (data[1]);
419 _out->sputc (data[2]);
420 _out->sputc (data[3]);
421 _out->sputc (data[4]);
429 inline void append (
const char* data, uint32_t size)
noexcept
431 _out->sputn (data, size);
492 virtual int deserialize (
const char* document,
size_t length) = 0;
500 virtual int deserialize (
const char* first,
const char* last) = 0;
558 return setValue (
Value (in_place_index_t <Value::Null> {},
nullptr));
568 return setValue (
Value (in_place_index_t <Value::Boolean> {}, value));
576 virtual int setInt (int32_t value)
override
578 return setValue (
Value (in_place_index_t <Value::Integer> {}, value));
588 return setValue (
Value (in_place_index_t <Value::Unsigned> {}, value));
598 return setValue (
Value (in_place_index_t <Value::Integer64> {}, value));
608 return setValue (
Value (in_place_index_t <Value::Unsigned64> {}, value));
618 return setValue (
Value (in_place_index_t <Value::Real> {}, value));
626 virtual int setString (
const std::string& value)
override
628 return setValue (
Value (in_place_index_t <Value::String> {}, value));
639 array.reserve (size ? size : 8);
643 _root = std::move (array);
658 _stack.push (&parent->
insert ({std::move (_curkey), std::move (array)}));
690 object.reserve (size ? size : 8);
694 _root = std::move (
object);
709 _stack.push (&parent->
insert ({std::move (_curkey), std::move (object)}));
765 parent->
pushBack (std::move (value));
788 template <>
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 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 setKey(const std::string &key)=0
set key.
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:443
virtual int stopObject() override
stop object.
Definition sax.hpp:734
virtual int startArray(uint32_t size=0) override
start array.
Definition sax.hpp:636
virtual int deserialize(std::ifstream &document)=0
deserialize a document.
StreamReader(Value &root)
default constructor.
Definition sax.hpp:449
virtual int setInt64(int64_t value) override
set 64 bits integer value.
Definition sax.hpp:596
virtual int setUint(uint32_t value) override
set unsigned integer value.
Definition sax.hpp:586
virtual int deserialize(std::istringstream &document)=0
deserialize a document.
StreamReader(StreamReader &&other)=delete
move constructor.
std::stack< Value * > _stack
stack.
Definition sax.hpp:775
virtual int setNull() override
set null value.
Definition sax.hpp:556
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:749
virtual int deserialize(const char *document, size_t length)=0
deserialize a document.
static constexpr size_t _maxdepth
max stack depth.
Definition sax.hpp:772
virtual int setUint64(uint64_t value) override
set unsigned 64 bits integer value.
Definition sax.hpp:606
virtual int deserialize(const char *first, const char *last)=0
deserialize a document.
virtual int deserialize(std::stringstream &document)=0
deserialize a document.
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.
virtual int setKey(const std::string &key) override
set key.
Definition sax.hpp:724
StreamReader & operator=(const StreamReader &other)=delete
copy assignment.
virtual int setInt(int32_t value) override
set integer value.
Definition sax.hpp:576
virtual int startObject(uint32_t size=0) override
start object.
Definition sax.hpp:687
virtual int setBool(bool value) override
set boolean value.
Definition sax.hpp:566
virtual int stopArray() override
stop array.
Definition sax.hpp:672
Value & _root
root.
Definition sax.hpp:781
virtual int setDouble(double value) override
set real value.
Definition sax.hpp:616
virtual int setString(const std::string &value) override
set string value.
Definition sax.hpp:626
virtual ~StreamReader()=default
destroy instance.
std::string _curkey
current key.
Definition sax.hpp:778
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:429
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:436
virtual int setObject(const Object &object)
set object value.
Definition sax.hpp:357
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:392
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:373
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:415
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:403
void append2(const char *data) noexcept
append 2-character literal to output stream in batch.
Definition sax.hpp:382
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:1299
Value & insert(const Member &member)
insert element in the nested container.
Definition value.hpp:1236
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:584
constexpr std::size_t index() const noexcept
return the index of the alternative that is currently held by the variant.
Definition variant.hpp:704
const std::string key(65, 'a')
key.
Definition acceptor.hpp:32
std::error_code make_error_code(join::Errc code)
Create an std::error_code object.
Definition error.cpp:154
const std::error_category & saxCategory() noexcept
get error category.
Definition sax.cpp:65
SaxErrc
SAX API generic error codes.
Definition sax.hpp:55
std::vector< Value > Array
array.
Definition value.hpp:51
std::vector< Member > Object
object.
Definition value.hpp:57
thread_local std::error_code lastError
last error.
Definition error.cpp:32
std::error_condition make_error_condition(join::Errc code)
Create an std::error_condition object.
Definition error.cpp:163
#define JOIN_LIKELY(x)
Definition utils.hpp:46
#define JOIN_UNLIKELY(x)
Definition utils.hpp:47