1 ///////////////////////////////////////////////////////////////
2 // Copyright 2013 John Maddock. Distributed under the Boost
3 // Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
6 #include <boost/random/mersenne_twister.hpp>
7 #include <boost/random/uniform_int.hpp>
8 #include <boost/timer.hpp>
14 #include <boost/archive/text_iarchive.hpp>
15 #include <boost/archive/text_oarchive.hpp>
16 #include <boost/archive/binary_iarchive.hpp>
17 #include <boost/archive/binary_oarchive.hpp>
18 #include <boost/archive/xml_iarchive.hpp>
19 #include <boost/archive/xml_oarchive.hpp>
20 #include <boost/exception/all.hpp>
22 #ifndef BOOST_MP_TEST_FLOAT_SERIAL_HPP
23 #define BOOST_MP_TEST_FLOAT_SERIAL_HPP
26 T generate_random(unsigned /*bits_wanted*/)
28 typedef typename T::backend_type::exponent_type e_type;
29 static boost::random::mt19937 gen;
32 while (val != prev_val)
41 static boost::random::uniform_int_distribution<e_type> ui(std::numeric_limits<T>::min_exponent + 1, std::numeric_limits<T>::max_exponent - 1);
42 return ldexp(val, ui(gen));
52 T val = generate_random<T>(boost::math::tools::digits<T>());
54 std::string stream_contents;
55 #ifndef BOOST_NO_EXCEPTIONS
61 std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
62 boost::archive::text_oarchive oa(ss);
63 oa << static_cast<const T&>(val);
64 stream_contents = ss.str();
65 boost::archive::text_iarchive ia(ss);
68 BOOST_CHECK_EQUAL(val, val2);
71 std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
73 boost::archive::xml_oarchive oa(ss);
74 oa << boost::serialization::make_nvp("value", static_cast<const T&>(val));
75 stream_contents = ss.str();
77 boost::archive::xml_iarchive ia(ss);
79 ia >> boost::serialization::make_nvp("value", val2);
80 BOOST_CHECK_EQUAL(val, val2);
83 std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
85 boost::archive::binary_oarchive ba(ss);
86 ba << static_cast<const T&>(val);
87 stream_contents = ss.str();
88 boost::archive::binary_iarchive ib(ss);
91 BOOST_CHECK_EQUAL(val, val2);
94 std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
97 boost::archive::text_oarchive oa2(ss);
98 oa2 << static_cast<const T&>(val);
99 stream_contents = ss.str();
100 boost::archive::text_iarchive ia2(ss);
103 BOOST_CHECK_EQUAL(val, val2);
106 std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
109 boost::archive::xml_oarchive oa2(ss);
110 oa2 << boost::serialization::make_nvp("value", static_cast<const T&>(val));
111 stream_contents = ss.str();
113 boost::archive::xml_iarchive ia2(ss);
115 ia2 >> boost::serialization::make_nvp("value", val2);
116 BOOST_CHECK_EQUAL(val, val2);
119 std::stringstream ss(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
121 boost::archive::binary_oarchive ba2(ss);
122 ba2 << static_cast<const T&>(val);
123 stream_contents = ss.str();
124 boost::archive::binary_iarchive ib2(ss);
127 BOOST_CHECK_EQUAL(val, val2);
129 #ifndef BOOST_NO_EXCEPTIONS
131 catch (const boost::exception& e)
133 std::cout << "Caught boost::exception with:\n";
134 std::cout << diagnostic_information(e);
135 std::cout << "Failed test ID = " << test_id << std::endl;
136 std::cout << "Stream contents were: \n"
137 << stream_contents << std::endl;
138 ++boost::detail::test_errors();
141 catch (const std::exception& e)
143 std::cout << "Caught std::exception with:\n";
144 std::cout << e.what() << std::endl;
145 std::cout << "Failed test ID = " << test_id << std::endl;
146 std::cout << "Stream contents were: \n"
147 << stream_contents << std::endl;
148 ++boost::detail::test_errors();
153 // Check to see if test is taking too long.
154 // Tests run on the compiler farm time out after 300 seconds,
155 // so don't get too close to that:
157 #ifndef CI_SUPPRESS_KNOWN_ISSUES
158 if (tim.elapsed() > 150)
160 if (tim.elapsed() > 25)
163 std::cout << "Timeout reached, aborting tests now....\n";