96 static_cast<S*
>(
this)->serialize_len(
value.size());
97 for (
auto c :
value) {
121 bytes_.push_back((uint8_t)
value);
126 bytes_.push_back(
value);
131 bytes_.push_back((uint8_t)
value);
132 bytes_.push_back((uint8_t)(
value >> 8));
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));
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));
157 serialize_u64(
value.low);
158 serialize_u64(
value.high);
163 serialize_u8((uint8_t)
value);
168 serialize_u16((uint16_t)
value);
173 serialize_u32((uint32_t)
value);
178 serialize_u64((uint64_t)
value);
183 serialize_u64(
value.low);
184 serialize_i64(
value.high);
189 serialize_bool(
value);
194 return bytes_.size();
199 if (container_depth_budget_ == 0) {
202 container_depth_budget_--;
207 container_depth_budget_++;
212 if (pos_ >= bytes_.size()) {
215 return bytes_.at(pos_++);
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;
251 auto len =
static_cast<D*
>(
this)->deserialize_len();
254 for (
size_t i = 0; i <
len; i++) {
255 result.push_back(read_byte());
285 switch (read_byte()) {
303 val |= (uint16_t)read_byte();
304 val |= (uint16_t)read_byte() << 8;
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;
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;
335 result.
low = deserialize_u64();
336 result.
high = deserialize_u64();
342 return (int8_t)deserialize_u8();
347 return (int16_t)deserialize_u16();
352 return (int32_t)deserialize_u32();
357 return (int64_t)deserialize_u64();
363 result.
low = deserialize_u64();
364 result.
high = deserialize_i64();
370 return deserialize_bool();
380 if (container_depth_budget_ == 0) {
383 container_depth_budget_--;
388 container_depth_budget_++;
uint64_t deserialize_u64()
void decrease_container_depth()
uint128_t deserialize_u128()
void increase_container_depth()
std::vector< uint8_t > bytes_
size_t container_depth_budget_
int64_t deserialize_i64()
std::string deserialize_str()
bool deserialize_option_tag()
std::monostate deserialize_unit()
int32_t deserialize_i32()
size_t get_buffer_offset()
uint32_t deserialize_u32()
int16_t deserialize_i16()
int128_t deserialize_i128()
BinaryDeserializer(std::vector< uint8_t > bytes, size_t max_container_depth)
char32_t deserialize_char()
uint16_t deserialize_u16()
void serialize_char(char32_t value)
void serialize_str(const std::string &value)
void serialize_i128(const int128_t &value)
void serialize_option_tag(bool value)
void serialize_i16(int16_t value)
void serialize_u64(uint64_t value)
BinarySerializer(size_t max_container_depth)
std::vector< uint8_t > bytes() &&
void serialize_i32(int32_t value)
void serialize_i8(int8_t value)
size_t get_buffer_offset()
std::vector< uint8_t > bytes_
void serialize_u16(uint16_t value)
void serialize_u32(uint32_t value)
void serialize_f32(float value)
void serialize_u8(uint8_t value)
size_t container_depth_budget_
void decrease_container_depth()
void serialize_f64(double value)
void serialize_bool(bool value)
void serialize_u128(const uint128_t &value)
void serialize_i64(int64_t value)
void increase_container_depth()
bool is_valid_utf8(const std::string &input)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
void throw_or_abort(std::string const &err)