// Copyright 2023 Matt Borland // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #if defined(__GNUC__) && (__GNUC__ == 5 || __GNUC__ == 6) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Woverflow" #endif #ifdef BOOST_CHARCONV_HAS_INT128 // Test the u128 impl template void test128() { T max = BOOST_CHARCONV_UINT128_MAX; max /= 10; T val = 1; int i = 1; while (val < max) { BOOST_TEST_EQ(boost::charconv::detail::num_digits(val), i); ++i; val *= 10; } BOOST_TEST_EQ(boost::charconv::detail::num_digits(max * 10), 39); } #endif #if defined(__GNUC__) && (__GNUC__ == 5 || __GNUC__ == 6) # pragma GCC diagnostic pop #endif // Tests the generic, u32, and u64 impls template void test() { constexpr T max = (std::numeric_limits::max)() / 10; T val = 1; int i = 1; while (val < max) { BOOST_TEST_EQ(boost::charconv::detail::num_digits(val), i); ++i; val *= 10; } BOOST_TEST_EQ(boost::charconv::detail::num_digits(val), std::numeric_limits::digits10 + 1); } int main() { test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); // Specialized tables test(); test(); #ifdef BOOST_CHARCONV_HAS_INT128 test128(); #endif return boost::report_errors(); }