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