diff --git a/deps/ox/src/ox/std/strconv.hpp b/deps/ox/src/ox/std/strconv.hpp index b7f33dea..df4067db 100644 --- a/deps/ox/src/ox/std/strconv.hpp +++ b/deps/ox/src/ox/std/strconv.hpp @@ -18,34 +18,34 @@ namespace ox { template constexpr ox::Error writeItoa(Integer v, ox::Writer_c auto &writer) noexcept { - if (v) { - ox::ResizedInt_t mod = 1000000000000000000; - ox::ResizedInt_t val = v; - constexpr auto base = 10; - auto it = 0; - if (val < 0) { - OX_RETURN_ERROR(writer.put('-')); + if (v) { + ox::ResizedInt_t mod = 1000000000000000000; + ox::ResizedInt_t val = v; + constexpr auto base = 10; + auto it = 0; + if (val < 0) { + OX_RETURN_ERROR(writer.put('-')); + val = ~val + 1; + } + while (mod) { + auto digit = val / mod; + val %= mod; + mod /= base; + if (it || digit) { + ox::ResizedInt_t start = '0'; + if (digit >= 10) { + start = 'a'; + digit -= 10; + } + OX_RETURN_ERROR(writer.put(static_cast(start + digit))); ++it; } - while (mod) { - auto digit = val / mod; - val %= mod; - mod /= base; - if (it || digit) { - ox::ResizedInt_t start = '0'; - if (digit >= 10) { - start = 'a'; - digit -= 10; - } - OX_RETURN_ERROR(writer.put(static_cast(start + digit))); - ++it; - } - } - } else { - // 0 is a special case - OX_RETURN_ERROR(writer.put('0')); } - return {}; + } else { + // 0 is a special case + OX_RETURN_ERROR(writer.put('0')); + } + return {}; } } diff --git a/deps/ox/src/ox/std/test/CMakeLists.txt b/deps/ox/src/ox/std/test/CMakeLists.txt index 2fa8f288..a05283bd 100644 --- a/deps/ox/src/ox/std/test/CMakeLists.txt +++ b/deps/ox/src/ox/std/test/CMakeLists.txt @@ -28,3 +28,4 @@ add_test("[ox/std] FromHex" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "FromHex") add_test("[ox/std] ToHex" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "ToHex") add_test("[ox/std] UUID" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "UUID") add_test("[ox/std] UUID::generate" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "UUID::generate") +add_test("[ox/std] intToStr" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/StdTest "intToStr") diff --git a/deps/ox/src/ox/std/test/tests.cpp b/deps/ox/src/ox/std/test/tests.cpp index e776a570..941a8a08 100644 --- a/deps/ox/src/ox/std/test/tests.cpp +++ b/deps/ox/src/ox/std/test/tests.cpp @@ -536,6 +536,20 @@ OX_CLANG_NOWARN_END return ox::Error(0); } }, + { + "intToStr", + [] { + oxExpect(ox::intToStr(5), "5"); + oxExpect(ox::intToStr(5000), "5000"); + oxExpect(ox::intToStr(50000), "50000"); + oxExpect(ox::intToStr(500000), "500000"); + oxExpect(ox::intToStr(-5), "-5"); + oxExpect(ox::intToStr(-5000), "-5000"); + oxExpect(ox::intToStr(-50000), "-50000"); + oxExpect(ox::intToStr(-500000), "-500000"); + return ox::Error{}; + } + }, }; int main(int argc, const char **argv) {