Chris@16
|
1 #ifndef BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP
|
Chris@16
|
2 #define BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP
|
Chris@16
|
3
|
Chris@16
|
4 // MS compatible compilers support #pragma once
|
Chris@101
|
5 #if defined(_MSC_VER)
|
Chris@16
|
6 # pragma once
|
Chris@16
|
7 #endif
|
Chris@16
|
8
|
Chris@16
|
9 #if defined(_MSC_VER) && (_MSC_VER <= 1020)
|
Chris@16
|
10 # pragma warning (disable : 4786) // too long name, harmless warning
|
Chris@16
|
11 #endif
|
Chris@16
|
12
|
Chris@16
|
13 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
Chris@16
|
14 // collections_load_imp.hpp: serialization for loading stl collections
|
Chris@16
|
15
|
Chris@16
|
16 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
Chris@16
|
17 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
18 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
19 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
20
|
Chris@16
|
21 // See http://www.boost.org for updates, documentation, and revision history.
|
Chris@16
|
22
|
Chris@16
|
23 // helper function templates for serialization of collections
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/assert.hpp>
|
Chris@16
|
26 #include <cstddef> // size_t
|
Chris@16
|
27 #include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
|
Chris@16
|
28 #if defined(BOOST_NO_STDC_NAMESPACE)
|
Chris@16
|
29 namespace std{
|
Chris@16
|
30 using ::size_t;
|
Chris@16
|
31 } // namespace std
|
Chris@16
|
32 #endif
|
Chris@16
|
33 #include <boost/detail/workaround.hpp>
|
Chris@16
|
34
|
Chris@16
|
35 #include <boost/archive/detail/basic_iarchive.hpp>
|
Chris@16
|
36 #include <boost/serialization/access.hpp>
|
Chris@16
|
37 #include <boost/serialization/nvp.hpp>
|
Chris@16
|
38 #include <boost/serialization/detail/stack_constructor.hpp>
|
Chris@16
|
39 #include <boost/serialization/collection_size_type.hpp>
|
Chris@16
|
40 #include <boost/serialization/item_version_type.hpp>
|
Chris@16
|
41
|
Chris@16
|
42 namespace boost{
|
Chris@16
|
43 namespace serialization {
|
Chris@16
|
44 namespace stl {
|
Chris@16
|
45
|
Chris@16
|
46 //////////////////////////////////////////////////////////////////////
|
Chris@16
|
47 // implementation of serialization for STL containers
|
Chris@16
|
48 //
|
Chris@16
|
49
|
Chris@16
|
50 // sequential container input
|
Chris@16
|
51 template<class Archive, class Container>
|
Chris@16
|
52 struct archive_input_seq
|
Chris@16
|
53 {
|
Chris@101
|
54 inline typename Container::iterator
|
Chris@16
|
55 operator()(
|
Chris@16
|
56 Archive &ar,
|
Chris@16
|
57 Container &s,
|
Chris@16
|
58 const unsigned int v,
|
Chris@101
|
59 typename Container::iterator hint
|
Chris@16
|
60 ){
|
Chris@101
|
61 typedef typename Container::value_type type;
|
Chris@16
|
62 detail::stack_construct<Archive, type> t(ar, v);
|
Chris@16
|
63 // borland fails silently w/o full namespace
|
Chris@16
|
64 ar >> boost::serialization::make_nvp("item", t.reference());
|
Chris@16
|
65 s.push_back(t.reference());
|
Chris@16
|
66 ar.reset_object_address(& s.back() , & t.reference());
|
Chris@16
|
67 return hint;
|
Chris@16
|
68 }
|
Chris@16
|
69 };
|
Chris@16
|
70
|
Chris@16
|
71 // map input
|
Chris@16
|
72 template<class Archive, class Container>
|
Chris@16
|
73 struct archive_input_map
|
Chris@16
|
74 {
|
Chris@101
|
75 inline typename Container::iterator
|
Chris@16
|
76 operator()(
|
Chris@16
|
77 Archive &ar,
|
Chris@16
|
78 Container &s,
|
Chris@16
|
79 const unsigned int v,
|
Chris@101
|
80 typename Container::iterator hint
|
Chris@16
|
81 ){
|
Chris@101
|
82 typedef typename Container::value_type type;
|
Chris@16
|
83 detail::stack_construct<Archive, type> t(ar, v);
|
Chris@16
|
84 // borland fails silently w/o full namespace
|
Chris@16
|
85 ar >> boost::serialization::make_nvp("item", t.reference());
|
Chris@101
|
86 typename Container::iterator result =
|
Chris@16
|
87 s.insert(hint, t.reference());
|
Chris@16
|
88 // note: the following presumes that the map::value_type was NOT tracked
|
Chris@16
|
89 // in the archive. This is the usual case, but here there is no way
|
Chris@16
|
90 // to determine that.
|
Chris@16
|
91 ar.reset_object_address(
|
Chris@16
|
92 & (result->second),
|
Chris@16
|
93 & t.reference().second
|
Chris@16
|
94 );
|
Chris@16
|
95 return result;
|
Chris@16
|
96 }
|
Chris@16
|
97 };
|
Chris@16
|
98
|
Chris@16
|
99 // set input
|
Chris@16
|
100 template<class Archive, class Container>
|
Chris@16
|
101 struct archive_input_set
|
Chris@16
|
102 {
|
Chris@101
|
103 inline typename Container::iterator
|
Chris@16
|
104 operator()(
|
Chris@16
|
105 Archive &ar,
|
Chris@16
|
106 Container &s,
|
Chris@16
|
107 const unsigned int v,
|
Chris@101
|
108 typename Container::iterator hint
|
Chris@16
|
109 ){
|
Chris@101
|
110 typedef typename Container::value_type type;
|
Chris@16
|
111 detail::stack_construct<Archive, type> t(ar, v);
|
Chris@16
|
112 // borland fails silently w/o full namespace
|
Chris@16
|
113 ar >> boost::serialization::make_nvp("item", t.reference());
|
Chris@101
|
114 typename Container::iterator result =
|
Chris@16
|
115 s.insert(hint, t.reference());
|
Chris@16
|
116 ar.reset_object_address(& (* result), & t.reference());
|
Chris@16
|
117 return result;
|
Chris@16
|
118 }
|
Chris@16
|
119 };
|
Chris@16
|
120
|
Chris@16
|
121 template<class Container>
|
Chris@16
|
122 class reserve_imp
|
Chris@16
|
123 {
|
Chris@16
|
124 public:
|
Chris@16
|
125 void operator()(Container &s, std::size_t count) const {
|
Chris@16
|
126 s.reserve(count);
|
Chris@16
|
127 }
|
Chris@16
|
128 };
|
Chris@16
|
129
|
Chris@16
|
130 template<class Container>
|
Chris@16
|
131 class no_reserve_imp
|
Chris@16
|
132 {
|
Chris@16
|
133 public:
|
Chris@16
|
134 void operator()(Container & /* s */, std::size_t /* count */) const{}
|
Chris@16
|
135 };
|
Chris@16
|
136
|
Chris@16
|
137 template<class Archive, class Container, class InputFunction, class R>
|
Chris@16
|
138 inline void load_collection(Archive & ar, Container &s)
|
Chris@16
|
139 {
|
Chris@16
|
140 s.clear();
|
Chris@16
|
141 const boost::archive::library_version_type library_version(
|
Chris@16
|
142 ar.get_library_version()
|
Chris@16
|
143 );
|
Chris@16
|
144 // retrieve number of elements
|
Chris@16
|
145 item_version_type item_version(0);
|
Chris@101
|
146 collection_size_type count;
|
Chris@16
|
147 ar >> BOOST_SERIALIZATION_NVP(count);
|
Chris@16
|
148 if(boost::archive::library_version_type(3) < library_version){
|
Chris@16
|
149 ar >> BOOST_SERIALIZATION_NVP(item_version);
|
Chris@16
|
150 }
|
Chris@16
|
151
|
Chris@16
|
152 R rx;
|
Chris@16
|
153 rx(s, count);
|
Chris@16
|
154 InputFunction ifunc;
|
Chris@101
|
155 typename Container::iterator hint;
|
Chris@16
|
156 hint = s.begin();
|
Chris@16
|
157 while(count-- > 0){
|
Chris@16
|
158 hint = ifunc(ar, s, item_version, hint);
|
Chris@16
|
159 }
|
Chris@16
|
160 }
|
Chris@16
|
161
|
Chris@16
|
162 } // namespace stl
|
Chris@16
|
163 } // namespace serialization
|
Chris@16
|
164 } // namespace boost
|
Chris@16
|
165
|
Chris@16
|
166 #endif //BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP
|