diff options
-rw-r--r-- | AK/DeprecatedString.cpp | 18 | ||||
-rw-r--r-- | Tests/AK/TestDeprecatedString.cpp | 5 |
2 files changed, 14 insertions, 9 deletions
diff --git a/AK/DeprecatedString.cpp b/AK/DeprecatedString.cpp index 5877bc7426..437b27a71a 100644 --- a/AK/DeprecatedString.cpp +++ b/AK/DeprecatedString.cpp @@ -246,6 +246,7 @@ DeprecatedString DeprecatedString::repeated(StringView string, size_t count) DeprecatedString DeprecatedString::bijective_base_from(size_t value, unsigned base, StringView map) { + value++; if (map.is_null()) map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"sv; @@ -255,15 +256,16 @@ DeprecatedString DeprecatedString::bijective_base_from(size_t value, unsigned ba Array<char, round_up_to_power_of_two(sizeof(size_t) * 8 + 1, 2)> buffer; size_t i = 0; do { - buffer[i++] = map[value % base]; - value /= base; - } while (value > 0); + auto remainder = value % base; + auto new_value = value / base; + if (remainder == 0) { + new_value--; + remainder = map.length(); + } - // NOTE: Weird as this may seem, the thing that comes after 'Z' is 'AA', which as a number would be '00' - // to make this work, only the most significant digit has to be in a range of (1..25) as opposed to (0..25), - // but only if it's not the only digit in the string. - if (i > 1) - --buffer[i - 1]; + buffer[i++] = map[remainder - 1]; + value = new_value; + } while (value > 0); for (size_t j = 0; j < i / 2; ++j) swap(buffer[j], buffer[i - j - 1]); diff --git a/Tests/AK/TestDeprecatedString.cpp b/Tests/AK/TestDeprecatedString.cpp index a0045357e3..0b6687f406 100644 --- a/Tests/AK/TestDeprecatedString.cpp +++ b/Tests/AK/TestDeprecatedString.cpp @@ -290,7 +290,10 @@ TEST_CASE(bijective_base) EXPECT_EQ(DeprecatedString::bijective_base_from(25), "Z"); EXPECT_EQ(DeprecatedString::bijective_base_from(26), "AA"); EXPECT_EQ(DeprecatedString::bijective_base_from(52), "BA"); - EXPECT_EQ(DeprecatedString::bijective_base_from(704), "ABC"); + EXPECT_EQ(DeprecatedString::bijective_base_from(701), "ZZ"); + EXPECT_EQ(DeprecatedString::bijective_base_from(702), "AAA"); + EXPECT_EQ(DeprecatedString::bijective_base_from(730), "ABC"); + EXPECT_EQ(DeprecatedString::bijective_base_from(18277), "ZZZ"); } TEST_CASE(roman_numerals) |