From 35312cb5fd4b23a7fef16246b87f28efdf4a2dba Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 8 Jun 2023 13:27:28 +0200 Subject: [PATCH] Add overload for emulated128 in num_digits --- .../charconv/detail/integer_search_trees.hpp | 11 +++++++++++ test/test_num_digits.cpp | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/boost/charconv/detail/integer_search_trees.hpp b/include/boost/charconv/detail/integer_search_trees.hpp index 0609646..52c5189 100644 --- a/include/boost/charconv/detail/integer_search_trees.hpp +++ b/include/boost/charconv/detail/integer_search_trees.hpp @@ -9,6 +9,7 @@ // https://graphics.stanford.edu/~seander/bithacks.html #include +#include #include #include #include @@ -156,6 +157,16 @@ BOOST_CHARCONV_CXX14_CONSTEXPR int num_digits(std::uint64_t x) noexcept return 1; } +BOOST_CHARCONV_CXX14_CONSTEXPR int num_digits(uint128 x) noexcept +{ + if (x.high != 0) + { + return num_digits(x.high) + 19; + } + + return num_digits(x.low); +} + #ifdef BOOST_CHARCONV_HAS_INT128 static constexpr std::array powers_of_10 = {{ diff --git a/test/test_num_digits.cpp b/test/test_num_digits.cpp index 58198cf..ebd604d 100644 --- a/test/test_num_digits.cpp +++ b/test/test_num_digits.cpp @@ -3,6 +3,7 @@ // https://www.boost.org/LICENSE_1_0.txt #include +#include #include #include #include @@ -57,6 +58,20 @@ void test() BOOST_TEST_EQ(boost::charconv::detail::num_digits(val), std::numeric_limits::digits10 + 1); } +void test_emulated128() +{ + using namespace boost::charconv::detail; + + uint128 v1 {0, 1234}; + BOOST_TEST_EQ(num_digits(v1), 4); + + uint128 v2 {1234, 0}; + BOOST_TEST_EQ(num_digits(v2), 23); + + uint128 v3 {UINT64_MAX, UINT64_MAX}; + BOOST_TEST_EQ(num_digits(v3), 39); +} + int main() { test(); @@ -78,5 +93,7 @@ int main() test128(); #endif + test_emulated128(); + return boost::report_errors(); }