Chris@16
|
1 #ifndef BOOST_SERIALIZATION_ARRAY_HPP
|
Chris@16
|
2 #define BOOST_SERIALIZATION_ARRAY_HPP
|
Chris@16
|
3
|
Chris@16
|
4 // (C) Copyright 2005 Matthias Troyer and Dave Abrahams
|
Chris@16
|
5 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@101
|
9 #include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
|
Chris@101
|
10
|
Chris@16
|
11 #include <iostream>
|
Chris@16
|
12 #include <cstddef> // std::size_t
|
Chris@101
|
13 #ifndef BOOST_NO_CXX11_HDR_ARRAY
|
Chris@101
|
14 #include <array>
|
Chris@101
|
15 #endif
|
Chris@101
|
16
|
Chris@16
|
17 #if defined(BOOST_NO_STDC_NAMESPACE)
|
Chris@16
|
18 namespace std{
|
Chris@16
|
19 using ::size_t;
|
Chris@16
|
20 } // namespace std
|
Chris@16
|
21 #endif
|
Chris@16
|
22
|
Chris@16
|
23 #include <boost/serialization/nvp.hpp>
|
Chris@16
|
24 #include <boost/serialization/split_member.hpp>
|
Chris@16
|
25 #include <boost/serialization/wrapper.hpp>
|
Chris@16
|
26 #include <boost/mpl/always.hpp>
|
Chris@16
|
27 #include <boost/mpl/apply.hpp>
|
Chris@16
|
28 #include <boost/mpl/bool.hpp>
|
Chris@16
|
29 #include <boost/type_traits/remove_const.hpp>
|
Chris@16
|
30 #include <boost/array.hpp>
|
Chris@16
|
31
|
Chris@16
|
32 namespace boost { namespace serialization {
|
Chris@16
|
33
|
Chris@16
|
34 // traits to specify whether to use an optimized array serialization
|
Chris@16
|
35
|
Chris@16
|
36 #ifdef __BORLANDC__
|
Chris@16
|
37 // workaround for Borland compiler
|
Chris@16
|
38 template <class Archive>
|
Chris@16
|
39 struct use_array_optimization {
|
Chris@16
|
40 template <class T> struct apply : boost::mpl::false_ {};
|
Chris@16
|
41 };
|
Chris@16
|
42
|
Chris@16
|
43 #else
|
Chris@16
|
44 template <class Archive>
|
Chris@16
|
45 struct use_array_optimization : boost::mpl::always<boost::mpl::false_> {};
|
Chris@16
|
46 #endif
|
Chris@16
|
47
|
Chris@16
|
48 template<class T>
|
Chris@16
|
49 class array :
|
Chris@16
|
50 public wrapper_traits<const array< T > >
|
Chris@16
|
51 {
|
Chris@16
|
52 public:
|
Chris@16
|
53 typedef T value_type;
|
Chris@16
|
54
|
Chris@16
|
55 array(value_type* t, std::size_t s) :
|
Chris@16
|
56 m_t(t),
|
Chris@16
|
57 m_element_count(s)
|
Chris@16
|
58 {}
|
Chris@16
|
59 array(const array & rhs) :
|
Chris@16
|
60 m_t(rhs.m_t),
|
Chris@16
|
61 m_element_count(rhs.m_element_count)
|
Chris@16
|
62 {}
|
Chris@16
|
63 array & operator=(const array & rhs){
|
Chris@16
|
64 m_t = rhs.m_t;
|
Chris@16
|
65 m_element_count = rhs.m_element_count;
|
Chris@16
|
66 }
|
Chris@16
|
67
|
Chris@16
|
68 // default implementation
|
Chris@16
|
69 template<class Archive>
|
Chris@16
|
70 void serialize_optimized(Archive &ar, const unsigned int, mpl::false_ ) const
|
Chris@16
|
71 {
|
Chris@16
|
72 // default implemention does the loop
|
Chris@16
|
73 std::size_t c = count();
|
Chris@16
|
74 value_type * t = address();
|
Chris@16
|
75 while(0 < c--)
|
Chris@16
|
76 ar & boost::serialization::make_nvp("item", *t++);
|
Chris@16
|
77 }
|
Chris@16
|
78
|
Chris@16
|
79 // optimized implementation
|
Chris@16
|
80 template<class Archive>
|
Chris@16
|
81 void serialize_optimized(Archive &ar, const unsigned int version, mpl::true_ )
|
Chris@16
|
82 {
|
Chris@16
|
83 boost::serialization::split_member(ar, *this, version);
|
Chris@16
|
84 }
|
Chris@16
|
85
|
Chris@16
|
86 // default implementation
|
Chris@16
|
87 template<class Archive>
|
Chris@16
|
88 void save(Archive &ar, const unsigned int version) const
|
Chris@16
|
89 {
|
Chris@16
|
90 ar.save_array(*this,version);
|
Chris@16
|
91 }
|
Chris@16
|
92
|
Chris@16
|
93 // default implementation
|
Chris@16
|
94 template<class Archive>
|
Chris@16
|
95 void load(Archive &ar, const unsigned int version)
|
Chris@16
|
96 {
|
Chris@16
|
97 ar.load_array(*this,version);
|
Chris@16
|
98 }
|
Chris@16
|
99
|
Chris@16
|
100 // default implementation
|
Chris@16
|
101 template<class Archive>
|
Chris@16
|
102 void serialize(Archive &ar, const unsigned int version)
|
Chris@16
|
103 {
|
Chris@101
|
104 typedef typename
|
Chris@16
|
105 boost::serialization::use_array_optimization<Archive>::template apply<
|
Chris@101
|
106 typename remove_const< T >::type
|
Chris@16
|
107 >::type use_optimized;
|
Chris@16
|
108 serialize_optimized(ar,version,use_optimized());
|
Chris@16
|
109 }
|
Chris@16
|
110
|
Chris@16
|
111 value_type* address() const
|
Chris@16
|
112 {
|
Chris@16
|
113 return m_t;
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 std::size_t count() const
|
Chris@16
|
117 {
|
Chris@16
|
118 return m_element_count;
|
Chris@16
|
119 }
|
Chris@16
|
120
|
Chris@16
|
121 private:
|
Chris@16
|
122 value_type* m_t;
|
Chris@16
|
123 std::size_t m_element_count;
|
Chris@16
|
124 };
|
Chris@16
|
125
|
Chris@16
|
126 template<class T>
|
Chris@16
|
127 inline
|
Chris@16
|
128 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
Chris@16
|
129 const
|
Chris@16
|
130 #endif
|
Chris@16
|
131 array< T > make_array( T* t, std::size_t s){
|
Chris@16
|
132 return array< T >(t, s);
|
Chris@16
|
133 }
|
Chris@16
|
134
|
Chris@101
|
135 // implement serialization for boost::array
|
Chris@16
|
136 template <class Archive, class T, std::size_t N>
|
Chris@16
|
137 void serialize(Archive& ar, boost::array<T,N>& a, const unsigned int /* version */)
|
Chris@16
|
138 {
|
Chris@101
|
139 ar & boost::serialization::make_nvp("elems", a.elems);
|
Chris@16
|
140 }
|
Chris@16
|
141
|
Chris@101
|
142 #ifndef BOOST_NO_CXX11_HDR_ARRAY
|
Chris@101
|
143 // implement serialization for std::array
|
Chris@101
|
144 template <class Archive, class T, std::size_t N>
|
Chris@101
|
145 void serialize(Archive& ar, std::array<T,N>& a, const unsigned int /* version */)
|
Chris@101
|
146 {
|
Chris@101
|
147 ar & boost::serialization::make_nvp(
|
Chris@101
|
148 "elems",
|
Chris@101
|
149 *static_cast<T (*)[N]>(static_cast<void *>(a.data()))
|
Chris@101
|
150 );
|
Chris@101
|
151
|
Chris@101
|
152 }
|
Chris@101
|
153 #endif
|
Chris@101
|
154
|
Chris@16
|
155 } } // end namespace boost::serialization
|
Chris@16
|
156
|
Chris@16
|
157 #ifdef __BORLANDC__
|
Chris@16
|
158 // ignore optimizations for Borland
|
Chris@16
|
159 #define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive)
|
Chris@16
|
160 #else
|
Chris@16
|
161 #define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive) \
|
Chris@16
|
162 namespace boost { namespace serialization { \
|
Chris@16
|
163 template <> struct use_array_optimization<Archive> { \
|
Chris@16
|
164 template <class ValueType> \
|
Chris@16
|
165 struct apply : boost::mpl::apply1<Archive::use_array_optimization \
|
Chris@101
|
166 , typename boost::remove_const<ValueType>::type \
|
Chris@16
|
167 >::type {}; \
|
Chris@16
|
168 }; }}
|
Chris@16
|
169 #endif // __BORLANDC__
|
Chris@16
|
170
|
Chris@16
|
171 #endif //BOOST_SERIALIZATION_ARRAY_HPP
|