88 constexpr auto nil_byte =
static_cast<unsigned char>(0xC0);
105 constexpr auto false_byte =
static_cast<unsigned char>(0xC2);
106 constexpr auto true_byte =
static_cast<unsigned char>(0xC3);
135 put(
static_cast<unsigned char>(value));
147 put(
static_cast<unsigned char>(value));
156 constexpr auto prefix =
static_cast<unsigned char>(0xCC);
166 constexpr auto prefix =
static_cast<unsigned char>(0xCD);
176 constexpr auto prefix =
static_cast<unsigned char>(0xCE);
186 constexpr auto prefix =
static_cast<unsigned char>(0xCF);
196 constexpr auto prefix =
static_cast<unsigned char>(0xD0);
206 constexpr auto prefix =
static_cast<unsigned char>(0xD1);
216 constexpr auto prefix =
static_cast<unsigned char>(0xD2);
226 constexpr auto prefix =
static_cast<unsigned char>(0xD3);
243 static_assert(std::numeric_limits<float>::is_iec559,
244 "IEEE 754 single precision floating point number is required.");
245 static_assert(
sizeof(float) == 4U,
246 "IEEE 754 single precision floating point number is required.");
248 constexpr auto prefix =
static_cast<unsigned char>(0xCA);
258 static_assert(std::numeric_limits<double>::is_iec559,
259 "IEEE 754 double precision floating point number is required.");
261 static_assert(
sizeof(double) == 8U,
262 "IEEE 754 double precision floating point number is required.");
264 constexpr auto prefix =
static_cast<unsigned char>(0xCB);
287 constexpr auto prefix =
static_cast<unsigned char>(0xA0);
297 constexpr auto prefix =
static_cast<unsigned char>(0xD9);
307 constexpr auto prefix =
static_cast<unsigned char>(0xDA);
317 constexpr auto prefix =
static_cast<unsigned char>(0xDB);
327 constexpr auto max_fixstr_size =
static_cast<std::size_t
>(0b11111U);
328 constexpr auto max_str8_size =
static_cast<std::size_t
>(0xFF);
329 constexpr auto max_str16_size =
static_cast<std::size_t
>(0xFFFF);
331 if (size <= max_str8_size) {
332 if (size <= max_fixstr_size) {
341 if (size <= max_str16_size) {
346 if constexpr (
sizeof(std::size_t) > 4U) {
347 constexpr auto max_str32_size =
348 static_cast<std::size_t
>(0xFFFFFFFF);
349 if (size > max_str32_size) {
350 throw std::runtime_error(
"Size is too large.");
373 constexpr auto prefix =
static_cast<unsigned char>(0xC4);
383 constexpr auto prefix =
static_cast<unsigned char>(0xC5);
393 constexpr auto prefix =
static_cast<unsigned char>(0xC6);
403 constexpr auto max_bin8_size =
static_cast<std::size_t
>(0xFF);
404 constexpr auto max_bin16_size =
static_cast<std::size_t
>(0xFFFF);
406 if (size <= max_bin8_size) {
411 if (size <= max_bin16_size) {
416 if constexpr (
sizeof(std::size_t) > 4U) {
417 constexpr auto max_bin32_size =
418 static_cast<std::size_t
>(0xFFFFFFFF);
419 if (size > max_bin32_size) {
420 throw std::runtime_error(
"Size is too large.");
445 constexpr auto prefix =
static_cast<unsigned char>(0x90);
455 constexpr auto prefix =
static_cast<unsigned char>(0xDC);
465 constexpr auto prefix =
static_cast<unsigned char>(0xDD);
475 constexpr auto fixarray_mask = ~static_cast<std::size_t>(15);
476 if ((size & fixarray_mask) ==
static_cast<std::size_t
>(0)) {
481 constexpr auto array16_mask = ~static_cast<std::size_t>(0xFFFF);
482 if ((size & array16_mask) ==
static_cast<std::size_t
>(0)) {
487 if constexpr (
sizeof(std::size_t) > 4U) {
488 constexpr auto array32_mask = ~static_cast<std::size_t>(0xFFFFFFFF);
489 if ((size & array32_mask) !=
static_cast<std::size_t
>(0)) {
490 throw std::runtime_error(
"Size is too large.");
515 constexpr auto prefix =
static_cast<unsigned char>(0x80);
525 constexpr auto prefix =
static_cast<unsigned char>(0xDE);
535 constexpr auto prefix =
static_cast<unsigned char>(0xDF);
545 constexpr auto fixmap_mask = ~static_cast<std::size_t>(15);
546 if ((size & fixmap_mask) ==
static_cast<std::size_t
>(0)) {
551 constexpr auto map16_mask = ~static_cast<std::size_t>(0xFFFF);
552 if ((size & map16_mask) ==
static_cast<std::size_t
>(0)) {
557 if constexpr (
sizeof(std::size_t) > 4U) {
558 constexpr auto map32_mask = ~static_cast<std::size_t>(0xFFFFFFFF);
559 if ((size & map32_mask) !=
static_cast<std::size_t
>(0)) {
560 throw std::runtime_error(
"Size is too large.");
586 constexpr auto prefix =
static_cast<unsigned char>(0xD4);
599 constexpr auto prefix =
static_cast<unsigned char>(0xD5);
612 constexpr auto prefix =
static_cast<unsigned char>(0xD6);
625 constexpr auto prefix =
static_cast<unsigned char>(0xD7);
638 constexpr auto prefix =
static_cast<unsigned char>(0xD8);
651 constexpr auto prefix =
static_cast<unsigned char>(0xC7);
665 constexpr auto prefix =
static_cast<unsigned char>(0xC8);
679 constexpr auto prefix =
static_cast<unsigned char>(0xC9);
692 constexpr auto ext8_data_size_mask = ~static_cast<std::size_t>(0xFF);
693 if ((data_size & ext8_data_size_mask) ==
static_cast<std::size_t
>(0)) {
694 constexpr auto fixext1_data_size =
static_cast<std::size_t
>(1);
695 constexpr auto fixext2_data_size =
static_cast<std::size_t
>(2);
696 constexpr auto fixext4_data_size =
static_cast<std::size_t
>(4);
697 constexpr auto fixext8_data_size =
static_cast<std::size_t
>(8);
698 constexpr auto fixext16_data_size =
static_cast<std::size_t
>(16);
700 case fixext1_data_size:
703 case fixext2_data_size:
706 case fixext4_data_size:
709 case fixext8_data_size:
712 case fixext16_data_size:
717 ext_type,
static_cast<std::uint8_t
>(data_size));
722 constexpr auto ext16_data_size_mask = ~static_cast<std::size_t>(0xFFFF);
723 if ((data_size & ext16_data_size_mask) ==
static_cast<std::size_t
>(0)) {
725 ext_type,
static_cast<std::uint16_t
>(data_size));
729 if constexpr (
sizeof(std::size_t) > 4U) {
730 constexpr auto ext32_data_size_mask =
731 ~static_cast<std::size_t>(0xFFFFFFFF);
732 if ((data_size & ext32_data_size_mask) !=
733 static_cast<std::size_t
>(0)) {
734 throw std::runtime_error(
"Size is too large.");
757 template <
typename T>
778 void write(
const unsigned char* data, std::size_t size) {
795 template <
typename... T>
797 buffer_.write_in_big_endian(values...);
Interface of streams to write data.
Class of buffers to serialize data.
void serialize_fixstr_size(std::uint8_t size)
Serialize a size of fixstr format.
void serialize(const T &data)
Serialize data.
void flush()
Flush the internal buffer in this instance.
void serialize_array32_size(std::uint32_t size)
Serialize a size of array 32 format.
~serialization_buffer() noexcept
Destructor.
void serialize_ext32_header(std::int8_t ext_type, std::uint32_t data_size)
Serialize the size and type of an extension value in ext 32 format.
void serialize_int16(std::int16_t value)
Serialize a value in int 16 format.
void serialize_fixext8_header(std::int8_t ext_type)
Serialize the size and type of an extension value in fixext 8 format.
void write_in_big_endian(T... values)
Write values in big endian.
void serialize_fixext2_header(std::int8_t ext_type)
Serialize the size and type of an extension value in fixext 2 format.
void serialize_fixext16_header(std::int8_t ext_type)
Serialize the size and type of an extension value in fixext 16 format.
void serialize_bin_size(std::size_t size)
Serialize a size of a binary.
void serialize_uint16(std::uint16_t value)
Serialize a value in uint 16 format.
details::serialization_buffer_impl buffer_
Instance to perform internal processing.
void write(const unsigned char *data, std::size_t size)
Write data.
void serialize_array_size(std::size_t size)
Serialize a size of an array.
void serialize_str16_size(std::uint16_t size)
Serialize a size of str 16 format.
void serialize_uint8(std::uint8_t value)
Serialize a value in uint 8 format.
void serialize_fixarray_size(std::uint8_t size)
Serialize a size of fixarray format.
void serialize_bin32_size(std::uint32_t size)
Serialize a size of bin 32 format.
void serialize_map32_size(std::uint32_t size)
Serialize a size of map 32 format.
void serialize_positive_fixint(std::uint8_t value)
Serialize a value in positive fixint format.
void serialize_fixext1_header(std::int8_t ext_type)
Serialize the size and type of an extension value in fixext 1 format.
void serialize_negative_fixint(std::int8_t value)
Serialize a value in negative fixint format.
void serialize_bin8_size(std::uint8_t size)
Serialize a size of bin 8 format.
void serialize_ext_header(std::int8_t ext_type, std::size_t data_size)
Serialize the size and type of an extension value.
void serialize_float64(double value)
Serialize a value in float 64 format.
void serialize_bool(bool value)
Serialize a boolean value.
void serialize_int64(std::int64_t value)
Serialize a value in int 64 format.
void serialize_nil()
Serialize a nli value.
void serialize_uint32(std::uint32_t value)
Serialize a value in uint 32 format.
void serialize_ext16_header(std::int8_t ext_type, std::uint16_t data_size)
Serialize the size and type of an extension value in ext 16 format.
void serialize_array16_size(std::uint16_t size)
Serialize a size of array 16 format.
void serialize_uint64(std::uint64_t value)
Serialize a value in uint 64 format.
void serialize_int32(std::int32_t value)
Serialize a value in int 32 format.
void put(unsigned char data)
Write a byte of data.
void serialize_map_size(std::size_t size)
Serialize a size of a map.
void serialize_fixext4_header(std::int8_t ext_type)
Serialize the size and type of an extension value in fixext 4 format.
void serialize_fixmap_size(std::uint8_t size)
Serialize a size of fixmap format.
serialization_buffer(output_stream &stream)
Constructor.
void serialize_str_size(std::size_t size)
Serialize a size of a string.
void serialize_ext8_header(std::int8_t ext_type, std::uint8_t data_size)
Serialize the size and type of an extension value in ext 8 format.
void serialize_float32(float value)
Serialize a value in float 32 format.
void serialize_str32_size(std::uint32_t size)
Serialize a size of str 32 format.
void serialize_str8_size(std::uint8_t size)
Serialize a size of str 8 format.
void serialize_int8(std::int8_t value)
Serialize a value in int 8 format.
void serialize_bin16_size(std::uint16_t size)
Serialize a size of bin 16 format.
void serialize_map16_size(std::uint16_t size)
Serialize a size of map 16 format.
Forward declaration of classes to support serialization of data types.
non_buffered_serialization_buffer_impl serialization_buffer_impl
Type of internal implementation of serialization_buffer class.
Namespace of this project.
Definition of output_stream class.
Forward declaration of serialization_buffer class.
Definition of serialization_buffer_impl alias.
Class to define functions to serialize data of various types.