9 #include <nlohmann/detail/input/binary_reader.hpp>
10 #include <nlohmann/detail/output/output_adapters.hpp>
23 template<
typename BasicJsonType,
typename CharType>
46 oa->write_character(static_cast<CharType>(0xF6));
52 oa->write_character(j.m_value.boolean
53 ? static_cast<CharType>(0xF5)
54 : static_cast<CharType>(0xF4));
60 if (j.m_value.number_integer >= 0)
65 if (j.m_value.number_integer <= 0x17)
67 write_number(static_cast<uint8_t>(j.m_value.number_integer));
69 else if (j.m_value.number_integer <= (std::numeric_limits<uint8_t>::max)())
71 oa->write_character(static_cast<CharType>(0x18));
72 write_number(static_cast<uint8_t>(j.m_value.number_integer));
74 else if (j.m_value.number_integer <= (std::numeric_limits<uint16_t>::max)())
76 oa->write_character(static_cast<CharType>(0x19));
77 write_number(static_cast<uint16_t>(j.m_value.number_integer));
79 else if (j.m_value.number_integer <= (std::numeric_limits<uint32_t>::max)())
81 oa->write_character(static_cast<CharType>(0x1A));
82 write_number(static_cast<uint32_t>(j.m_value.number_integer));
86 oa->write_character(static_cast<CharType>(0x1B));
87 write_number(static_cast<uint64_t>(j.m_value.number_integer));
94 const auto positive_number = -1 - j.m_value.number_integer;
95 if (j.m_value.number_integer >= -24)
97 write_number(static_cast<uint8_t>(0x20 + positive_number));
99 else if (positive_number <= (std::numeric_limits<uint8_t>::max)())
101 oa->write_character(static_cast<CharType>(0x38));
102 write_number(static_cast<uint8_t>(positive_number));
104 else if (positive_number <= (std::numeric_limits<uint16_t>::max)())
106 oa->write_character(static_cast<CharType>(0x39));
107 write_number(static_cast<uint16_t>(positive_number));
109 else if (positive_number <= (std::numeric_limits<uint32_t>::max)())
111 oa->write_character(static_cast<CharType>(0x3A));
112 write_number(static_cast<uint32_t>(positive_number));
116 oa->write_character(static_cast<CharType>(0x3B));
117 write_number(static_cast<uint64_t>(positive_number));
125 if (j.m_value.number_unsigned <= 0x17)
127 write_number(static_cast<uint8_t>(j.m_value.number_unsigned));
129 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint8_t>::max)())
131 oa->write_character(static_cast<CharType>(0x18));
132 write_number(static_cast<uint8_t>(j.m_value.number_unsigned));
134 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint16_t>::max)())
136 oa->write_character(static_cast<CharType>(0x19));
137 write_number(static_cast<uint16_t>(j.m_value.number_unsigned));
139 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint32_t>::max)())
141 oa->write_character(static_cast<CharType>(0x1A));
142 write_number(static_cast<uint32_t>(j.m_value.number_unsigned));
146 oa->write_character(static_cast<CharType>(0x1B));
147 write_number(static_cast<uint64_t>(j.m_value.number_unsigned));
154 oa->write_character(static_cast<CharType>(0xFB));
155 write_number(j.m_value.number_float);
162 const auto N = j.m_value.string->size();
165 write_number(static_cast<uint8_t>(0x60 + N));
167 else if (N <= (std::numeric_limits<uint8_t>::max)())
169 oa->write_character(static_cast<CharType>(0x78));
170 write_number(static_cast<uint8_t>(N));
172 else if (N <= (std::numeric_limits<uint16_t>::max)())
174 oa->write_character(static_cast<CharType>(0x79));
175 write_number(static_cast<uint16_t>(N));
177 else if (N <= (std::numeric_limits<uint32_t>::max)())
179 oa->write_character(static_cast<CharType>(0x7A));
180 write_number(static_cast<uint32_t>(N));
183 else if (N <= (std::numeric_limits<uint64_t>::max)())
185 oa->write_character(static_cast<CharType>(0x7B));
186 write_number(static_cast<uint64_t>(N));
191 oa->write_characters(
192 reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
193 j.m_value.string->size());
200 const auto N = j.m_value.array->size();
203 write_number(static_cast<uint8_t>(0x80 + N));
205 else if (N <= (std::numeric_limits<uint8_t>::max)())
207 oa->write_character(static_cast<CharType>(0x98));
208 write_number(static_cast<uint8_t>(N));
210 else if (N <= (std::numeric_limits<uint16_t>::max)())
212 oa->write_character(static_cast<CharType>(0x99));
213 write_number(static_cast<uint16_t>(N));
215 else if (N <= (std::numeric_limits<uint32_t>::max)())
217 oa->write_character(static_cast<CharType>(0x9A));
218 write_number(static_cast<uint32_t>(N));
221 else if (N <= (std::numeric_limits<uint64_t>::max)())
223 oa->write_character(static_cast<CharType>(0x9B));
224 write_number(static_cast<uint64_t>(N));
229 for (
const auto& el : *j.m_value.array)
239 const auto N = j.m_value.object->size();
242 write_number(static_cast<uint8_t>(0xA0 + N));
244 else if (N <= (std::numeric_limits<uint8_t>::max)())
246 oa->write_character(static_cast<CharType>(0xB8));
247 write_number(static_cast<uint8_t>(N));
249 else if (N <= (std::numeric_limits<uint16_t>::max)())
251 oa->write_character(static_cast<CharType>(0xB9));
252 write_number(static_cast<uint16_t>(N));
254 else if (N <= (std::numeric_limits<uint32_t>::max)())
256 oa->write_character(static_cast<CharType>(0xBA));
257 write_number(static_cast<uint32_t>(N));
260 else if (N <= (std::numeric_limits<uint64_t>::max)())
262 oa->write_character(static_cast<CharType>(0xBB));
263 write_number(static_cast<uint64_t>(N));
268 for (
const auto& el : *j.m_value.object)
290 oa->write_character(static_cast<CharType>(0xC0));
296 oa->write_character(j.m_value.boolean
297 ? static_cast<CharType>(0xC3)
298 : static_cast<CharType>(0xC2));
304 if (j.m_value.number_integer >= 0)
309 if (j.m_value.number_unsigned < 128)
312 write_number(static_cast<uint8_t>(j.m_value.number_integer));
314 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint8_t>::max)())
317 oa->write_character(static_cast<CharType>(0xCC));
318 write_number(static_cast<uint8_t>(j.m_value.number_integer));
320 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint16_t>::max)())
323 oa->write_character(static_cast<CharType>(0xCD));
324 write_number(static_cast<uint16_t>(j.m_value.number_integer));
326 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint32_t>::max)())
329 oa->write_character(static_cast<CharType>(0xCE));
330 write_number(static_cast<uint32_t>(j.m_value.number_integer));
332 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint64_t>::max)())
335 oa->write_character(static_cast<CharType>(0xCF));
336 write_number(static_cast<uint64_t>(j.m_value.number_integer));
341 if (j.m_value.number_integer >= -32)
344 write_number(static_cast<int8_t>(j.m_value.number_integer));
346 else if (j.m_value.number_integer >= (std::numeric_limits<int8_t>::min)() and
347 j.m_value.number_integer <= (std::numeric_limits<int8_t>::max)())
350 oa->write_character(static_cast<CharType>(0xD0));
351 write_number(static_cast<int8_t>(j.m_value.number_integer));
353 else if (j.m_value.number_integer >= (std::numeric_limits<int16_t>::min)() and
354 j.m_value.number_integer <= (std::numeric_limits<int16_t>::max)())
357 oa->write_character(static_cast<CharType>(0xD1));
358 write_number(static_cast<int16_t>(j.m_value.number_integer));
360 else if (j.m_value.number_integer >= (std::numeric_limits<int32_t>::min)() and
361 j.m_value.number_integer <= (std::numeric_limits<int32_t>::max)())
364 oa->write_character(static_cast<CharType>(0xD2));
365 write_number(static_cast<int32_t>(j.m_value.number_integer));
367 else if (j.m_value.number_integer >= (std::numeric_limits<int64_t>::min)() and
368 j.m_value.number_integer <= (std::numeric_limits<int64_t>::max)())
371 oa->write_character(static_cast<CharType>(0xD3));
372 write_number(static_cast<int64_t>(j.m_value.number_integer));
380 if (j.m_value.number_unsigned < 128)
383 write_number(static_cast<uint8_t>(j.m_value.number_integer));
385 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint8_t>::max)())
388 oa->write_character(static_cast<CharType>(0xCC));
389 write_number(static_cast<uint8_t>(j.m_value.number_integer));
391 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint16_t>::max)())
394 oa->write_character(static_cast<CharType>(0xCD));
395 write_number(static_cast<uint16_t>(j.m_value.number_integer));
397 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint32_t>::max)())
400 oa->write_character(static_cast<CharType>(0xCE));
401 write_number(static_cast<uint32_t>(j.m_value.number_integer));
403 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint64_t>::max)())
406 oa->write_character(static_cast<CharType>(0xCF));
407 write_number(static_cast<uint64_t>(j.m_value.number_integer));
414 oa->write_character(static_cast<CharType>(0xCB));
415 write_number(j.m_value.number_float);
422 const auto N = j.m_value.string->size();
426 write_number(static_cast<uint8_t>(0xA0 | N));
428 else if (N <= (std::numeric_limits<uint8_t>::max)())
431 oa->write_character(static_cast<CharType>(0xD9));
432 write_number(static_cast<uint8_t>(N));
434 else if (N <= (std::numeric_limits<uint16_t>::max)())
437 oa->write_character(static_cast<CharType>(0xDA));
438 write_number(static_cast<uint16_t>(N));
440 else if (N <= (std::numeric_limits<uint32_t>::max)())
443 oa->write_character(static_cast<CharType>(0xDB));
444 write_number(static_cast<uint32_t>(N));
448 oa->write_characters(
449 reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
450 j.m_value.string->size());
457 const auto N = j.m_value.array->size();
461 write_number(static_cast<uint8_t>(0x90 | N));
463 else if (N <= (std::numeric_limits<uint16_t>::max)())
466 oa->write_character(static_cast<CharType>(0xDC));
467 write_number(static_cast<uint16_t>(N));
469 else if (N <= (std::numeric_limits<uint32_t>::max)())
472 oa->write_character(static_cast<CharType>(0xDD));
473 write_number(static_cast<uint32_t>(N));
477 for (
const auto& el : *j.m_value.array)
487 const auto N = j.m_value.object->size();
491 write_number(static_cast<uint8_t>(0x80 | (N & 0xF)));
493 else if (N <= (std::numeric_limits<uint16_t>::max)())
496 oa->write_character(static_cast<CharType>(0xDE));
497 write_number(static_cast<uint16_t>(N));
499 else if (N <= (std::numeric_limits<uint32_t>::max)())
502 oa->write_character(static_cast<CharType>(0xDF));
503 write_number(static_cast<uint32_t>(N));
507 for (
const auto& el : *j.m_value.object)
527 const bool use_type,
const bool add_prefix =
true)
535 oa->write_character(static_cast<CharType>(
'Z'));
543 oa->write_character(j.m_value.boolean
544 ? static_cast<CharType>(
'T')
545 : static_cast<CharType>(
'F'));
551 write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix);
557 write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix);
563 write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix);
571 oa->write_character(static_cast<CharType>(
'S'));
573 write_number_with_ubjson_prefix(j.m_value.string->size(),
true);
574 oa->write_characters(
575 reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
576 j.m_value.string->size());
584 oa->write_character(static_cast<CharType>(
'['));
587 bool prefix_required =
true;
588 if (use_type and not j.m_value.array->empty())
591 const char first_prefix = ubjson_prefix(j.front());
592 const bool same_prefix = std::all_of(j.begin() + 1, j.end(),
593 [
this, first_prefix](
const BasicJsonType & v)
595 return ubjson_prefix(v) == first_prefix;
600 prefix_required =
false;
601 oa->write_character(static_cast<CharType>(
'$'));
602 oa->write_character(static_cast<CharType>(first_prefix));
608 oa->write_character(static_cast<CharType>(
'#'));
609 write_number_with_ubjson_prefix(j.m_value.array->size(),
true);
612 for (
const auto& el : *j.m_value.array)
619 oa->write_character(static_cast<CharType>(
']'));
629 oa->write_character(static_cast<CharType>(
'{'));
632 bool prefix_required =
true;
633 if (use_type and not j.m_value.object->empty())
636 const char first_prefix = ubjson_prefix(j.front());
637 const bool same_prefix = std::all_of(j.begin(), j.end(),
638 [
this, first_prefix](
const BasicJsonType & v)
640 return ubjson_prefix(v) == first_prefix;
645 prefix_required =
false;
646 oa->write_character(static_cast<CharType>(
'$'));
647 oa->write_character(static_cast<CharType>(first_prefix));
653 oa->write_character(static_cast<CharType>(
'#'));
654 write_number_with_ubjson_prefix(j.m_value.object->size(),
true);
657 for (
const auto& el : *j.m_value.object)
659 write_number_with_ubjson_prefix(el.first.size(),
true);
660 oa->write_characters(
661 reinterpret_cast<const CharType*>(el.first.c_str()),
663 write_ubjson(el.second, use_count, use_type, prefix_required);
668 oa->write_character(static_cast<CharType>(
'}'));
690 template<
typename NumberType>
691 void write_number(
const NumberType n)
695 std::memcpy(vec.data(), &n,
sizeof(NumberType));
698 if (is_little_endian)
701 std::reverse(vec.begin(), vec.end());
704 oa->write_characters(vec.data(),
sizeof(NumberType));
707 template<
typename NumberType>
708 void write_number_with_ubjson_prefix(
const NumberType n,
709 const bool add_prefix)
711 if (std::is_floating_point<NumberType>::value)
715 oa->write_character(static_cast<CharType>(
'D'));
719 else if (std::is_unsigned<NumberType>::value)
721 if (n <= (std::numeric_limits<int8_t>::max)())
725 oa->write_character(static_cast<CharType>(
'i'));
727 write_number(static_cast<uint8_t>(n));
729 else if (n <= (std::numeric_limits<uint8_t>::max)())
733 oa->write_character(static_cast<CharType>(
'U'));
735 write_number(static_cast<uint8_t>(n));
737 else if (n <= (std::numeric_limits<int16_t>::max)())
741 oa->write_character(static_cast<CharType>(
'I'));
743 write_number(static_cast<int16_t>(n));
745 else if (n <= (std::numeric_limits<int32_t>::max)())
749 oa->write_character(static_cast<CharType>(
'l'));
751 write_number(static_cast<int32_t>(n));
753 else if (n <= (std::numeric_limits<int64_t>::max)())
757 oa->write_character(static_cast<CharType>(
'L'));
759 write_number(static_cast<int64_t>(n));
763 JSON_THROW(out_of_range::create(407,
"number overflow serializing " + std::to_string(n)));
768 if ((std::numeric_limits<int8_t>::min)() <= n and n <= (std::numeric_limits<int8_t>::max)())
772 oa->write_character(static_cast<CharType>(
'i'));
774 write_number(static_cast<int8_t>(n));
776 else if ((std::numeric_limits<uint8_t>::min)() <= n and n <= (std::numeric_limits<uint8_t>::max)())
780 oa->write_character(static_cast<CharType>(
'U'));
782 write_number(static_cast<uint8_t>(n));
784 else if ((std::numeric_limits<int16_t>::min)() <= n and n <= (std::numeric_limits<int16_t>::max)())
788 oa->write_character(static_cast<CharType>(
'I'));
790 write_number(static_cast<int16_t>(n));
792 else if ((std::numeric_limits<int32_t>::min)() <= n and n <= (std::numeric_limits<int32_t>::max)())
796 oa->write_character(static_cast<CharType>(
'l'));
798 write_number(static_cast<int32_t>(n));
800 else if ((std::numeric_limits<int64_t>::min)() <= n and n <= (std::numeric_limits<int64_t>::max)())
804 oa->write_character(static_cast<CharType>(
'L'));
806 write_number(static_cast<int64_t>(n));
811 JSON_THROW(out_of_range::create(407,
"number overflow serializing " + std::to_string(n)));
826 char ubjson_prefix(
const BasicJsonType& j)
const noexcept
834 return j.m_value.boolean ?
'T' :
'F';
838 if ((std::numeric_limits<int8_t>::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits<int8_t>::max)())
842 else if ((std::numeric_limits<uint8_t>::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits<uint8_t>::max)())
846 else if ((std::numeric_limits<int16_t>::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits<int16_t>::max)())
850 else if ((std::numeric_limits<int32_t>::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits<int32_t>::max)())
862 if (j.m_value.number_unsigned <= (std::numeric_limits<int8_t>::max)())
866 else if (j.m_value.number_unsigned <= (std::numeric_limits<uint8_t>::max)())
870 else if (j.m_value.number_unsigned <= (std::numeric_limits<int16_t>::max)())
874 else if (j.m_value.number_unsigned <= (std::numeric_limits<int32_t>::max)())
906 output_adapter_t<CharType> oa =
nullptr;