diff --git a/test/Jamfile b/test/Jamfile index b5fb7fb..5569435 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -29,3 +29,4 @@ run test_num_digits.cpp ; run limits_link_1.cpp limits_link_2.cpp limits_link_3.cpp ; run test_128bit_native.cpp ; run test_128bit_emulation.cpp ; +run leading_zero_count.cpp ; diff --git a/test/leading_zero_count.cpp b/test/leading_zero_count.cpp new file mode 100644 index 0000000..71454cb --- /dev/null +++ b/test/leading_zero_count.cpp @@ -0,0 +1,45 @@ +// 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 + +template +void test() +{ + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(1), 63); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(2), 62); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(3), 62); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(4), 61); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(8), 60); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(16), 59); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(32), 58); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(64), 57); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(128), 56); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(200), 56); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(256), 55); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(500), 55); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(512), 54); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(1000), 54); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(1024), 53); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() - 1), 0); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max()), 0); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 2 + 1), 0); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 2), 1); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 4 + 1), 1); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 4), 2); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 8), 3); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 16), 4); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 32), 5); + BOOST_TEST_EQ(boost::charconv::detail::leading_zeros(std::numeric_limits::max() / 64), 6); +} + +int main(void) +{ + test(); + + return boost::report_errors(); +}