void test_polymorphic() { std::random_device rd; std::mt19937 gen(rd()); auto rngB = [&](){ return random_value<int>( gen ) % 2 == 0; }; auto rngI = [&](){ return random_value<int>( gen ); }; auto rngF = [&](){ return random_value<float>( gen ); }; auto rngD = [&](){ return random_value<double>( gen ); }; for(int ii=0; ii<100; ++ii) { std::shared_ptr<PolyBase> o_shared = std::make_shared<PolyDerived>( rngI(), rngF(), rngB(), rngD() ); std::weak_ptr<PolyBase> o_weak = o_shared; std::unique_ptr<PolyBase> o_unique( new PolyDerived( rngI(), rngF(), rngB(), rngD() ) ); auto pda = std::make_shared<PolyDerivedLA>( rngI() ); pda->vec.emplace_back( std::make_shared<PolyDerivedLA>( rngI() ) ); std::shared_ptr<PolyLA> o_sharedLA = pda; std::ostringstream os; { OArchive oar(os); oar( o_shared, o_weak, o_unique ); oar( o_sharedLA ); } decltype(o_shared) i_shared; decltype(o_weak) i_weak; decltype(o_unique) i_unique; decltype(o_sharedLA) i_sharedLA; std::istringstream is(os.str()); { IArchive iar(is); iar( i_shared, i_weak, i_unique ); iar( i_sharedLA ); } auto i_locked = i_weak.lock(); auto o_locked = o_weak.lock(); auto i_sharedLA2 = i_sharedLA->shared_from_this(); BOOST_CHECK_EQUAL(i_shared.get(), i_locked.get()); BOOST_CHECK_EQUAL(*((PolyDerived*)i_shared.get()), *((PolyDerived*)o_shared.get())); BOOST_CHECK_EQUAL(*((PolyDerived*)i_shared.get()), *((PolyDerived*)i_locked.get())); BOOST_CHECK_EQUAL(*((PolyDerived*)i_locked.get()), *((PolyDerived*)o_locked.get())); BOOST_CHECK_EQUAL(*((PolyDerived*)i_unique.get()), *((PolyDerived*)o_unique.get())); BOOST_CHECK_EQUAL(*((PolyDerivedLA*)i_sharedLA.get()), *((PolyDerivedLA*)o_sharedLA.get())); BOOST_CHECK_EQUAL(*((PolyDerivedLA*)i_sharedLA2.get()), *((PolyDerivedLA*)o_sharedLA.get())); } }
void test_polymorphic() { std::random_device rd; std::mt19937 gen(rd()); auto rngB = [&](){ return random_value<int>( gen ) % 2 == 0; }; auto rngI = [&](){ return random_value<int>( gen ); }; auto rngL = [&](){ return random_value<long>( gen ); }; auto rngF = [&](){ return random_value<float>( gen ); }; auto rngD = [&](){ return random_value<double>( gen ); }; for(int ii=0; ii<100; ++ii) { std::shared_ptr<PolyBase> o_shared = std::make_shared<PolyDerived>( rngI(), rngF(), rngB(), rngD() ); std::weak_ptr<PolyBase> o_weak = o_shared; std::unique_ptr<PolyBase> o_unique( new PolyDerived( rngI(), rngF(), rngB(), rngD() ) ); std::shared_ptr<PolyBaseA> o_sharedA = std::make_shared<PolyDerivedD>( random_basic_string<char>(gen), rngD(), rngI(), rngL() ); std::weak_ptr<PolyBaseA> o_weakA = o_sharedA; std::unique_ptr<PolyBaseA> o_uniqueA( new PolyDerivedD( random_basic_string<char>(gen), rngD(), rngI(), rngL() ) ); auto pda = std::make_shared<PolyDerivedLA>( rngI() ); pda->vec.emplace_back( std::make_shared<PolyDerivedLA>( rngI() ) ); std::shared_ptr<PolyLA> o_sharedLA = pda; std::ostringstream os; { OArchive oar(os); oar( o_shared, o_weak, o_unique ); oar( o_sharedLA ); oar( o_sharedA, o_weakA, o_uniqueA ); } decltype(o_shared) i_shared; decltype(o_weak) i_weak; decltype(o_unique) i_unique; decltype(o_sharedLA) i_sharedLA; decltype(o_sharedA) i_sharedA; decltype(o_weakA) i_weakA; decltype(o_uniqueA) i_uniqueA; std::istringstream is(os.str()); { IArchive iar(is); iar( i_shared, i_weak, i_unique ); iar( i_sharedLA ); iar( i_sharedA, i_weakA, i_uniqueA ); } auto i_locked = i_weak.lock(); auto o_locked = o_weak.lock(); auto i_sharedLA2 = i_sharedLA->shared_from_this(); auto i_lockedA = i_weakA.lock(); auto o_lockedA = o_weakA.lock(); #if CEREAL_THREAD_SAFE std::lock_guard<std::mutex> lock( boostTestMutex ); #endif BOOST_CHECK_EQUAL(i_shared.get(), i_locked.get()); BOOST_CHECK_EQUAL(*((PolyDerived*)i_shared.get()), *((PolyDerived*)o_shared.get())); BOOST_CHECK_EQUAL(*((PolyDerived*)i_shared.get()), *((PolyDerived*)i_locked.get())); BOOST_CHECK_EQUAL(*((PolyDerived*)i_locked.get()), *((PolyDerived*)o_locked.get())); BOOST_CHECK_EQUAL(*((PolyDerived*)i_unique.get()), *((PolyDerived*)o_unique.get())); BOOST_CHECK_EQUAL(*((PolyDerivedLA*)i_sharedLA.get()), *((PolyDerivedLA*)o_sharedLA.get())); BOOST_CHECK_EQUAL(*((PolyDerivedLA*)i_sharedLA2.get()), *((PolyDerivedLA*)o_sharedLA.get())); BOOST_CHECK_EQUAL(i_sharedA.get(), i_lockedA.get()); BOOST_CHECK_EQUAL(*dynamic_cast<PolyDerivedD*>(i_sharedA.get()), *dynamic_cast<PolyDerivedD*>(o_sharedA.get())); BOOST_CHECK_EQUAL(*dynamic_cast<PolyDerivedD*>(i_sharedA.get()), *dynamic_cast<PolyDerivedD*>(i_lockedA.get())); BOOST_CHECK_EQUAL(*dynamic_cast<PolyDerivedD*>(i_lockedA.get()), *dynamic_cast<PolyDerivedD*>(o_lockedA.get())); BOOST_CHECK_EQUAL(*dynamic_cast<PolyDerivedD*>(i_uniqueA.get()), *dynamic_cast<PolyDerivedD*>(o_uniqueA.get())); } }