#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { template ::std::ostream & operator<<(::std::ostream & os, ::std::pair const & p) { os << "([" << p.first << "], [" << p.second << "])"; return os; } } #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE Cereal #include struct StructBase { int x, y; bool operator==(StructBase const & other) const { return x == other.x && y == other.y; } bool operator!=(StructBase const & other) const { return x != other.x || y != other.y; } bool operator<(StructBase const & other) const { if (x < other.x) return true; else if(other.x < x) return false; else return (y < other.y); } }; std::ostream& operator<<(std::ostream& os, StructBase const & s) { os << "[x: " << s.x << " y: " << s.y << "]"; return os; } struct StructInternalSerialize : StructBase { StructInternalSerialize() : StructBase{0,0} {} StructInternalSerialize(int x_, int y_) : StructBase{x_,y_} {} template void serialize(Archive & ar) { ar & x & y; } }; struct StructInternalSplit : StructBase { StructInternalSplit() : StructBase{0,0} {} StructInternalSplit(int x_, int y_) : StructBase{x_,y_} {} template void save(Archive & ar) const { ar & x & y; } template void load(Archive & ar) { ar & x & y; } }; struct StructExternalSerialize : StructBase { StructExternalSerialize() : StructBase{0,0} {} StructExternalSerialize(int x_, int y_) : StructBase{x_,y_} {} }; template void serialize(Archive & ar, StructExternalSerialize & s) { ar & s.x & s.y; } struct StructExternalSplit : StructBase { StructExternalSplit() : StructBase{0,0} {} StructExternalSplit(int x_, int y_) : StructBase{x_,y_} {} }; template void save(Archive & ar, StructExternalSplit const & s) { ar & s.x & s.y; } template void load(Archive & ar, StructExternalSplit & s) { ar & s.x & s.y; } template struct StructHash { public: size_t operator()(const T & s) const { size_t h1 = std::hash()(s.x); size_t h2 = std::hash()(s.y); return h1 ^ ( h2 << 1 ); } }; template typename std::enable_if::value, T>::type random_value(std::mt19937 & gen) { return std::uniform_real_distribution(-10000.0, 10000.0)(gen); } template typename std::enable_if::value, T>::type random_value(std::mt19937 & gen) { return std::uniform_int_distribution(std::numeric_limits::lowest(), std::numeric_limits::max())(gen); } template typename std::enable_if::value, std::string>::type random_value(std::mt19937 & gen) { std::string s(std::uniform_int_distribution(3, 30)(gen), ' '); for(char & c : s) c = std::uniform_int_distribution(' ', '~')(gen); return s; } template std::basic_string random_basic_string(std::mt19937 & gen) { std::basic_string s(std::uniform_int_distribution(3, 30)(gen), ' '); for(C & c : s) c = std::uniform_int_distribution(' ', '~')(gen); return s; } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_pod ) { std::random_device rd; std::mt19937 gen(rd()); for(size_t i=0; i<100; ++i) { uint8_t const o_uint8 = random_value(gen); int8_t const o_int8 = random_value(gen); uint16_t const o_uint16 = random_value(gen); int16_t const o_int16 = random_value(gen); uint32_t const o_uint32 = random_value(gen); int32_t const o_int32 = random_value(gen); uint64_t const o_uint64 = random_value(gen); int64_t const o_int64 = random_value(gen); float const o_float = random_value(gen); double const o_double = random_value(gen); std::ostringstream os; cereal::BinaryOutputArchive oar(os); 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; uint8_t i_uint8 = 0.0; int8_t i_int8 = 0.0; uint16_t i_uint16 = 0.0; int16_t i_int16 = 0.0; uint32_t i_uint32 = 0.0; int32_t i_int32 = 0.0; uint64_t i_uint64 = 0.0; int64_t i_int64 = 0.0; float i_float = 0.0; double i_double = 0.0; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); 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_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_EQUAL(i_float , o_float); BOOST_CHECK_EQUAL(i_double , o_double); } } // ###################################################################### BOOST_AUTO_TEST_CASE( structs ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); StructInternalSerialize o_iser = { random_value(gen), random_value(gen) }; StructInternalSplit o_ispl = { random_value(gen), random_value(gen) }; StructExternalSerialize o_eser = { random_value(gen), random_value(gen) }; StructExternalSplit o_espl = { random_value(gen), random_value(gen) }; oar & o_iser & o_ispl & o_eser & o_espl; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); StructInternalSerialize i_iser; StructInternalSplit i_ispl; StructExternalSerialize i_eser; StructExternalSplit i_espl; iar & i_iser & i_ispl & i_eser & i_espl; BOOST_CHECK(i_iser == o_iser); BOOST_CHECK(i_ispl == o_ispl); BOOST_CHECK(i_eser == o_eser); BOOST_CHECK(i_espl == o_espl); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_array ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::array o_podarray; for(auto & elem : o_podarray) elem = random_value(gen); std::array o_iserarray; for(auto & elem : o_iserarray) elem = { random_value(gen), random_value(gen) }; std::array o_isplarray; for(auto & elem : o_isplarray) elem = { random_value(gen), random_value(gen) }; std::array o_eserarray; for(auto & elem : o_eserarray) elem = { random_value(gen), random_value(gen) }; std::array o_esplarray; for(auto & elem : o_esplarray) elem = { random_value(gen), random_value(gen) }; oar & o_podarray; oar & o_iserarray; oar & o_isplarray; oar & o_eserarray; oar & o_esplarray; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::array i_podarray; std::array i_iserarray; std::array i_isplarray; std::array i_eserarray; std::array i_esplarray; iar & i_podarray; iar & i_iserarray; iar & i_isplarray; iar & i_eserarray; iar & i_esplarray; BOOST_CHECK_EQUAL_COLLECTIONS(i_podarray.begin(), i_podarray.end(), o_podarray.begin(), o_podarray.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserarray.begin(), i_iserarray.end(), o_iserarray.begin(), o_iserarray.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplarray.begin(), i_isplarray.end(), o_isplarray.begin(), o_isplarray.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserarray.begin(), i_eserarray.end(), o_eserarray.begin(), o_eserarray.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplarray.begin(), i_esplarray.end(), o_esplarray.begin(), o_esplarray.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_vector ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::vector o_podvector(100); for(auto & elem : o_podvector) elem = random_value(gen); std::vector o_iservector(100); for(auto & elem : o_iservector) elem = { random_value(gen), random_value(gen) }; std::vector o_isplvector(100); for(auto & elem : o_isplvector) elem = { random_value(gen), random_value(gen) }; std::vector o_eservector(100); for(auto & elem : o_eservector) elem = { random_value(gen), random_value(gen) }; std::vector o_esplvector(100); for(auto & elem : o_esplvector) elem = { random_value(gen), random_value(gen) }; oar & o_podvector; oar & o_iservector; oar & o_isplvector; oar & o_eservector; oar & o_esplvector; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::vector i_podvector; std::vector i_iservector; std::vector i_isplvector; std::vector i_eservector; std::vector i_esplvector; iar & i_podvector; iar & i_iservector; iar & i_isplvector; iar & i_eservector; iar & i_esplvector; BOOST_CHECK_EQUAL(i_podvector.size(), o_podvector.size()); BOOST_CHECK_EQUAL(i_iservector.size(), o_iservector.size()); BOOST_CHECK_EQUAL(i_isplvector.size(), o_isplvector.size()); BOOST_CHECK_EQUAL(i_eservector.size(), o_eservector.size()); BOOST_CHECK_EQUAL(i_esplvector.size(), o_esplvector.size()); BOOST_CHECK_EQUAL_COLLECTIONS(i_podvector.begin(), i_podvector.end(), o_podvector.begin(), o_podvector.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iservector.begin(), i_iservector.end(), o_iservector.begin(), o_iservector.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplvector.begin(), i_isplvector.end(), o_isplvector.begin(), o_isplvector.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eservector.begin(), i_eservector.end(), o_eservector.begin(), o_eservector.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplvector.begin(), i_esplvector.end(), o_esplvector.begin(), o_esplvector.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_deque ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::deque o_poddeque(100); for(auto & elem : o_poddeque) elem = random_value(gen); std::deque o_iserdeque(100); for(auto & elem : o_iserdeque) elem = { random_value(gen), random_value(gen) }; std::deque o_ispldeque(100); for(auto & elem : o_ispldeque) elem = { random_value(gen), random_value(gen) }; std::deque o_eserdeque(100); for(auto & elem : o_eserdeque) elem = { random_value(gen), random_value(gen) }; std::deque o_espldeque(100); for(auto & elem : o_espldeque) elem = { random_value(gen), random_value(gen) }; oar & o_poddeque; oar & o_iserdeque; oar & o_ispldeque; oar & o_eserdeque; oar & o_espldeque; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::deque i_poddeque; std::deque i_iserdeque; std::deque i_ispldeque; std::deque i_eserdeque; std::deque i_espldeque; iar & i_poddeque; iar & i_iserdeque; iar & i_ispldeque; iar & i_eserdeque; iar & i_espldeque; BOOST_CHECK_EQUAL(i_poddeque.size(), o_poddeque.size()); BOOST_CHECK_EQUAL(i_iserdeque.size(), o_iserdeque.size()); BOOST_CHECK_EQUAL(i_ispldeque.size(), o_ispldeque.size()); BOOST_CHECK_EQUAL(i_eserdeque.size(), o_eserdeque.size()); BOOST_CHECK_EQUAL(i_espldeque.size(), o_espldeque.size()); BOOST_CHECK_EQUAL_COLLECTIONS(i_poddeque.begin(), i_poddeque.end(), o_poddeque.begin(), o_poddeque.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserdeque.begin(), i_iserdeque.end(), o_iserdeque.begin(), o_iserdeque.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_ispldeque.begin(), i_ispldeque.end(), o_ispldeque.begin(), o_ispldeque.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserdeque.begin(), i_eserdeque.end(), o_eserdeque.begin(), o_eserdeque.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_espldeque.begin(), i_espldeque.end(), o_espldeque.begin(), o_espldeque.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_forward_list ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::forward_list o_podforward_list(100); for(auto & elem : o_podforward_list) elem = random_value(gen); std::forward_list o_iserforward_list(100); for(auto & elem : o_iserforward_list) elem = { random_value(gen), random_value(gen) }; std::forward_list o_isplforward_list(100); for(auto & elem : o_isplforward_list) elem = { random_value(gen), random_value(gen) }; std::forward_list o_eserforward_list(100); for(auto & elem : o_eserforward_list) elem = { random_value(gen), random_value(gen) }; std::forward_list o_esplforward_list(100); for(auto & elem : o_esplforward_list) elem = { random_value(gen), random_value(gen) }; oar & o_podforward_list; oar & o_iserforward_list; oar & o_isplforward_list; oar & o_eserforward_list; oar & o_esplforward_list; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::forward_list i_podforward_list; std::forward_list i_iserforward_list; std::forward_list i_isplforward_list; std::forward_list i_eserforward_list; std::forward_list i_esplforward_list; iar & i_podforward_list; iar & i_iserforward_list; iar & i_isplforward_list; iar & i_eserforward_list; iar & i_esplforward_list; BOOST_CHECK_EQUAL_COLLECTIONS(i_podforward_list.begin(), i_podforward_list.end(), o_podforward_list.begin(), o_podforward_list.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserforward_list.begin(), i_iserforward_list.end(), o_iserforward_list.begin(), o_iserforward_list.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplforward_list.begin(), i_isplforward_list.end(), o_isplforward_list.begin(), o_isplforward_list.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserforward_list.begin(), i_eserforward_list.end(), o_eserforward_list.begin(), o_eserforward_list.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplforward_list.begin(), i_esplforward_list.end(), o_esplforward_list.begin(), o_esplforward_list.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_list ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::list o_podlist(100); for(auto & elem : o_podlist) elem = random_value(gen); std::list o_iserlist(100); for(auto & elem : o_iserlist) elem = { random_value(gen), random_value(gen) }; std::list o_ispllist(100); for(auto & elem : o_ispllist) elem = { random_value(gen), random_value(gen) }; std::list o_eserlist(100); for(auto & elem : o_eserlist) elem = { random_value(gen), random_value(gen) }; std::list o_espllist(100); for(auto & elem : o_espllist) elem = { random_value(gen), random_value(gen) }; oar & o_podlist; oar & o_iserlist; oar & o_ispllist; oar & o_eserlist; oar & o_espllist; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::list i_podlist; std::list i_iserlist; std::list i_ispllist; std::list i_eserlist; std::list i_espllist; iar & i_podlist; iar & i_iserlist; iar & i_ispllist; iar & i_eserlist; iar & i_espllist; BOOST_CHECK_EQUAL_COLLECTIONS(i_podlist.begin(), i_podlist.end(), o_podlist.begin(), o_podlist.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserlist.begin(), i_iserlist.end(), o_iserlist.begin(), o_iserlist.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_ispllist.begin(), i_ispllist.end(), o_ispllist.begin(), o_ispllist.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserlist.begin(), i_eserlist.end(), o_eserlist.begin(), o_eserlist.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_espllist.begin(), i_espllist.end(), o_espllist.begin(), o_espllist.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_map ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::map o_podmap; for(int j=0; j<100; ++j) o_podmap.insert({random_value(gen), random_value(gen)}); std::map o_isermap; for(int j=0; j<100; ++j) o_isermap.insert({random_value(gen), { random_value(gen), random_value(gen) }}); std::map o_isplmap; for(int j=0; j<100; ++j) o_isplmap.insert({random_value(gen), { random_value(gen), random_value(gen) }}); std::map o_esermap; for(int j=0; j<100; ++j) o_esermap.insert({random_value(gen), { random_value(gen), random_value(gen) }}); std::map o_esplmap; for(int j=0; j<100; ++j) o_esplmap.insert({random_value(gen), { random_value(gen), random_value(gen) }}); oar & o_podmap; oar & o_isermap; oar & o_isplmap; oar & o_esermap; oar & o_esplmap; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::map i_podmap; std::map i_isermap; std::map i_isplmap; std::map i_esermap; std::map i_esplmap; iar & i_podmap; iar & i_isermap; iar & i_isplmap; iar & i_esermap; iar & i_esplmap; BOOST_CHECK_EQUAL_COLLECTIONS(i_podmap.begin(), i_podmap.end(), o_podmap.begin(), o_podmap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isermap.begin(), i_isermap.end(), o_isermap.begin(), o_isermap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplmap.begin(), i_isplmap.end(), o_isplmap.begin(), o_isplmap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esermap.begin(), i_esermap.end(), o_esermap.begin(), o_esermap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplmap.begin(), i_esplmap.end(), o_esplmap.begin(), o_esplmap.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_multimap ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::multimap o_podmultimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_podmultimap.insert({key, random_value(gen)}); o_podmultimap.insert({key, random_value(gen)}); } std::multimap o_isermultimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_isermultimap.insert({key, { random_value(gen), random_value(gen) }}); o_isermultimap.insert({key, { random_value(gen), random_value(gen) }}); } std::multimap o_isplmultimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_isplmultimap.insert({key, { random_value(gen), random_value(gen) }}); o_isplmultimap.insert({key, { random_value(gen), random_value(gen) }}); } std::multimap o_esermultimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_esermultimap.insert({key, { random_value(gen), random_value(gen) }}); o_esermultimap.insert({key, { random_value(gen), random_value(gen) }}); } std::multimap o_esplmultimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_esplmultimap.insert({key, { random_value(gen), random_value(gen) }}); o_esplmultimap.insert({key, { random_value(gen), random_value(gen) }}); } oar & o_podmultimap; oar & o_isermultimap; oar & o_isplmultimap; oar & o_esermultimap; oar & o_esplmultimap; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::multimap i_podmultimap; std::multimap i_isermultimap; std::multimap i_isplmultimap; std::multimap i_esermultimap; std::multimap i_esplmultimap; iar & i_podmultimap; iar & i_isermultimap; iar & i_isplmultimap; iar & i_esermultimap; iar & i_esplmultimap; BOOST_CHECK_EQUAL_COLLECTIONS(i_podmultimap.begin(), i_podmultimap.end(), o_podmultimap.begin(), o_podmultimap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isermultimap.begin(), i_isermultimap.end(), o_isermultimap.begin(), o_isermultimap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplmultimap.begin(), i_isplmultimap.end(), o_isplmultimap.begin(), o_isplmultimap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esermultimap.begin(), i_esermultimap.end(), o_esermultimap.begin(), o_esermultimap.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplmultimap.begin(), i_esplmultimap.end(), o_esplmultimap.begin(), o_esplmultimap.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_memory ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::shared_ptr o_xptr1 = std::make_shared(random_value(gen)); std::shared_ptr o_xptr2 = o_xptr1; std::shared_ptr o_yptr1 = std::make_shared(random_value(gen)); std::shared_ptr o_yptr2 = o_yptr1; oar & o_xptr1 & o_xptr2; oar & o_yptr1 & o_yptr2; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::shared_ptr i_xptr1; std::shared_ptr i_xptr2; std::shared_ptr i_yptr1; std::shared_ptr i_yptr2; iar & i_xptr1 & i_xptr2; iar & i_yptr1 & i_yptr2; BOOST_CHECK_EQUAL(o_xptr1.get(), o_xptr2.get()); BOOST_CHECK_EQUAL(i_xptr1.get(), i_xptr2.get()); BOOST_CHECK_EQUAL(*i_xptr1, *i_xptr2); BOOST_CHECK_EQUAL(o_yptr1.get(), o_yptr2.get()); BOOST_CHECK_EQUAL(i_yptr1.get(), i_yptr2.get()); BOOST_CHECK_EQUAL(*i_yptr1, *i_yptr2); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_queue ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::queue o_podqueue; for(int j=0; j<100; ++j) o_podqueue.push(random_value(gen)); std::queue o_iserqueue; for(int j=0; j<100; ++j) o_iserqueue.push({ random_value(gen), random_value(gen) }); std::queue o_isplqueue; for(int j=0; j<100; ++j) o_isplqueue.push({ random_value(gen), random_value(gen) }); std::queue o_eserqueue; for(int j=0; j<100; ++j) o_eserqueue.push({ random_value(gen), random_value(gen) }); std::queue o_esplqueue; for(int j=0; j<100; ++j) o_esplqueue.push({ random_value(gen), random_value(gen) }); oar & o_podqueue; oar & o_iserqueue; oar & o_isplqueue; oar & o_eserqueue; oar & o_esplqueue; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::queue i_podqueue; std::queue i_iserqueue; std::queue i_isplqueue; std::queue i_eserqueue; std::queue i_esplqueue; iar & i_podqueue; iar & i_iserqueue; iar & i_isplqueue; iar & i_eserqueue; iar & i_esplqueue; auto & i_podqueue_c = cereal::queue_detail::container(i_podqueue); auto & i_iserqueue_c = cereal::queue_detail::container(i_iserqueue); auto & i_isplqueue_c = cereal::queue_detail::container(i_isplqueue); auto & i_eserqueue_c = cereal::queue_detail::container(i_eserqueue); auto & i_esplqueue_c = cereal::queue_detail::container(i_esplqueue); auto & o_podqueue_c = cereal::queue_detail::container(o_podqueue); auto & o_iserqueue_c = cereal::queue_detail::container(o_iserqueue); auto & o_isplqueue_c = cereal::queue_detail::container(o_isplqueue); auto & o_eserqueue_c = cereal::queue_detail::container(o_eserqueue); auto & o_esplqueue_c = cereal::queue_detail::container(o_esplqueue); BOOST_CHECK_EQUAL_COLLECTIONS(i_podqueue_c.begin(), i_podqueue_c.end(), o_podqueue_c.begin(), o_podqueue_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserqueue_c.begin(), i_iserqueue_c.end(), o_iserqueue_c.begin(), o_iserqueue_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplqueue_c.begin(), i_isplqueue_c.end(), o_isplqueue_c.begin(), o_isplqueue_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserqueue_c.begin(), i_eserqueue_c.end(), o_eserqueue_c.begin(), o_eserqueue_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplqueue_c.begin(), i_esplqueue_c.end(), o_esplqueue_c.begin(), o_esplqueue_c.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_set ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::set o_podset; for(int j=0; j<100; ++j) o_podset.insert(random_value(gen)); std::set o_iserset; for(int j=0; j<100; ++j) o_iserset.insert({ random_value(gen), random_value(gen) }); std::set o_isplset; for(int j=0; j<100; ++j) o_isplset.insert({ random_value(gen), random_value(gen) }); std::set o_eserset; for(int j=0; j<100; ++j) o_eserset.insert({ random_value(gen), random_value(gen) }); std::set o_esplset; for(int j=0; j<100; ++j) o_esplset.insert({ random_value(gen), random_value(gen) }); oar & o_podset; oar & o_iserset; oar & o_isplset; oar & o_eserset; oar & o_esplset; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::set i_podset; std::set i_iserset; std::set i_isplset; std::set i_eserset; std::set i_esplset; iar & i_podset; iar & i_iserset; iar & i_isplset; iar & i_eserset; iar & i_esplset; BOOST_CHECK_EQUAL_COLLECTIONS(i_podset.begin(), i_podset.end(), o_podset.begin(), o_podset.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserset.begin(), i_iserset.end(), o_iserset.begin(), o_iserset.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplset.begin(), i_isplset.end(), o_isplset.begin(), o_isplset.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserset.begin(), i_eserset.end(), o_eserset.begin(), o_eserset.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplset.begin(), i_esplset.end(), o_esplset.begin(), o_esplset.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_stack ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::stack o_podstack; for(int j=0; j<100; ++j) o_podstack.push(random_value(gen)); std::stack o_iserstack; for(int j=0; j<100; ++j) o_iserstack.push({ random_value(gen), random_value(gen) }); std::stack o_isplstack; for(int j=0; j<100; ++j) o_isplstack.push({ random_value(gen), random_value(gen) }); std::stack o_eserstack; for(int j=0; j<100; ++j) o_eserstack.push({ random_value(gen), random_value(gen) }); std::stack o_esplstack; for(int j=0; j<100; ++j) o_esplstack.push({ random_value(gen), random_value(gen) }); oar & o_podstack; oar & o_iserstack; oar & o_isplstack; oar & o_eserstack; oar & o_esplstack; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::stack i_podstack; std::stack i_iserstack; std::stack i_isplstack; std::stack i_eserstack; std::stack i_esplstack; iar & i_podstack; iar & i_iserstack; iar & i_isplstack; iar & i_eserstack; iar & i_esplstack; auto & i_podstack_c = cereal::stack_detail::container(i_podstack); auto & i_iserstack_c = cereal::stack_detail::container(i_iserstack); auto & i_isplstack_c = cereal::stack_detail::container(i_isplstack); auto & i_eserstack_c = cereal::stack_detail::container(i_eserstack); auto & i_esplstack_c = cereal::stack_detail::container(i_esplstack); auto & o_podstack_c = cereal::stack_detail::container(o_podstack); auto & o_iserstack_c = cereal::stack_detail::container(o_iserstack); auto & o_isplstack_c = cereal::stack_detail::container(o_isplstack); auto & o_eserstack_c = cereal::stack_detail::container(o_eserstack); auto & o_esplstack_c = cereal::stack_detail::container(o_esplstack); BOOST_CHECK_EQUAL_COLLECTIONS(i_podstack_c.begin(), i_podstack_c.end(), o_podstack_c.begin(), o_podstack_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_iserstack_c.begin(), i_iserstack_c.end(), o_iserstack_c.begin(), o_iserstack_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_isplstack_c.begin(), i_isplstack_c.end(), o_isplstack_c.begin(), o_isplstack_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_eserstack_c.begin(), i_eserstack_c.end(), o_eserstack_c.begin(), o_eserstack_c.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_esplstack_c.begin(), i_esplstack_c.end(), o_esplstack_c.begin(), o_esplstack_c.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_string ) { std::random_device rd; std::mt19937 gen(rd()); for(size_t i=0; i<100; ++i) { std::basic_string o_string = random_basic_string(gen); std::basic_string o_wstring = random_basic_string(gen); std::basic_string o_u16string = random_basic_string(gen); std::basic_string o_u32string = random_basic_string(gen); std::ostringstream os; cereal::BinaryOutputArchive oar(os); oar & o_string; oar & o_wstring; oar & o_u16string; oar & o_u32string; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::basic_string i_string; std::basic_string i_wstring; std::basic_string i_u16string; std::basic_string i_u32string; iar & i_string; iar & i_wstring; iar & i_u16string; iar & i_u32string; BOOST_CHECK_EQUAL(i_string, o_string); BOOST_CHECK_EQUAL_COLLECTIONS(i_wstring.begin(), i_wstring.end(), o_wstring.begin(), o_wstring.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_u16string.begin(), i_u16string.end(), o_u16string.begin(), o_u16string.end()); BOOST_CHECK_EQUAL_COLLECTIONS(i_u32string.begin(), i_u32string.end(), o_u32string.begin(), o_u32string.end()); } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_unordered_map ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::unordered_map o_podunordered_map; for(int j=0; j<100; ++j) o_podunordered_map.insert({random_value(gen), random_value(gen)}); std::unordered_map o_iserunordered_map; for(int j=0; j<100; ++j) o_iserunordered_map.insert({random_value(gen), { random_value(gen), random_value(gen) }}); std::unordered_map o_isplunordered_map; for(int j=0; j<100; ++j) o_isplunordered_map.insert({random_value(gen), { random_value(gen), random_value(gen) }}); std::unordered_map o_eserunordered_map; for(int j=0; j<100; ++j) o_eserunordered_map.insert({random_value(gen), { random_value(gen), random_value(gen) }}); std::unordered_map o_esplunordered_map; for(int j=0; j<100; ++j) o_esplunordered_map.insert({random_value(gen), { random_value(gen), random_value(gen) }}); oar & o_podunordered_map; oar & o_iserunordered_map; oar & o_isplunordered_map; oar & o_eserunordered_map; oar & o_esplunordered_map; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::unordered_map i_podunordered_map; std::unordered_map i_iserunordered_map; std::unordered_map i_isplunordered_map; std::unordered_map i_eserunordered_map; std::unordered_map i_esplunordered_map; iar & i_podunordered_map; iar & i_iserunordered_map; iar & i_isplunordered_map; iar & i_eserunordered_map; iar & i_esplunordered_map; for(auto const & p : i_podunordered_map) { auto v = o_podunordered_map.find(p.first); BOOST_CHECK(v != o_podunordered_map.end()); BOOST_CHECK_EQUAL(p.second, v->second); } for(auto const & p : i_iserunordered_map) { auto v = o_iserunordered_map.find(p.first); BOOST_CHECK(v != o_iserunordered_map.end()); BOOST_CHECK_EQUAL(p.second, v->second); } for(auto const & p : i_isplunordered_map) { auto v = o_isplunordered_map.find(p.first); BOOST_CHECK(v != o_isplunordered_map.end()); BOOST_CHECK_EQUAL(p.second, v->second); } for(auto const & p : i_eserunordered_map) { auto v = o_eserunordered_map.find(p.first); BOOST_CHECK(v != o_eserunordered_map.end()); BOOST_CHECK_EQUAL(p.second, v->second); } for(auto const & p : i_esplunordered_map) { auto v = o_esplunordered_map.find(p.first); BOOST_CHECK(v != o_esplunordered_map.end()); BOOST_CHECK_EQUAL(p.second, v->second); } } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_unordered_multimap ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::unordered_multimap o_podunordered_multimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_podunordered_multimap.insert({key, random_value(gen)}); o_podunordered_multimap.insert({key, random_value(gen)}); } std::unordered_multimap o_iserunordered_multimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_iserunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); o_iserunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); } std::unordered_multimap o_isplunordered_multimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_isplunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); o_isplunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); } std::unordered_multimap o_eserunordered_multimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_eserunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); o_eserunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); } std::unordered_multimap o_esplunordered_multimap; for(int j=0; j<100; ++j) { auto key = random_value(gen); o_esplunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); o_esplunordered_multimap.insert({key, { random_value(gen), random_value(gen) }}); } oar & o_podunordered_multimap; oar & o_iserunordered_multimap; oar & o_isplunordered_multimap; oar & o_eserunordered_multimap; oar & o_esplunordered_multimap; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::unordered_multimap i_podunordered_multimap; std::unordered_multimap i_iserunordered_multimap; std::unordered_multimap i_isplunordered_multimap; std::unordered_multimap i_eserunordered_multimap; std::unordered_multimap i_esplunordered_multimap; iar & i_podunordered_multimap; iar & i_iserunordered_multimap; iar & i_isplunordered_multimap; iar & i_eserunordered_multimap; iar & i_esplunordered_multimap; BOOST_CHECK_EQUAL(i_podunordered_multimap.size(), o_podunordered_multimap.size()); BOOST_CHECK_EQUAL(i_iserunordered_multimap.size(), o_iserunordered_multimap.size()); BOOST_CHECK_EQUAL(i_isplunordered_multimap.size(), o_isplunordered_multimap.size()); BOOST_CHECK_EQUAL(i_eserunordered_multimap.size(), o_eserunordered_multimap.size()); BOOST_CHECK_EQUAL(i_esplunordered_multimap.size(), o_esplunordered_multimap.size()); for(auto const & p : i_podunordered_multimap) { size_t const bucket = o_podunordered_multimap.bucket(p.first); auto bucket_begin = o_podunordered_multimap.begin(bucket); auto bucket_end = o_podunordered_multimap.end(bucket); BOOST_CHECK(std::find(bucket_begin, bucket_end, p) != bucket_end); } for(auto const & p : i_iserunordered_multimap) { size_t const bucket = o_iserunordered_multimap.bucket(p.first); auto bucket_begin = o_iserunordered_multimap.begin(bucket); auto bucket_end = o_iserunordered_multimap.end(bucket); BOOST_CHECK(std::find(bucket_begin, bucket_end, p) != bucket_end); } for(auto const & p : i_isplunordered_multimap) { size_t const bucket = o_isplunordered_multimap.bucket(p.first); auto bucket_begin = o_isplunordered_multimap.begin(bucket); auto bucket_end = o_isplunordered_multimap.end(bucket); BOOST_CHECK(std::find(bucket_begin, bucket_end, p) != bucket_end); } for(auto const & p : i_eserunordered_multimap) { size_t const bucket = o_eserunordered_multimap.bucket(p.first); auto bucket_begin = o_eserunordered_multimap.begin(bucket); auto bucket_end = o_eserunordered_multimap.end(bucket); BOOST_CHECK(std::find(bucket_begin, bucket_end, p) != bucket_end); } for(auto const & p : i_esplunordered_multimap) { size_t const bucket = o_esplunordered_multimap.bucket(p.first); auto bucket_begin = o_esplunordered_multimap.begin(bucket); auto bucket_end = o_esplunordered_multimap.end(bucket); BOOST_CHECK(std::find(bucket_begin, bucket_end, p) != bucket_end); } } } // ###################################################################### BOOST_AUTO_TEST_CASE( binary_unordered_set ) { std::random_device rd; std::mt19937 gen(rd()); for(int i=0; i<100; ++i) { std::ostringstream os; cereal::BinaryOutputArchive oar(os); std::unordered_set o_podunordered_set; for(int j=0; j<100; ++j) o_podunordered_set.insert(random_value(gen)); std::unordered_set> o_iserunordered_set; for(int j=0; j<100; ++j) o_iserunordered_set.insert({ random_value(gen), random_value(gen) }); std::unordered_set> o_isplunordered_set; for(int j=0; j<100; ++j) o_isplunordered_set.insert({ random_value(gen), random_value(gen) }); std::unordered_set> o_eserunordered_set; for(int j=0; j<100; ++j) o_eserunordered_set.insert({ random_value(gen), random_value(gen) }); std::unordered_set> o_esplunordered_set; for(int j=0; j<100; ++j) o_esplunordered_set.insert({ random_value(gen), random_value(gen) }); oar & o_podunordered_set; oar & o_iserunordered_set; oar & o_isplunordered_set; oar & o_eserunordered_set; oar & o_esplunordered_set; std::istringstream is(os.str()); cereal::BinaryInputArchive iar(is); std::unordered_set i_podunordered_set; std::unordered_set> i_iserunordered_set; std::unordered_set> i_isplunordered_set; std::unordered_set> i_eserunordered_set; std::unordered_set> i_esplunordered_set; iar & i_podunordered_set; iar & i_iserunordered_set; iar & i_isplunordered_set; iar & i_eserunordered_set; iar & i_esplunordered_set; for(auto const & p : i_podunordered_set) { BOOST_CHECK_EQUAL(o_podunordered_set.count(p), 1); } for(auto const & p : i_iserunordered_set) { BOOST_CHECK_EQUAL(o_iserunordered_set.count(p), 1); } for(auto const & p : i_isplunordered_set) { BOOST_CHECK_EQUAL(o_isplunordered_set.count(p), 1); } for(auto const & p : i_eserunordered_set) { BOOST_CHECK_EQUAL(o_eserunordered_set.count(p), 1); } for(auto const & p : i_esplunordered_set) { BOOST_CHECK_EQUAL(o_esplunordered_set.count(p), 1); } } }