Chris@102: #ifndef BOOST_SERIALIZATION_UNORDERED_MAP_HPP Chris@102: #define BOOST_SERIALIZATION_UNORDERED_MAP_HPP Chris@102: Chris@102: // MS compatible compilers support #pragma once Chris@102: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@102: // serialization/unordered_map.hpp: Chris@102: // serialization for stl unordered_map templates Chris@102: Chris@102: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Chris@102: // (C) Copyright 2014 Jim Bell Chris@102: // Use, modification and distribution is subject to the Boost Software Chris@102: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: Chris@102: // See http://www.boost.org for updates, documentation, and revision history. Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace serialization { Chris@102: Chris@102: namespace stl { Chris@102: Chris@102: // map input Chris@102: template Chris@102: struct archive_input_unordered_map Chris@102: { Chris@102: inline void operator()( Chris@102: Archive &ar, Chris@102: Container &s, Chris@102: const unsigned int v Chris@102: ){ Chris@102: typedef typename Container::value_type type; Chris@102: detail::stack_construct t(ar, v); Chris@102: // borland fails silently w/o full namespace Chris@102: ar >> boost::serialization::make_nvp("item", t.reference()); Chris@102: std::pair result = Chris@102: s.insert(t.reference()); Chris@102: // note: the following presumes that the map::value_type was NOT tracked Chris@102: // in the archive. This is the usual case, but here there is no way Chris@102: // to determine that. Chris@102: if(result.second){ Chris@102: ar.reset_object_address( Chris@102: & (result.first->second), Chris@102: & t.reference().second Chris@102: ); Chris@102: } Chris@102: } Chris@102: }; Chris@102: Chris@102: // multimap input Chris@102: template Chris@102: struct archive_input_unordered_multimap Chris@102: { Chris@102: inline void operator()( Chris@102: Archive &ar, Chris@102: Container &s, Chris@102: const unsigned int v Chris@102: ){ Chris@102: typedef typename Container::value_type type; Chris@102: detail::stack_construct t(ar, v); Chris@102: // borland fails silently w/o full namespace Chris@102: ar >> boost::serialization::make_nvp("item", t.reference()); Chris@102: typename Container::const_iterator result Chris@102: = s.insert(t.reference()); Chris@102: // note: the following presumes that the map::value_type was NOT tracked Chris@102: // in the archive. This is the usual case, but here there is no way Chris@102: // to determine that. Chris@102: ar.reset_object_address( Chris@102: & result->second, Chris@102: & t.reference() Chris@102: ); Chris@102: } Chris@102: }; Chris@102: Chris@102: } // stl Chris@102: Chris@102: template< Chris@102: class Archive, Chris@102: class Key, Chris@102: class HashFcn, Chris@102: class EqualKey, Chris@102: class Allocator Chris@102: > Chris@102: inline void save( Chris@102: Archive & ar, Chris@102: const std::unordered_map< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > &t, Chris@102: const unsigned int /*file_version*/ Chris@102: ){ Chris@102: boost::serialization::stl::save_unordered_collection< Chris@102: Archive, Chris@102: std::unordered_map< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > Chris@102: >(ar, t); Chris@102: } Chris@102: Chris@102: template< Chris@102: class Archive, Chris@102: class Key, Chris@102: class HashFcn, Chris@102: class EqualKey, Chris@102: class Allocator Chris@102: > Chris@102: inline void load( Chris@102: Archive & ar, Chris@102: std::unordered_map< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > &t, Chris@102: const unsigned int /*file_version*/ Chris@102: ){ Chris@102: boost::serialization::stl::load_unordered_collection< Chris@102: Archive, Chris@102: std::unordered_map< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: >, Chris@102: boost::serialization::stl::archive_input_unordered_map< Chris@102: Archive, Chris@102: std::unordered_map< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > Chris@102: > Chris@102: >(ar, t); Chris@102: } Chris@102: Chris@102: // split non-intrusive serialization function member into separate Chris@102: // non intrusive save/load member functions Chris@102: template< Chris@102: class Archive, Chris@102: class Key, Chris@102: class HashFcn, Chris@102: class EqualKey, Chris@102: class Allocator Chris@102: > Chris@102: inline void serialize( Chris@102: Archive & ar, Chris@102: std::unordered_map< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > &t, Chris@102: const unsigned int file_version Chris@102: ){ Chris@102: boost::serialization::split_free(ar, t, file_version); Chris@102: } Chris@102: Chris@102: // unordered_multimap Chris@102: template< Chris@102: class Archive, Chris@102: class Key, Chris@102: class HashFcn, Chris@102: class EqualKey, Chris@102: class Allocator Chris@102: > Chris@102: inline void save( Chris@102: Archive & ar, Chris@102: const std::unordered_multimap< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > &t, Chris@102: const unsigned int /*file_version*/ Chris@102: ){ Chris@102: boost::serialization::stl::save_unordered_collection< Chris@102: Archive, Chris@102: std::unordered_multimap< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > Chris@102: >(ar, t); Chris@102: } Chris@102: Chris@102: template< Chris@102: class Archive, Chris@102: class Key, Chris@102: class HashFcn, Chris@102: class EqualKey, Chris@102: class Allocator Chris@102: > Chris@102: inline void load( Chris@102: Archive & ar, Chris@102: std::unordered_multimap< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > &t, Chris@102: const unsigned int /*file_version*/ Chris@102: ){ Chris@102: boost::serialization::stl::load_unordered_collection< Chris@102: Archive, Chris@102: std::unordered_multimap< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: >, Chris@102: boost::serialization::stl::archive_input_unordered_multimap< Chris@102: Archive, Chris@102: std::unordered_multimap< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > Chris@102: > Chris@102: >(ar, t); Chris@102: } Chris@102: Chris@102: // split non-intrusive serialization function member into separate Chris@102: // non intrusive save/load member functions Chris@102: template< Chris@102: class Archive, Chris@102: class Key, Chris@102: class HashFcn, Chris@102: class EqualKey, Chris@102: class Allocator Chris@102: > Chris@102: inline void serialize( Chris@102: Archive & ar, Chris@102: std::unordered_multimap< Chris@102: Key, HashFcn, EqualKey, Allocator Chris@102: > &t, Chris@102: const unsigned int file_version Chris@102: ){ Chris@102: boost::serialization::split_free(ar, t, file_version); Chris@102: } Chris@102: Chris@102: } // namespace serialization Chris@102: } // namespace boost Chris@102: Chris@102: #endif // BOOST_SERIALIZATION_UNORDERED_MAP_HPP