Chris@16: // Copyright Sebastian Ramacher, 2007. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PTR_CONTAINER_DETAIL_SERIALIZE_REVERSIBLE_PTR_CONTAINER_HPP Chris@16: #define BOOST_PTR_CONTAINER_DETAIL_SERIALIZE_REVERSIBLE_PTR_CONTAINER_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: namespace ptr_container_detail Chris@16: { Chris@16: Chris@16: template Chris@16: void save_helper(Archive& ar, const ptr_container_detail::reversible_ptr_container& c) Chris@16: { Chris@16: typedef ptr_container_detail::reversible_ptr_container container_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME container_type::const_iterator const_iterator; Chris@16: typedef BOOST_DEDUCED_TYPENAME container_type::value_type value_type; Chris@16: Chris@16: const_iterator i = c.begin(), e = c.end(); Chris@16: for(; i != e; ++i) Chris@16: ar << boost::serialization::make_nvp( ptr_container_detail::item(), Chris@16: ptr_container_detail::serialize_as_const(static_cast(*i.base()))); Chris@16: } Chris@16: Chris@16: template Chris@16: void load_helper(Archive& ar, ptr_container_detail::reversible_ptr_container& c, Chris@16: BOOST_DEDUCED_TYPENAME ptr_container_detail::reversible_ptr_container::size_type n) Chris@16: { Chris@16: typedef ptr_container_detail::reversible_ptr_container container_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME container_type::size_type size_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME container_type::value_type value_type; Chris@16: Chris@16: // Chris@16: // Called after an appropriate reserve on c. Chris@16: // Chris@16: Chris@16: c.clear(); Chris@16: for(size_type i = 0u; i != n; ++i) Chris@16: { Chris@16: // Chris@16: // Remark: pointers are not tracked, Chris@16: // so we need not call ar.reset_object_address(v, u) Chris@16: // Chris@16: value_type ptr; Chris@16: ar >> boost::serialization::make_nvp( ptr_container_detail::item(), ptr ); Chris@16: c.insert(c.end(), ptr); Chris@16: } Chris@16: } Chris@16: Chris@16: } // namespace ptr_container_detail Chris@16: Chris@16: namespace serialization Chris@16: { Chris@16: Chris@16: template Chris@16: void save(Archive& ar, const ptr_container_detail::reversible_ptr_container& c, unsigned int /*version*/) Chris@16: { Chris@16: ar << boost::serialization::make_nvp( ptr_container_detail::count(), Chris@16: ptr_container_detail::serialize_as_const(c.size()) ); Chris@16: ptr_container_detail::save_helper(ar, c); Chris@16: } Chris@16: Chris@16: template Chris@16: void load(Archive& ar, ptr_container_detail::reversible_ptr_container& c, unsigned int /*version*/) Chris@16: { Chris@16: typedef ptr_container_detail::reversible_ptr_container container_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME container_type::size_type size_type; Chris@16: Chris@16: size_type n; Chris@16: ar >> boost::serialization::make_nvp( ptr_container_detail::count(), n ); Chris@16: ptr_container_detail::load_helper(ar, c, n); Chris@16: Chris@16: } Chris@16: Chris@16: } // namespace serialization Chris@16: } // namespace boost Chris@16: Chris@16: #endif