♻️ 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));
write_number(static_cast<std::int64_t>(value));
}
else if (value < -33554432 || value > 67637031)
else if (value < -33818506 || value > 67637031)
{
// 32 bit integers
oa->write_character(to_char_type(0x8C));
write_number(static_cast<std::int32_t>(value));
}
else if (value < -262144)
else if (value <= -264075)
{
JSON_ASSERT(value >= -33554432);
value = -value - 1;
JSON_ASSERT(value >= -33818506);
value = -(value + 264075);
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>(value >> 8));
oa->write_character(static_cast<std::uint8_t>(value));
}
else if (value < -1920)
else if (value <= -1931)
{
JSON_ASSERT(value >= -262144);
value = -value - 1;
JSON_ASSERT(value >= -264074);
value = -(value + 1931);
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>(value));
}
else if (value < -10)
else if (value <= -11)
{
JSON_ASSERT(value >= -1920);
value = -value - 1;
JSON_ASSERT(value >= -1930);
value = -(value + 11);
oa->write_character(static_cast<std::uint8_t>(0xC2 + (value >> 6 & 0x1F)));
oa->write_character(static_cast<std::uint8_t>(0xC0 + (value & 0x3F)));
}
else if (value < 0)
else if (value <= -1)
{
JSON_ASSERT(value >= -10);
value = -value - 1;
value = -(value + 1);
oa->write_character(static_cast<std::uint8_t>(0xB8 + value));
}
else if (value <= 39)

View File

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

View File

@ -222,7 +222,7 @@ TEST_CASE("BON8")
}
}
SECTION("-2147483648 (int32min)..-33554433")
SECTION("-2147483648 (int32min)..-33818507")
{
SECTION("-2147483648")
{
@ -233,58 +233,58 @@ TEST_CASE("BON8")
CHECK(result == expected);
}
SECTION("-33554433")
SECTION("-33818507")
{
json j = -33554433;
std::vector<uint8_t> expected = {0x8C, 0xFD, 0xFF, 0xFF, 0xFF};
json j = -33818507;
std::vector<uint8_t> expected = {0x8C, 0xFD, 0xFB, 0xF8, 0x75};
const auto result = json::to_bon8(j);
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};
const auto result = json::to_bon8(j);
CHECK(result == expected);
}
SECTION("-262145")
SECTION("-264075")
{
json j = -262145;
std::vector<uint8_t> expected = {0xF0, 0xC4, 0x00, 0x00};
json j = -264075;
std::vector<uint8_t> expected = {0xF0, 0xC0, 0x00, 0x00};
const auto result = json::to_bon8(j);
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};
const auto result = json::to_bon8(j);
CHECK(result == expected);
}
SECTION("-1921")
SECTION("-1931")
{
json j = -1921;
std::vector<uint8_t> expected = {0xE0, 0xC7, 0x80};
json j = -1931;
std::vector<uint8_t> expected = {0xE0, 0xC0, 0x00};
const auto result = json::to_bon8(j);
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};
const auto result = json::to_bon8(j);
CHECK(result == expected);
@ -293,7 +293,7 @@ TEST_CASE("BON8")
SECTION("-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);
CHECK(result == expected);
}