/* Boost.MultiIndex serialization tests template. * * Copyright 2003-2008 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See http://www.boost.org/libs/multi_index for library home page. */ #include /* keep it first to prevent nasty warns in MSVC */ #include #include #include #include "pre_multi_index.hpp" #include #include #include #include #include template struct all_indices_equal_helper { template static bool compare( const MultiIndexContainer& m1,const MultiIndexContainer& m2) { if(!(boost::multi_index::get(m1)==boost::multi_index::get(m2))){ return false; } return all_indices_equal_helper::compare(m1,m2); } }; template<> struct all_indices_equal_helper<0> { template static bool compare( const MultiIndexContainer&,const MultiIndexContainer&) { return true; } }; template bool all_indices_equal( const MultiIndexContainer& m1,const MultiIndexContainer& m2) { BOOST_STATIC_CONSTANT(int, N=boost::mpl::size< BOOST_DEDUCED_TYPENAME MultiIndexContainer::index_type_list>::type::value); return all_indices_equal_helper::compare(m1,m2); } template void test_serialization(const MultiIndexContainer& m) { typedef typename MultiIndexContainer::iterator iterator; typedef typename MultiIndexContainer::const_iterator const_iterator; std::ostringstream oss; { boost::archive::text_oarchive oa(oss); oa< its(m.size()); const_iterator it_end=m.end(); for(const_iterator it=m.begin();it!=it_end;++it){ its.push_back(it); oa<(its.back()); } oa<(it_end); } MultiIndexContainer m2; std::istringstream iss(oss.str()); boost::archive::text_iarchive ia(iss); ia>>m2; BOOST_CHECK(all_indices_equal(m,m2)); iterator it_end=m2.end(); for(iterator it=m2.begin();it!=it_end;++it){ iterator it2; ia>>it2; BOOST_CHECK(it==it2); /* exercise safe mode with this (unchecked) iterator */ BOOST_CHECK(*it==*it2); m2.erase(it,it2); m2.erase(it2,it2); m2.erase(it2,it); iterator it3(++it2); iterator it4; it4=--it2; BOOST_CHECK(it==it4); BOOST_CHECK(it==boost::multi_index::project<0>(m2,it4)); } iterator it2; ia>>it2; BOOST_CHECK(it_end==it2); BOOST_CHECK(it_end==boost::multi_index::project<0>(m2,it2)); }