1 #ifndef BOOST_SERIALIZATION_ARRAY_HPP
2 #define BOOST_SERIALIZATION_ARRAY_HPP
4 // (C) Copyright 2005 Matthias Troyer and Dave Abrahams
5 // Use, modification and distribution is subject to the Boost Software
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
10 #include <cstddef> // std::size_t
12 #include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
13 #if defined(BOOST_NO_STDC_NAMESPACE)
19 #include <boost/serialization/nvp.hpp>
20 #include <boost/serialization/split_member.hpp>
21 #include <boost/serialization/wrapper.hpp>
22 #include <boost/mpl/always.hpp>
23 #include <boost/mpl/apply.hpp>
24 #include <boost/mpl/bool.hpp>
25 #include <boost/type_traits/remove_const.hpp>
26 #include <boost/array.hpp>
28 namespace boost { namespace serialization {
30 // traits to specify whether to use an optimized array serialization
33 // workaround for Borland compiler
34 template <class Archive>
35 struct use_array_optimization {
36 template <class T> struct apply : boost::mpl::false_ {};
40 template <class Archive>
41 struct use_array_optimization : boost::mpl::always<boost::mpl::false_> {};
46 public wrapper_traits<const array< T > >
51 array(value_type* t, std::size_t s) :
55 array(const array & rhs) :
57 m_element_count(rhs.m_element_count)
59 array & operator=(const array & rhs){
61 m_element_count = rhs.m_element_count;
64 // default implementation
65 template<class Archive>
66 void serialize_optimized(Archive &ar, const unsigned int, mpl::false_ ) const
68 // default implemention does the loop
69 std::size_t c = count();
70 value_type * t = address();
72 ar & boost::serialization::make_nvp("item", *t++);
75 // optimized implementation
76 template<class Archive>
77 void serialize_optimized(Archive &ar, const unsigned int version, mpl::true_ )
79 boost::serialization::split_member(ar, *this, version);
82 // default implementation
83 template<class Archive>
84 void save(Archive &ar, const unsigned int version) const
86 ar.save_array(*this,version);
89 // default implementation
90 template<class Archive>
91 void load(Archive &ar, const unsigned int version)
93 ar.load_array(*this,version);
96 // default implementation
97 template<class Archive>
98 void serialize(Archive &ar, const unsigned int version)
100 typedef BOOST_DEDUCED_TYPENAME
101 boost::serialization::use_array_optimization<Archive>::template apply<
102 BOOST_DEDUCED_TYPENAME remove_const< T >::type
103 >::type use_optimized;
104 serialize_optimized(ar,version,use_optimized());
107 value_type* address() const
112 std::size_t count() const
114 return m_element_count;
119 std::size_t m_element_count;
124 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
127 array< T > make_array( T* t, std::size_t s){
128 return array< T >(t, s);
131 template <class Archive, class T, std::size_t N>
132 void serialize(Archive& ar, boost::array<T,N>& a, const unsigned int /* version */)
134 ar & boost::serialization::make_nvp("elems",a.elems);
137 } } // end namespace boost::serialization
140 // ignore optimizations for Borland
141 #define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive)
143 #define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive) \
144 namespace boost { namespace serialization { \
145 template <> struct use_array_optimization<Archive> { \
146 template <class ValueType> \
147 struct apply : boost::mpl::apply1<Archive::use_array_optimization \
148 , BOOST_DEDUCED_TYPENAME boost::remove_const<ValueType>::type \
151 #endif // __BORLANDC__
153 #endif //BOOST_SERIALIZATION_ARRAY_HPP