16 std::vector<uint8_t> bytes_;
17 size_t container_depth_budget_;
21 : container_depth_budget_(max_container_depth)
24 void serialize_str(
const std::string& value);
26 void serialize_bool(
bool value);
27 void serialize_unit();
28 void serialize_char(
char32_t value);
29 void serialize_f32(
float value);
30 void serialize_f64(
double value);
32 void serialize_u8(uint8_t value);
33 void serialize_u16(uint16_t value);
34 void serialize_u32(uint32_t value);
35 void serialize_u64(uint64_t value);
36 void serialize_u128(
const uint128_t& value);
38 void serialize_i8(int8_t value);
39 void serialize_i16(int16_t value);
40 void serialize_i32(int32_t value);
41 void serialize_i64(int64_t value);
42 void serialize_i128(
const int128_t& value);
43 void serialize_option_tag(
bool value);
45 size_t get_buffer_offset();
46 void increase_container_depth();
47 void decrease_container_depth();
49 std::vector<uint8_t> bytes() && {
return std::move(bytes_); }
54 size_t container_depth_budget_;
57 std::vector<uint8_t> bytes_;
63 , container_depth_budget_(max_container_depth)
64 , bytes_(std::move(bytes))
67 std::string deserialize_str();
69 bool deserialize_bool();
70 std::monostate deserialize_unit();
71 char32_t deserialize_char();
72 float deserialize_f32();
73 double deserialize_f64();
75 uint8_t deserialize_u8();
76 uint16_t deserialize_u16();
77 uint32_t deserialize_u32();
78 uint64_t deserialize_u64();
81 int8_t deserialize_i8();
82 int16_t deserialize_i16();
83 int32_t deserialize_i32();
84 int64_t deserialize_i64();
87 bool deserialize_option_tag();
89 size_t get_buffer_offset();
90 void increase_container_depth();
91 void decrease_container_depth();
96 static_cast<S*
>(
this)->serialize_len(value.size());
97 for (
auto c : value) {
102template <
class S>
void BinarySerializer<S>::serialize_unit() {}
104template <
class S>
void BinarySerializer<S>::serialize_f32(
float)
106 throw_or_abort(
"not implemented");
109template <
class S>
void BinarySerializer<S>::serialize_f64(
double)
111 throw_or_abort(
"not implemented");
114template <
class S>
void BinarySerializer<S>::serialize_char(
char32_t)
116 throw_or_abort(
"not implemented");
119template <
class S>
void BinarySerializer<S>::serialize_bool(
bool value)
121 bytes_.push_back((uint8_t)value);
124template <
class S>
void BinarySerializer<S>::serialize_u8(uint8_t value)
126 bytes_.push_back(value);
129template <
class S>
void BinarySerializer<S>::serialize_u16(uint16_t value)
131 bytes_.push_back((uint8_t)value);
132 bytes_.push_back((uint8_t)(value >> 8));
135template <
class S>
void BinarySerializer<S>::serialize_u32(uint32_t value)
137 bytes_.push_back((uint8_t)value);
138 bytes_.push_back((uint8_t)(value >> 8));
139 bytes_.push_back((uint8_t)(value >> 16));
140 bytes_.push_back((uint8_t)(value >> 24));
143template <
class S>
void BinarySerializer<S>::serialize_u64(uint64_t value)
145 bytes_.push_back((uint8_t)value);
146 bytes_.push_back((uint8_t)(value >> 8));
147 bytes_.push_back((uint8_t)(value >> 16));
148 bytes_.push_back((uint8_t)(value >> 24));
149 bytes_.push_back((uint8_t)(value >> 32));
150 bytes_.push_back((uint8_t)(value >> 40));
151 bytes_.push_back((uint8_t)(value >> 48));
152 bytes_.push_back((uint8_t)(value >> 56));
155template <
class S>
void BinarySerializer<S>::serialize_u128(
const uint128_t& value)
157 serialize_u64(value.low);
158 serialize_u64(value.high);
161template <
class S>
void BinarySerializer<S>::serialize_i8(int8_t value)
163 serialize_u8((uint8_t)value);
166template <
class S>
void BinarySerializer<S>::serialize_i16(int16_t value)
168 serialize_u16((uint16_t)value);
171template <
class S>
void BinarySerializer<S>::serialize_i32(int32_t value)
173 serialize_u32((uint32_t)value);
176template <
class S>
void BinarySerializer<S>::serialize_i64(int64_t value)
178 serialize_u64((uint64_t)value);
181template <
class S>
void BinarySerializer<S>::serialize_i128(
const int128_t& value)
183 serialize_u64(value.low);
184 serialize_i64(value.high);
187template <
class S>
void BinarySerializer<S>::serialize_option_tag(
bool value)
189 serialize_bool(value);
192template <
class S>
size_t BinarySerializer<S>::get_buffer_offset()
194 return bytes_.size();
197template <
class S>
void BinarySerializer<S>::increase_container_depth()
199 if (container_depth_budget_ == 0) {
200 throw_or_abort(
"Too many nested containers");
202 container_depth_budget_--;
205template <
class S>
void BinarySerializer<S>::decrease_container_depth()
207 container_depth_budget_++;
210template <
class D> uint8_t BinaryDeserializer<D>::read_byte()
212 if (pos_ >= bytes_.size()) {
213 throw_or_abort(
"Input is not large enough");
215 return bytes_.at(pos_++);
218inline bool is_valid_utf8(
const std::string& input)
220 uint8_t trailing_digits = 0;
221 for (
char byte : input) {
222 if (trailing_digits == 0) {
224 if (
byte >> 7 == 0) {
226 }
else if (
byte >> 5 == 0b110) {
229 }
else if (
byte >> 4 == 0b1110) {
232 }
else if (
byte >> 3 == 0b11110) {
240 if (
byte >> 6 != 0b10) {
243 trailing_digits -= 1;
246 return trailing_digits == 0;
249template <
class D> std::string BinaryDeserializer<D>::deserialize_str()
251 auto len =
static_cast<D*
>(
this)->deserialize_len();
254 for (
size_t i = 0; i < len; i++) {
255 result.push_back(read_byte());
257 if (!is_valid_utf8(result)) {
258 throw_or_abort(
"Invalid UTF8 string: " + result);
263template <
class D> std::monostate BinaryDeserializer<D>::deserialize_unit()
268template <
class D>
float BinaryDeserializer<D>::deserialize_f32()
270 throw_or_abort(
"not implemented");
273template <
class D>
double BinaryDeserializer<D>::deserialize_f64()
275 throw_or_abort(
"not implemented");
278template <
class D>
char32_t BinaryDeserializer<D>::deserialize_char()
280 throw_or_abort(
"not implemented");
283template <
class D>
bool BinaryDeserializer<D>::deserialize_bool()
285 switch (read_byte()) {
291 throw_or_abort(
"Invalid boolean value");
295template <
class D> uint8_t BinaryDeserializer<D>::deserialize_u8()
300template <
class D> uint16_t BinaryDeserializer<D>::deserialize_u16()
303 val |= (uint16_t)read_byte();
304 val |= (uint16_t)read_byte() << 8;
308template <
class D> uint32_t BinaryDeserializer<D>::deserialize_u32()
311 val |= (uint32_t)read_byte();
312 val |= (uint32_t)read_byte() << 8;
313 val |= (uint32_t)read_byte() << 16;
314 val |= (uint32_t)read_byte() << 24;
318template <
class D> uint64_t BinaryDeserializer<D>::deserialize_u64()
321 val |= (uint64_t)read_byte();
322 val |= (uint64_t)read_byte() << 8;
323 val |= (uint64_t)read_byte() << 16;
324 val |= (uint64_t)read_byte() << 24;
325 val |= (uint64_t)read_byte() << 32;
326 val |= (uint64_t)read_byte() << 40;
327 val |= (uint64_t)read_byte() << 48;
328 val |= (uint64_t)read_byte() << 56;
332template <
class D> uint128_t BinaryDeserializer<D>::deserialize_u128()
335 result.low = deserialize_u64();
336 result.high = deserialize_u64();
340template <
class D> int8_t BinaryDeserializer<D>::deserialize_i8()
342 return (int8_t)deserialize_u8();
345template <
class D> int16_t BinaryDeserializer<D>::deserialize_i16()
347 return (int16_t)deserialize_u16();
350template <
class D> int32_t BinaryDeserializer<D>::deserialize_i32()
352 return (int32_t)deserialize_u32();
355template <
class D> int64_t BinaryDeserializer<D>::deserialize_i64()
357 return (int64_t)deserialize_u64();
360template <
class D> int128_t BinaryDeserializer<D>::deserialize_i128()
363 result.low = deserialize_u64();
364 result.high = deserialize_i64();
368template <
class D>
bool BinaryDeserializer<D>::deserialize_option_tag()
370 return deserialize_bool();
373template <
class D>
size_t BinaryDeserializer<D>::get_buffer_offset()
378template <
class S>
void BinaryDeserializer<S>::increase_container_depth()
380 if (container_depth_budget_ == 0) {
381 throw_or_abort(
"Too many nested containers");
383 container_depth_budget_--;
386template <
class S>
void BinaryDeserializer<S>::decrease_container_depth()
388 container_depth_budget_++;
Definition: binary.hpp:52
Definition: binary.hpp:14