diff options
Diffstat (limited to 'boost/serialization/map.hpp')
-rw-r--r-- | boost/serialization/map.hpp | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/boost/serialization/map.hpp b/boost/serialization/map.hpp index 11a3d6bbc8..1358d49b7a 100644 --- a/boost/serialization/map.hpp +++ b/boost/serialization/map.hpp @@ -10,7 +10,7 @@ // serialization/map.hpp: // serialization for stl map templates -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002-2014 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to 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) @@ -21,14 +21,51 @@ #include <boost/config.hpp> +#include <boost/archive/detail/basic_iarchive.hpp> +#include <boost/serialization/access.hpp> +#include <boost/serialization/nvp.hpp> +#include <boost/serialization/collection_size_type.hpp> +#include <boost/serialization/item_version_type.hpp> +#include <boost/serialization/detail/stack_constructor.hpp> + #include <boost/serialization/utility.hpp> #include <boost/serialization/collections_save_imp.hpp> -#include <boost/serialization/collections_load_imp.hpp> #include <boost/serialization/split_free.hpp> namespace boost { namespace serialization { +////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 +// implementation of serialization for map and mult-map STL containers + +template<class Archive, class Container> +inline void load_map_collection(Archive & ar, Container &s) +{ + s.clear(); + const boost::archive::library_version_type library_version( + ar.get_library_version() + ); + // retrieve number of elements + item_version_type item_version(0); + collection_size_type count; + ar >> BOOST_SERIALIZATION_NVP(count); + if(boost::archive::library_version_type(3) < library_version){ + ar >> BOOST_SERIALIZATION_NVP(item_version); + } + typename Container::iterator hint; + hint = s.begin(); + while(count-- > 0){ + typedef typename Container::value_type type; + detail::stack_construct<Archive, type> t(ar, item_version); + // borland fails silently w/o full namespace + ar >> boost::serialization::make_nvp("item", t.reference()); + typename Container::iterator result = s.insert(hint, t.reference()); + ar.reset_object_address(& (result->second), & t.reference().second); + hint = result; + } +} + +// map template<class Archive, class Type, class Key, class Compare, class Allocator > inline void save( Archive & ar, @@ -47,16 +84,7 @@ inline void load( std::map<Key, Type, Compare, Allocator> &t, const unsigned int /* file_version */ ){ - boost::serialization::stl::load_collection< - Archive, - std::map<Key, Type, Compare, Allocator>, - boost::serialization::stl::archive_input_map< - Archive, std::map<Key, Type, Compare, Allocator> >, - boost::serialization::stl::no_reserve_imp<std::map< - Key, Type, Compare, Allocator - > - > - >(ar, t); + load_map_collection(ar, t); } // split non-intrusive serialization function member into separate @@ -89,16 +117,7 @@ inline void load( std::multimap<Key, Type, Compare, Allocator> &t, const unsigned int /* file_version */ ){ - boost::serialization::stl::load_collection< - Archive, - std::multimap<Key, Type, Compare, Allocator>, - boost::serialization::stl::archive_input_map< - Archive, std::multimap<Key, Type, Compare, Allocator> - >, - boost::serialization::stl::no_reserve_imp< - std::multimap<Key, Type, Compare, Allocator> - > - >(ar, t); + load_map_collection(ar, t); } // split non-intrusive serialization function member into separate |