#include "common.hpp" namespace mynamespace { struct MyCustomClass {}; } #ifdef _MSC_VER BOOST_AUTO_TEST_CASE( util ) { BOOST_CHECK_EQUAL( cereal::util::demangledName(), "struct mynamespace::MyCustomClass" ); } #else BOOST_AUTO_TEST_CASE( util ) { BOOST_CHECK_EQUAL( cereal::util::demangledName(), "mynamespace::MyCustomClass" ); } #endif template inline void swapBytes( T & t ) { cereal::portable_binary_detail::swap_bytes( reinterpret_cast(&t) ); } BOOST_AUTO_TEST_CASE( portable_binary_archive ) { std::random_device rd; std::mt19937 gen(rd()); for(size_t i=0; i<100; ++i) { bool o_bool = random_value(gen) % 2 ? true : false; uint8_t o_uint8 = random_value(gen); int8_t o_int8 = random_value(gen); uint16_t o_uint16 = random_value(gen); int16_t o_int16 = random_value(gen); uint32_t o_uint32 = random_value(gen); int32_t o_int32 = random_value(gen); uint64_t o_uint64 = random_value(gen); int64_t o_int64 = random_value(gen); float o_float = random_value(gen); double o_double = random_value(gen); // swap the bytes on all of the data swapBytes(o_bool); swapBytes(o_uint8); swapBytes(o_int8); swapBytes(o_uint16); swapBytes(o_int16); swapBytes(o_uint32); swapBytes(o_int32); swapBytes(o_uint64); swapBytes(o_int64); swapBytes(o_float); swapBytes(o_double); std::ostringstream os; { cereal::BinaryOutputArchive oar(os); // manually insert incorrect endian encoding oar(!cereal::portable_binary_detail::is_little_endian()); oar(o_bool); oar(o_uint8); oar(o_int8); oar(o_uint16); oar(o_int16); oar(o_uint32); oar(o_int32); oar(o_uint64); oar(o_int64); oar(o_float); oar(o_double); } // swap back to original values swapBytes(o_bool); swapBytes(o_uint8); swapBytes(o_int8); swapBytes(o_uint16); swapBytes(o_int16); swapBytes(o_uint32); swapBytes(o_int32); swapBytes(o_uint64); swapBytes(o_int64); swapBytes(o_float); swapBytes(o_double); bool i_bool = false; uint8_t i_uint8 = 0; int8_t i_int8 = 0; uint16_t i_uint16 = 0; int16_t i_int16 = 0; uint32_t i_uint32 = 0; int32_t i_int32 = 0; uint64_t i_uint64 = 0; int64_t i_int64 = 0; float i_float = 0; double i_double = 0; std::istringstream is(os.str()); { cereal::PortableBinaryInputArchive iar(is); iar(i_bool); iar(i_uint8); iar(i_int8); iar(i_uint16); iar(i_int16); iar(i_uint32); iar(i_int32); iar(i_uint64); iar(i_int64); iar(i_float); iar(i_double); } BOOST_CHECK_EQUAL(i_bool , o_bool); BOOST_CHECK_EQUAL(i_uint8 , o_uint8); BOOST_CHECK_EQUAL(i_int8 , o_int8); BOOST_CHECK_EQUAL(i_uint16 , o_uint16); BOOST_CHECK_EQUAL(i_int16 , o_int16); BOOST_CHECK_EQUAL(i_uint32 , o_uint32); BOOST_CHECK_EQUAL(i_int32 , o_int32); BOOST_CHECK_EQUAL(i_uint64 , o_uint64); BOOST_CHECK_EQUAL(i_int64 , o_int64); BOOST_CHECK_CLOSE(i_float , o_float, (float)1e-5); BOOST_CHECK_CLOSE(i_double , o_double, 1e-5); } }