Chris@102
|
1 #ifndef BOOST_SERIALIZATION_UNORDERED_MAP_HPP
|
Chris@102
|
2 #define BOOST_SERIALIZATION_UNORDERED_MAP_HPP
|
Chris@102
|
3
|
Chris@102
|
4 // MS compatible compilers support #pragma once
|
Chris@102
|
5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
Chris@102
|
6 # pragma once
|
Chris@102
|
7 #endif
|
Chris@102
|
8
|
Chris@102
|
9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
Chris@102
|
10 // serialization/unordered_map.hpp:
|
Chris@102
|
11 // serialization for stl unordered_map templates
|
Chris@102
|
12
|
Chris@102
|
13 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
Chris@102
|
14 // (C) Copyright 2014 Jim Bell
|
Chris@102
|
15 // Use, modification and distribution is subject to the Boost Software
|
Chris@102
|
16 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
17 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
18
|
Chris@102
|
19 // See http://www.boost.org for updates, documentation, and revision history.
|
Chris@102
|
20
|
Chris@102
|
21 #include <boost/config.hpp>
|
Chris@102
|
22
|
Chris@102
|
23 #include <unordered_map>
|
Chris@102
|
24
|
Chris@102
|
25 #include <boost/serialization/utility.hpp>
|
Chris@102
|
26 #include <boost/serialization/unordered_collections_save_imp.hpp>
|
Chris@102
|
27 #include <boost/serialization/unordered_collections_load_imp.hpp>
|
Chris@102
|
28 #include <boost/serialization/split_free.hpp>
|
Chris@102
|
29
|
Chris@102
|
30 namespace boost {
|
Chris@102
|
31 namespace serialization {
|
Chris@102
|
32
|
Chris@102
|
33 namespace stl {
|
Chris@102
|
34
|
Chris@102
|
35 // map input
|
Chris@102
|
36 template<class Archive, class Container>
|
Chris@102
|
37 struct archive_input_unordered_map
|
Chris@102
|
38 {
|
Chris@102
|
39 inline void operator()(
|
Chris@102
|
40 Archive &ar,
|
Chris@102
|
41 Container &s,
|
Chris@102
|
42 const unsigned int v
|
Chris@102
|
43 ){
|
Chris@102
|
44 typedef typename Container::value_type type;
|
Chris@102
|
45 detail::stack_construct<Archive, type> t(ar, v);
|
Chris@102
|
46 // borland fails silently w/o full namespace
|
Chris@102
|
47 ar >> boost::serialization::make_nvp("item", t.reference());
|
Chris@102
|
48 std::pair<typename Container::const_iterator, bool> result =
|
Chris@102
|
49 s.insert(t.reference());
|
Chris@102
|
50 // note: the following presumes that the map::value_type was NOT tracked
|
Chris@102
|
51 // in the archive. This is the usual case, but here there is no way
|
Chris@102
|
52 // to determine that.
|
Chris@102
|
53 if(result.second){
|
Chris@102
|
54 ar.reset_object_address(
|
Chris@102
|
55 & (result.first->second),
|
Chris@102
|
56 & t.reference().second
|
Chris@102
|
57 );
|
Chris@102
|
58 }
|
Chris@102
|
59 }
|
Chris@102
|
60 };
|
Chris@102
|
61
|
Chris@102
|
62 // multimap input
|
Chris@102
|
63 template<class Archive, class Container>
|
Chris@102
|
64 struct archive_input_unordered_multimap
|
Chris@102
|
65 {
|
Chris@102
|
66 inline void operator()(
|
Chris@102
|
67 Archive &ar,
|
Chris@102
|
68 Container &s,
|
Chris@102
|
69 const unsigned int v
|
Chris@102
|
70 ){
|
Chris@102
|
71 typedef typename Container::value_type type;
|
Chris@102
|
72 detail::stack_construct<Archive, type> t(ar, v);
|
Chris@102
|
73 // borland fails silently w/o full namespace
|
Chris@102
|
74 ar >> boost::serialization::make_nvp("item", t.reference());
|
Chris@102
|
75 typename Container::const_iterator result
|
Chris@102
|
76 = s.insert(t.reference());
|
Chris@102
|
77 // note: the following presumes that the map::value_type was NOT tracked
|
Chris@102
|
78 // in the archive. This is the usual case, but here there is no way
|
Chris@102
|
79 // to determine that.
|
Chris@102
|
80 ar.reset_object_address(
|
Chris@102
|
81 & result->second,
|
Chris@102
|
82 & t.reference()
|
Chris@102
|
83 );
|
Chris@102
|
84 }
|
Chris@102
|
85 };
|
Chris@102
|
86
|
Chris@102
|
87 } // stl
|
Chris@102
|
88
|
Chris@102
|
89 template<
|
Chris@102
|
90 class Archive,
|
Chris@102
|
91 class Key,
|
Chris@102
|
92 class HashFcn,
|
Chris@102
|
93 class EqualKey,
|
Chris@102
|
94 class Allocator
|
Chris@102
|
95 >
|
Chris@102
|
96 inline void save(
|
Chris@102
|
97 Archive & ar,
|
Chris@102
|
98 const std::unordered_map<
|
Chris@102
|
99 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
100 > &t,
|
Chris@102
|
101 const unsigned int /*file_version*/
|
Chris@102
|
102 ){
|
Chris@102
|
103 boost::serialization::stl::save_unordered_collection<
|
Chris@102
|
104 Archive,
|
Chris@102
|
105 std::unordered_map<
|
Chris@102
|
106 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
107 >
|
Chris@102
|
108 >(ar, t);
|
Chris@102
|
109 }
|
Chris@102
|
110
|
Chris@102
|
111 template<
|
Chris@102
|
112 class Archive,
|
Chris@102
|
113 class Key,
|
Chris@102
|
114 class HashFcn,
|
Chris@102
|
115 class EqualKey,
|
Chris@102
|
116 class Allocator
|
Chris@102
|
117 >
|
Chris@102
|
118 inline void load(
|
Chris@102
|
119 Archive & ar,
|
Chris@102
|
120 std::unordered_map<
|
Chris@102
|
121 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
122 > &t,
|
Chris@102
|
123 const unsigned int /*file_version*/
|
Chris@102
|
124 ){
|
Chris@102
|
125 boost::serialization::stl::load_unordered_collection<
|
Chris@102
|
126 Archive,
|
Chris@102
|
127 std::unordered_map<
|
Chris@102
|
128 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
129 >,
|
Chris@102
|
130 boost::serialization::stl::archive_input_unordered_map<
|
Chris@102
|
131 Archive,
|
Chris@102
|
132 std::unordered_map<
|
Chris@102
|
133 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
134 >
|
Chris@102
|
135 >
|
Chris@102
|
136 >(ar, t);
|
Chris@102
|
137 }
|
Chris@102
|
138
|
Chris@102
|
139 // split non-intrusive serialization function member into separate
|
Chris@102
|
140 // non intrusive save/load member functions
|
Chris@102
|
141 template<
|
Chris@102
|
142 class Archive,
|
Chris@102
|
143 class Key,
|
Chris@102
|
144 class HashFcn,
|
Chris@102
|
145 class EqualKey,
|
Chris@102
|
146 class Allocator
|
Chris@102
|
147 >
|
Chris@102
|
148 inline void serialize(
|
Chris@102
|
149 Archive & ar,
|
Chris@102
|
150 std::unordered_map<
|
Chris@102
|
151 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
152 > &t,
|
Chris@102
|
153 const unsigned int file_version
|
Chris@102
|
154 ){
|
Chris@102
|
155 boost::serialization::split_free(ar, t, file_version);
|
Chris@102
|
156 }
|
Chris@102
|
157
|
Chris@102
|
158 // unordered_multimap
|
Chris@102
|
159 template<
|
Chris@102
|
160 class Archive,
|
Chris@102
|
161 class Key,
|
Chris@102
|
162 class HashFcn,
|
Chris@102
|
163 class EqualKey,
|
Chris@102
|
164 class Allocator
|
Chris@102
|
165 >
|
Chris@102
|
166 inline void save(
|
Chris@102
|
167 Archive & ar,
|
Chris@102
|
168 const std::unordered_multimap<
|
Chris@102
|
169 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
170 > &t,
|
Chris@102
|
171 const unsigned int /*file_version*/
|
Chris@102
|
172 ){
|
Chris@102
|
173 boost::serialization::stl::save_unordered_collection<
|
Chris@102
|
174 Archive,
|
Chris@102
|
175 std::unordered_multimap<
|
Chris@102
|
176 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
177 >
|
Chris@102
|
178 >(ar, t);
|
Chris@102
|
179 }
|
Chris@102
|
180
|
Chris@102
|
181 template<
|
Chris@102
|
182 class Archive,
|
Chris@102
|
183 class Key,
|
Chris@102
|
184 class HashFcn,
|
Chris@102
|
185 class EqualKey,
|
Chris@102
|
186 class Allocator
|
Chris@102
|
187 >
|
Chris@102
|
188 inline void load(
|
Chris@102
|
189 Archive & ar,
|
Chris@102
|
190 std::unordered_multimap<
|
Chris@102
|
191 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
192 > &t,
|
Chris@102
|
193 const unsigned int /*file_version*/
|
Chris@102
|
194 ){
|
Chris@102
|
195 boost::serialization::stl::load_unordered_collection<
|
Chris@102
|
196 Archive,
|
Chris@102
|
197 std::unordered_multimap<
|
Chris@102
|
198 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
199 >,
|
Chris@102
|
200 boost::serialization::stl::archive_input_unordered_multimap<
|
Chris@102
|
201 Archive,
|
Chris@102
|
202 std::unordered_multimap<
|
Chris@102
|
203 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
204 >
|
Chris@102
|
205 >
|
Chris@102
|
206 >(ar, t);
|
Chris@102
|
207 }
|
Chris@102
|
208
|
Chris@102
|
209 // split non-intrusive serialization function member into separate
|
Chris@102
|
210 // non intrusive save/load member functions
|
Chris@102
|
211 template<
|
Chris@102
|
212 class Archive,
|
Chris@102
|
213 class Key,
|
Chris@102
|
214 class HashFcn,
|
Chris@102
|
215 class EqualKey,
|
Chris@102
|
216 class Allocator
|
Chris@102
|
217 >
|
Chris@102
|
218 inline void serialize(
|
Chris@102
|
219 Archive & ar,
|
Chris@102
|
220 std::unordered_multimap<
|
Chris@102
|
221 Key, HashFcn, EqualKey, Allocator
|
Chris@102
|
222 > &t,
|
Chris@102
|
223 const unsigned int file_version
|
Chris@102
|
224 ){
|
Chris@102
|
225 boost::serialization::split_free(ar, t, file_version);
|
Chris@102
|
226 }
|
Chris@102
|
227
|
Chris@102
|
228 } // namespace serialization
|
Chris@102
|
229 } // namespace boost
|
Chris@102
|
230
|
Chris@102
|
231 #endif // BOOST_SERIALIZATION_UNORDERED_MAP_HPP
|