annotate DEPENDENCIES/generic/include/boost/serialization/array.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
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