Chris@16
|
1 #ifndef BOOST_SERIALIZATION_VECTOR_HPP
|
Chris@16
|
2 #define BOOST_SERIALIZATION_VECTOR_HPP
|
Chris@16
|
3
|
Chris@16
|
4 // MS compatible compilers support #pragma once
|
Chris@16
|
5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
Chris@16
|
6 # pragma once
|
Chris@16
|
7 #endif
|
Chris@16
|
8
|
Chris@16
|
9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
Chris@16
|
10 // vector.hpp: serialization for stl vector templates
|
Chris@16
|
11
|
Chris@16
|
12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
Chris@16
|
13 // fast array serialization (C) Copyright 2005 Matthias Troyer
|
Chris@16
|
14 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
15 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
16 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
17
|
Chris@16
|
18 // See http://www.boost.org for updates, documentation, and revision history.
|
Chris@16
|
19
|
Chris@16
|
20 #include <vector>
|
Chris@16
|
21
|
Chris@16
|
22 #include <boost/config.hpp>
|
Chris@16
|
23 #include <boost/detail/workaround.hpp>
|
Chris@16
|
24 #include <boost/type_traits/is_arithmetic.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 #include <boost/serialization/collections_save_imp.hpp>
|
Chris@16
|
27 #include <boost/serialization/collections_load_imp.hpp>
|
Chris@16
|
28 #include <boost/serialization/split_free.hpp>
|
Chris@16
|
29 #include <boost/serialization/array.hpp>
|
Chris@16
|
30 #include <boost/serialization/detail/get_data.hpp>
|
Chris@16
|
31 #include <boost/mpl/bool.hpp>
|
Chris@16
|
32
|
Chris@16
|
33 // default is being compatible with version 1.34.1 files, not 1.35 files
|
Chris@16
|
34 #ifndef BOOST_SERIALIZATION_VECTOR_VERSIONED
|
Chris@16
|
35 #define BOOST_SERIALIZATION_VECTOR_VERSIONED(V) (V==4 || V==5)
|
Chris@16
|
36 #endif
|
Chris@16
|
37
|
Chris@16
|
38 // function specializations must be defined in the appropriate
|
Chris@16
|
39 // namespace - boost::serialization
|
Chris@16
|
40 #if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
|
Chris@16
|
41 #define STD _STLP_STD
|
Chris@16
|
42 #else
|
Chris@16
|
43 #define STD std
|
Chris@16
|
44 #endif
|
Chris@16
|
45
|
Chris@16
|
46 namespace boost {
|
Chris@16
|
47 namespace serialization {
|
Chris@16
|
48
|
Chris@16
|
49 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
Chris@16
|
50 // vector< T >
|
Chris@16
|
51
|
Chris@16
|
52 // the default versions
|
Chris@16
|
53
|
Chris@16
|
54 template<class Archive, class U, class Allocator>
|
Chris@16
|
55 inline void save(
|
Chris@16
|
56 Archive & ar,
|
Chris@16
|
57 const std::vector<U, Allocator> &t,
|
Chris@16
|
58 const unsigned int /* file_version */,
|
Chris@16
|
59 mpl::false_
|
Chris@16
|
60 ){
|
Chris@16
|
61 boost::serialization::stl::save_collection<Archive, STD::vector<U, Allocator> >(
|
Chris@16
|
62 ar, t
|
Chris@16
|
63 );
|
Chris@16
|
64 }
|
Chris@16
|
65
|
Chris@16
|
66 template<class Archive, class U, class Allocator>
|
Chris@16
|
67 inline void load(
|
Chris@16
|
68 Archive & ar,
|
Chris@16
|
69 std::vector<U, Allocator> &t,
|
Chris@16
|
70 const unsigned int /* file_version */,
|
Chris@16
|
71 mpl::false_
|
Chris@16
|
72 ){
|
Chris@16
|
73 boost::serialization::stl::load_collection<
|
Chris@16
|
74 Archive,
|
Chris@16
|
75 std::vector<U, Allocator>,
|
Chris@16
|
76 boost::serialization::stl::archive_input_seq<
|
Chris@16
|
77 Archive, STD::vector<U, Allocator>
|
Chris@16
|
78 >,
|
Chris@16
|
79 boost::serialization::stl::reserve_imp<STD::vector<U, Allocator> >
|
Chris@16
|
80 >(ar, t);
|
Chris@16
|
81 }
|
Chris@16
|
82
|
Chris@16
|
83 // the optimized versions
|
Chris@16
|
84
|
Chris@16
|
85 template<class Archive, class U, class Allocator>
|
Chris@16
|
86 inline void save(
|
Chris@16
|
87 Archive & ar,
|
Chris@16
|
88 const std::vector<U, Allocator> &t,
|
Chris@16
|
89 const unsigned int /* file_version */,
|
Chris@16
|
90 mpl::true_
|
Chris@16
|
91 ){
|
Chris@16
|
92 const collection_size_type count(t.size());
|
Chris@16
|
93 ar << BOOST_SERIALIZATION_NVP(count);
|
Chris@16
|
94 if (!t.empty())
|
Chris@16
|
95 ar << make_array(detail::get_data(t),t.size());
|
Chris@16
|
96 }
|
Chris@16
|
97
|
Chris@16
|
98 template<class Archive, class U, class Allocator>
|
Chris@16
|
99 inline void load(
|
Chris@16
|
100 Archive & ar,
|
Chris@16
|
101 std::vector<U, Allocator> &t,
|
Chris@16
|
102 const unsigned int /* file_version */,
|
Chris@16
|
103 mpl::true_
|
Chris@16
|
104 ){
|
Chris@16
|
105 collection_size_type count(t.size());
|
Chris@16
|
106 ar >> BOOST_SERIALIZATION_NVP(count);
|
Chris@16
|
107 t.resize(count);
|
Chris@16
|
108 unsigned int item_version=0;
|
Chris@16
|
109 if(BOOST_SERIALIZATION_VECTOR_VERSIONED(ar.get_library_version())) {
|
Chris@16
|
110 ar >> BOOST_SERIALIZATION_NVP(item_version);
|
Chris@16
|
111 }
|
Chris@16
|
112 if (!t.empty())
|
Chris@16
|
113 ar >> make_array(detail::get_data(t),t.size());
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 // dispatch to either default or optimized versions
|
Chris@16
|
117
|
Chris@16
|
118 template<class Archive, class U, class Allocator>
|
Chris@16
|
119 inline void save(
|
Chris@16
|
120 Archive & ar,
|
Chris@16
|
121 const std::vector<U, Allocator> &t,
|
Chris@16
|
122 const unsigned int file_version
|
Chris@16
|
123 ){
|
Chris@16
|
124 typedef BOOST_DEDUCED_TYPENAME
|
Chris@16
|
125 boost::serialization::use_array_optimization<Archive>::template apply<
|
Chris@16
|
126 BOOST_DEDUCED_TYPENAME remove_const<U>::type
|
Chris@16
|
127 >::type use_optimized;
|
Chris@16
|
128 save(ar,t,file_version, use_optimized());
|
Chris@16
|
129 }
|
Chris@16
|
130
|
Chris@16
|
131 template<class Archive, class U, class Allocator>
|
Chris@16
|
132 inline void load(
|
Chris@16
|
133 Archive & ar,
|
Chris@16
|
134 std::vector<U, Allocator> &t,
|
Chris@16
|
135 const unsigned int file_version
|
Chris@16
|
136 ){
|
Chris@16
|
137 #ifdef BOOST_SERIALIZATION_VECTOR_135_HPP
|
Chris@16
|
138 if (ar.get_library_version()==boost::archive::library_version_type(5))
|
Chris@16
|
139 {
|
Chris@16
|
140 load(ar,t,file_version, boost::is_arithmetic<U>());
|
Chris@16
|
141 return;
|
Chris@16
|
142 }
|
Chris@16
|
143 #endif
|
Chris@16
|
144 typedef BOOST_DEDUCED_TYPENAME
|
Chris@16
|
145 boost::serialization::use_array_optimization<Archive>::template apply<
|
Chris@16
|
146 BOOST_DEDUCED_TYPENAME remove_const<U>::type
|
Chris@16
|
147 >::type use_optimized;
|
Chris@16
|
148 load(ar,t,file_version, use_optimized());
|
Chris@16
|
149 }
|
Chris@16
|
150
|
Chris@16
|
151 // split non-intrusive serialization function member into separate
|
Chris@16
|
152 // non intrusive save/load member functions
|
Chris@16
|
153 template<class Archive, class U, class Allocator>
|
Chris@16
|
154 inline void serialize(
|
Chris@16
|
155 Archive & ar,
|
Chris@16
|
156 std::vector<U, Allocator> & t,
|
Chris@16
|
157 const unsigned int file_version
|
Chris@16
|
158 ){
|
Chris@16
|
159 boost::serialization::split_free(ar, t, file_version);
|
Chris@16
|
160 }
|
Chris@16
|
161
|
Chris@16
|
162 #if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
|
Chris@16
|
163
|
Chris@16
|
164 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
Chris@16
|
165 // vector<bool>
|
Chris@16
|
166 template<class Archive, class Allocator>
|
Chris@16
|
167 inline void save(
|
Chris@16
|
168 Archive & ar,
|
Chris@16
|
169 const std::vector<bool, Allocator> &t,
|
Chris@16
|
170 const unsigned int /* file_version */
|
Chris@16
|
171 ){
|
Chris@16
|
172 // record number of elements
|
Chris@16
|
173 collection_size_type count (t.size());
|
Chris@16
|
174 ar << BOOST_SERIALIZATION_NVP(count);
|
Chris@16
|
175 std::vector<bool>::const_iterator it = t.begin();
|
Chris@16
|
176 while(count-- > 0){
|
Chris@16
|
177 bool tb = *it++;
|
Chris@16
|
178 ar << boost::serialization::make_nvp("item", tb);
|
Chris@16
|
179 }
|
Chris@16
|
180 }
|
Chris@16
|
181
|
Chris@16
|
182 template<class Archive, class Allocator>
|
Chris@16
|
183 inline void load(
|
Chris@16
|
184 Archive & ar,
|
Chris@16
|
185 std::vector<bool, Allocator> &t,
|
Chris@16
|
186 const unsigned int /* file_version */
|
Chris@16
|
187 ){
|
Chris@16
|
188 // retrieve number of elements
|
Chris@16
|
189 collection_size_type count;
|
Chris@16
|
190 ar >> BOOST_SERIALIZATION_NVP(count);
|
Chris@16
|
191 t.clear();
|
Chris@16
|
192 while(count-- > 0){
|
Chris@16
|
193 bool i;
|
Chris@16
|
194 ar >> boost::serialization::make_nvp("item", i);
|
Chris@16
|
195 t.push_back(i);
|
Chris@16
|
196 }
|
Chris@16
|
197 }
|
Chris@16
|
198
|
Chris@16
|
199 // split non-intrusive serialization function member into separate
|
Chris@16
|
200 // non intrusive save/load member functions
|
Chris@16
|
201 template<class Archive, class Allocator>
|
Chris@16
|
202 inline void serialize(
|
Chris@16
|
203 Archive & ar,
|
Chris@16
|
204 std::vector<bool, Allocator> & t,
|
Chris@16
|
205 const unsigned int file_version
|
Chris@16
|
206 ){
|
Chris@16
|
207 boost::serialization::split_free(ar, t, file_version);
|
Chris@16
|
208 }
|
Chris@16
|
209
|
Chris@16
|
210 #endif // BOOST_WORKAROUND
|
Chris@16
|
211
|
Chris@16
|
212 } // serialization
|
Chris@16
|
213 } // namespace boost
|
Chris@16
|
214
|
Chris@16
|
215 #include <boost/serialization/collection_traits.hpp>
|
Chris@16
|
216
|
Chris@16
|
217 BOOST_SERIALIZATION_COLLECTION_TRAITS(std::vector)
|
Chris@16
|
218 #undef STD
|
Chris@16
|
219
|
Chris@16
|
220 #endif // BOOST_SERIALIZATION_VECTOR_HPP
|