/////////////////////////////////////////////////////////////// // Copyright 2012 John Maddock. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt // // Compare arithmetic results using fixed_int to GMP results. // #ifdef _MSC_VER #define _SCL_SECURE_NO_WARNINGS #endif #include #include #include #include #include "test.hpp" #include #include #include #include #include #include #include #include #include #include template T generate_random(unsigned bits_wanted) { static boost::random::mt19937 gen; typedef boost::random::mt19937::result_type random_type; T max_val; unsigned digits; if (std::numeric_limits::is_bounded && (bits_wanted == (unsigned)std::numeric_limits::digits)) { max_val = (std::numeric_limits::max)(); digits = std::numeric_limits::digits; } else { max_val = T(1) << bits_wanted; digits = bits_wanted; } unsigned bits_per_r_val = std::numeric_limits::digits - 1; while ((random_type(1) << bits_per_r_val) > (gen.max)()) --bits_per_r_val; unsigned terms_needed = digits / bits_per_r_val + 1; T val = 0; for (unsigned i = 0; i < terms_needed; ++i) { val *= (gen.max)(); val += gen(); } val %= max_val; return val; } template void test_neg(const T& x, const boost::mpl::true_&) { T val = -x; #ifndef BOOST_NO_EXCEPTIONS try { #endif std::stringstream ss; boost::archive::text_oarchive oa(ss); oa << static_cast(val); boost::archive::text_iarchive ia(ss); T val2; ia >> val2; BOOST_CHECK_EQUAL(val, val2); ss.clear(); boost::archive::binary_oarchive ob(ss); ob << static_cast(val); boost::archive::binary_iarchive ib(ss); ib >> val2; BOOST_CHECK_EQUAL(val, val2); #ifndef BOOST_NO_EXCEPTIONS } catch (const boost::exception& e) { std::cout << "Caught boost::exception with:\n"; std::cout << diagnostic_information(e); } catch (const std::exception& e) { std::cout << "Caught std::exception with:\n"; std::cout << e.what() << std::endl; } #endif } template void test_neg(const T&, const boost::mpl::false_&) {} template void test() { using namespace boost::multiprecision; boost::random::mt19937 gen; boost::uniform_int<> d(3, std::numeric_limits::is_bounded ? std::numeric_limits::digits : 3000); boost::timer tim; while (true) { T val = generate_random(d(gen)); #ifndef BOOST_NO_EXCEPTIONS try { #endif T val2; { std::stringstream ss; boost::archive::text_oarchive oa(ss); oa << static_cast(val); boost::archive::text_iarchive ia(ss); ia >> val2; BOOST_CHECK_EQUAL(val, val2); } { std::stringstream ss; boost::archive::binary_oarchive ob(ss); ob << static_cast(val); boost::archive::binary_iarchive ib(ss); ib >> val2; BOOST_CHECK_EQUAL(val, val2); } { std::stringstream ss; { boost::archive::xml_oarchive oc(ss); oc << boost::serialization::make_nvp("value", static_cast(val)); } boost::archive::xml_iarchive ic(ss); ic >> boost::serialization::make_nvp("value", val2); BOOST_CHECK_EQUAL(val, val2); } #ifndef BOOST_NO_EXCEPTIONS } catch (const boost::exception& e) { std::cout << "Caught boost::exception with:\n"; std::cout << diagnostic_information(e); } catch (const std::exception& e) { std::cout << "Caught std::exception with:\n"; std::cout << e.what() << std::endl; } #endif test_neg(val, boost::mpl::bool_::is_signed>()); // // Check to see if test is taking too long. // Tests run on the compiler farm time out after 300 seconds, // so don't get too close to that: // #ifndef CI_SUPPRESS_KNOWN_ISSUES if (tim.elapsed() > 150) #else if (tim.elapsed() > 25) #endif { std::cout << "Timeout reached, aborting tests now....\n"; break; } } } #if !defined(TEST1) && !defined(TEST2) && !defined(TEST3) && !defined(TEST4) #define TEST1 #define TEST2 #define TEST3 #define TEST4 #endif int main() { using namespace boost::multiprecision; #ifdef TEST1 test(); #endif #ifdef TEST2 test > >(); #endif #ifdef TEST3 test > >(); #endif #ifdef TEST4 test(); #endif return boost::report_errors(); }