♻️ adjust negative integer representation

This commit is contained in:
Niels Lohmann 2021-09-11 13:50:54 +02:00
parent d798ca24aa
commit 6bfd21e321
No known key found for this signature in database
GPG Key ID: 7F3CEA63AE251B69
3 changed files with 44 additions and 44 deletions

View File

@ -1723,40 +1723,40 @@ class binary_writer
oa->write_character(to_char_type(0x8D)); oa->write_character(to_char_type(0x8D));
write_number(static_cast<std::int64_t>(value)); write_number(static_cast<std::int64_t>(value));
} }
else if (value < -33554432 || value > 67637031) else if (value < -33818506 || value > 67637031)
{ {
// 32 bit integers // 32 bit integers
oa->write_character(to_char_type(0x8C)); oa->write_character(to_char_type(0x8C));
write_number(static_cast<std::int32_t>(value)); write_number(static_cast<std::int32_t>(value));
} }
else if (value < -262144) else if (value <= -264075)
{ {
JSON_ASSERT(value >= -33554432); JSON_ASSERT(value >= -33818506);
value = -value - 1; value = -(value + 264075);
oa->write_character(static_cast<std::uint8_t>(0xF0 + (value >> 22 & 0x07))); oa->write_character(static_cast<std::uint8_t>(0xF0 + (value >> 22 & 0x07)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 16 & 0x3F))); oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 16 & 0x3F)));
oa->write_character(static_cast<std::uint8_t>(value >> 8)); oa->write_character(static_cast<std::uint8_t>(value >> 8));
oa->write_character(static_cast<std::uint8_t>(value)); oa->write_character(static_cast<std::uint8_t>(value));
} }
else if (value < -1920) else if (value <= -1931)
{ {
JSON_ASSERT(value >= -262144); JSON_ASSERT(value >= -264074);
value = -value - 1; value = -(value + 1931);
oa->write_character(static_cast<std::uint8_t>(0xE0 + (value >> 14 & 0x0F))); oa->write_character(static_cast<std::uint8_t>(0xE0 + (value >> 14 & 0x0F)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 8 & 0x3F))); oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 8 & 0x3F)));
oa->write_character(static_cast<std::uint8_t>(value)); oa->write_character(static_cast<std::uint8_t>(value));
} }
else if (value < -10) else if (value <= -11)
{ {
JSON_ASSERT(value >= -1920); JSON_ASSERT(value >= -1930);
value = -value - 1; value = -(value + 11);
oa->write_character(static_cast<std::uint8_t>(0xC2 + (value >> 6 & 0x1F))); oa->write_character(static_cast<std::uint8_t>(0xC2 + (value >> 6 & 0x1F)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value & 0x3F))); oa->write_character(static_cast<std::uint8_t>(0xC0 + (value & 0x3F)));
} }
else if (value < 0) else if (value <= -1)
{ {
JSON_ASSERT(value >= -10); JSON_ASSERT(value >= -10);
value = -value - 1; value = -(value + 1);
oa->write_character(static_cast<std::uint8_t>(0xB8 + value)); oa->write_character(static_cast<std::uint8_t>(0xB8 + value));
} }
else if (value <= 39) else if (value <= 39)

View File

@ -15297,40 +15297,40 @@ class binary_writer
oa->write_character(to_char_type(0x8D)); oa->write_character(to_char_type(0x8D));
write_number(static_cast<std::int64_t>(value)); write_number(static_cast<std::int64_t>(value));
} }
else if (value < -33554432 || value > 67637031) else if (value < -33818506 || value > 67637031)
{ {
// 32 bit integers // 32 bit integers
oa->write_character(to_char_type(0x8C)); oa->write_character(to_char_type(0x8C));
write_number(static_cast<std::int32_t>(value)); write_number(static_cast<std::int32_t>(value));
} }
else if (value < -262144) else if (value <= -264075)
{ {
JSON_ASSERT(value >= -33554432); JSON_ASSERT(value >= -33818506);
value = -value - 1; value = -(value + 264075);
oa->write_character(static_cast<std::uint8_t>(0xF0 + (value >> 22 & 0x07))); oa->write_character(static_cast<std::uint8_t>(0xF0 + (value >> 22 & 0x07)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 16 & 0x3F))); oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 16 & 0x3F)));
oa->write_character(static_cast<std::uint8_t>(value >> 8)); oa->write_character(static_cast<std::uint8_t>(value >> 8));
oa->write_character(static_cast<std::uint8_t>(value)); oa->write_character(static_cast<std::uint8_t>(value));
} }
else if (value < -1920) else if (value <= -1931)
{ {
JSON_ASSERT(value >= -262144); JSON_ASSERT(value >= -264074);
value = -value - 1; value = -(value + 1931);
oa->write_character(static_cast<std::uint8_t>(0xE0 + (value >> 14 & 0x0F))); oa->write_character(static_cast<std::uint8_t>(0xE0 + (value >> 14 & 0x0F)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 8 & 0x3F))); oa->write_character(static_cast<std::uint8_t>(0xC0 + (value >> 8 & 0x3F)));
oa->write_character(static_cast<std::uint8_t>(value)); oa->write_character(static_cast<std::uint8_t>(value));
} }
else if (value < -10) else if (value <= -11)
{ {
JSON_ASSERT(value >= -1920); JSON_ASSERT(value >= -1930);
value = -value - 1; value = -(value + 11);
oa->write_character(static_cast<std::uint8_t>(0xC2 + (value >> 6 & 0x1F))); oa->write_character(static_cast<std::uint8_t>(0xC2 + (value >> 6 & 0x1F)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value & 0x3F))); oa->write_character(static_cast<std::uint8_t>(0xC0 + (value & 0x3F)));
} }
else if (value < 0) else if (value <= -1)
{ {
JSON_ASSERT(value >= -10); JSON_ASSERT(value >= -10);
value = -value - 1; value = -(value + 1);
oa->write_character(static_cast<std::uint8_t>(0xB8 + value)); oa->write_character(static_cast<std::uint8_t>(0xB8 + value));
} }
else if (value <= 39) else if (value <= 39)

View File

@ -222,7 +222,7 @@ TEST_CASE("BON8")
} }
} }
SECTION("-2147483648 (int32min)..-33554433") SECTION("-2147483648 (int32min)..-33818507")
{ {
SECTION("-2147483648") SECTION("-2147483648")
{ {
@ -233,58 +233,58 @@ TEST_CASE("BON8")
CHECK(result == expected); CHECK(result == expected);
} }
SECTION("-33554433") SECTION("-33818507")
{ {
json j = -33554433; json j = -33818507;
std::vector<uint8_t> expected = {0x8C, 0xFD, 0xFF, 0xFF, 0xFF}; std::vector<uint8_t> expected = {0x8C, 0xFD, 0xFB, 0xF8, 0x75};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
} }
} }
SECTION("-33554432..-262145") SECTION("-33818506..-264075")
{ {
SECTION("-33554432") SECTION("-33818506")
{ {
json j = -33554432; json j = -33818506;
std::vector<uint8_t> expected = {0xF7, 0xFF, 0xFF, 0xFF}; std::vector<uint8_t> expected = {0xF7, 0xFF, 0xFF, 0xFF};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
} }
SECTION("-262145") SECTION("-264075")
{ {
json j = -262145; json j = -264075;
std::vector<uint8_t> expected = {0xF0, 0xC4, 0x00, 0x00}; std::vector<uint8_t> expected = {0xF0, 0xC0, 0x00, 0x00};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
} }
} }
SECTION("-262144..-1921") SECTION("-264074..-1931")
{ {
SECTION("-262144") SECTION("-264074")
{ {
json j = -262144; json j = -264074;
std::vector<uint8_t> expected = {0xEF, 0xFF, 0xFF}; std::vector<uint8_t> expected = {0xEF, 0xFF, 0xFF};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
} }
SECTION("-1921") SECTION("-1931")
{ {
json j = -1921; json j = -1931;
std::vector<uint8_t> expected = {0xE0, 0xC7, 0x80}; std::vector<uint8_t> expected = {0xE0, 0xC0, 0x00};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
} }
} }
SECTION("-1920..-11") SECTION("-1930..-11")
{ {
SECTION("-1920") SECTION("-1930")
{ {
json j = -1920; json j = -1930;
std::vector<uint8_t> expected = {0xDF, 0xFF}; std::vector<uint8_t> expected = {0xDF, 0xFF};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
@ -293,7 +293,7 @@ TEST_CASE("BON8")
SECTION("-11") SECTION("-11")
{ {
json j = -11; json j = -11;
std::vector<uint8_t> expected = {0xC2, 0xCA}; std::vector<uint8_t> expected = {0xC2, 0xC0};
const auto result = json::to_bon8(j); const auto result = json::to_bon8(j);
CHECK(result == expected); CHECK(result == expected);
} }