// 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 void test_odr_use( int const* ); template void test_integral( T value ) { // no base { char buffer[ boost::charconv::limits::max_chars10 ]; auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), value ); BOOST_TEST_EQ( r.ec, 0 ); T v2 = 0; auto r2 = boost::charconv::from_chars( buffer, r.ptr, v2 ); BOOST_TEST_EQ( r2.ec, 0 ) && BOOST_TEST_EQ( v2, value ); } // base 10 { char buffer[ boost::charconv::limits::max_chars10 ]; auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), value, 10 ); BOOST_TEST_EQ( r.ec, 0 ); T v2 = 0; auto r2 = boost::charconv::from_chars( buffer, r.ptr, v2, 10 ); BOOST_TEST_EQ( r2.ec, 0 ) && BOOST_TEST_EQ( v2, value ); } // any base for( int base = 2; base <= 36; ++base ) { char buffer[ boost::charconv::limits::max_chars ]; auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), value, base ); BOOST_TEST_EQ( r.ec, 0 ); T v2 = 0; auto r2 = boost::charconv::from_chars( buffer, r.ptr, v2, base ); BOOST_TEST_EQ( r2.ec, 0 ) && BOOST_TEST_EQ( v2, value ); } } template void test_integral() { BOOST_TEST_GE( boost::charconv::limits::max_chars10, std::numeric_limits::digits10 ); BOOST_TEST_GE( boost::charconv::limits::max_chars, std::numeric_limits::digits ); test_odr_use( &boost::charconv::limits::max_chars10 ); test_odr_use( &boost::charconv::limits::max_chars ); test_integral( std::numeric_limits::min() ); test_integral( std::numeric_limits::max() ); } template void test_floating_point( T value ) { // no base, max_chars10 { char buffer[ boost::charconv::limits::max_chars10 ]; auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), value ); BOOST_TEST_EQ( r.ec, 0 ); T v2 = 0; auto r2 = boost::charconv::from_chars( buffer, r.ptr, v2 ); BOOST_TEST_EQ( r2.ec, 0 ) && BOOST_TEST_EQ( v2, value ); } // no base, max_chars { char buffer[ boost::charconv::limits::max_chars ]; auto r = boost::charconv::to_chars( buffer, buffer + sizeof( buffer ), value ); BOOST_TEST_EQ( r.ec, 0 ); T v2 = 0; auto r2 = boost::charconv::from_chars( buffer, r.ptr, v2 ); BOOST_TEST_EQ( r2.ec, 0 ) && BOOST_TEST_EQ( v2, value ); } } template void test_floating_point() { BOOST_TEST_GE( boost::charconv::limits::max_chars10, std::numeric_limits::max_digits10 ); BOOST_TEST_GE( boost::charconv::limits::max_chars, std::numeric_limits::max_digits10 ); test_odr_use( &boost::charconv::limits::max_chars10 ); test_odr_use( &boost::charconv::limits::max_chars ); test_floating_point( std::numeric_limits::min() ); test_floating_point( -std::numeric_limits::min() ); test_floating_point( std::numeric_limits::max() ); test_floating_point( -std::numeric_limits::max() ); } int main() { test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_integral(); test_floating_point(); test_floating_point(); return boost::report_errors(); } void test_odr_use( int const* ) { }