Line data Source code
1 : /*! \file vector.hpp
2 : \brief Support for types found in \<vector\>
3 : \ingroup STLSupport */
4 : /*
5 : Copyright (c) 2014, Randolph Voorhies, Shane Grant
6 : All rights reserved.
7 :
8 : Redistribution and use in source and binary forms, with or without
9 : modification, are permitted provided that the following conditions are met:
10 : * Redistributions of source code must retain the above copyright
11 : notice, this list of conditions and the following disclaimer.
12 : * Redistributions in binary form must reproduce the above copyright
13 : notice, this list of conditions and the following disclaimer in the
14 : documentation and/or other materials provided with the distribution.
15 : * Neither the name of the copyright holder nor the
16 : names of its contributors may be used to endorse or promote products
17 : derived from this software without specific prior written permission.
18 :
19 : THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 : ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 : WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 : DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
23 : DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 : (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 : LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 : ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 : (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 : SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 : */
30 : #ifndef CEREAL_TYPES_VECTOR_HPP_
31 : #define CEREAL_TYPES_VECTOR_HPP_
32 :
33 : #include "cereal/cereal.hpp"
34 : #include <vector>
35 :
36 : namespace cereal
37 : {
38 : //! Serialization for std::vectors of arithmetic (but not bool) using binary serialization, if supported
39 : template <class Archive, class T, class A> inline
40 : typename std::enable_if<traits::is_output_serializable<BinaryData<T>, Archive>::value
41 : && std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, void>::type
42 400 : CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector<T, A> const & vector )
43 : {
44 400 : ar( make_size_tag( static_cast<size_type>(vector.size()) ) ); // number of elements
45 400 : ar( binary_data( vector.data(), vector.size() * sizeof(T) ) );
46 400 : }
47 :
48 : //! Serialization for std::vectors of arithmetic (but not bool) using binary serialization, if supported
49 : template <class Archive, class T, class A> inline
50 : typename std::enable_if<traits::is_input_serializable<BinaryData<T>, Archive>::value
51 : && std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, void>::type
52 400 : CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector<T, A> & vector )
53 : {
54 : size_type vectorSize;
55 400 : ar( make_size_tag( vectorSize ) );
56 :
57 400 : vector.resize( static_cast<std::size_t>( vectorSize ) );
58 400 : ar( binary_data( vector.data(), static_cast<std::size_t>( vectorSize ) * sizeof(T) ) );
59 400 : }
60 :
61 : //! Serialization for non-arithmetic vector types
62 : template <class Archive, class T, class A> inline
63 : typename std::enable_if<(!traits::is_output_serializable<BinaryData<T>, Archive>::value
64 : || !std::is_arithmetic<T>::value) && !std::is_same<T, bool>::value, void>::type
65 10800 : CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector<T, A> const & vector )
66 : {
67 10800 : ar( make_size_tag( static_cast<size_type>(vector.size()) ) ); // number of elements
68 813016 : for(auto && v : vector)
69 802216 : ar( v );
70 10800 : }
71 :
72 : //! Serialization for non-arithmetic vector types
73 : template <class Archive, class T, class A> inline
74 : typename std::enable_if<(!traits::is_input_serializable<BinaryData<T>, Archive>::value
75 : || !std::is_arithmetic<T>::value) && !std::is_same<T, bool>::value, void>::type
76 10800 : CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector<T, A> & vector )
77 : {
78 : size_type size;
79 10800 : ar( make_size_tag( size ) );
80 :
81 10800 : vector.resize( static_cast<std::size_t>( size ) );
82 813016 : for(auto && v : vector)
83 802216 : ar( v );
84 10800 : }
85 :
86 : //! Serialization for bool vector types
87 : template <class Archive, class A> inline
88 600 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::vector<bool, A> const & vector )
89 : {
90 600 : ar( make_size_tag( static_cast<size_type>(vector.size()) ) ); // number of elements
91 41600 : for(const auto v : vector)
92 41000 : ar( static_cast<bool>(v) );
93 600 : }
94 :
95 : //! Serialization for bool vector types
96 : template <class Archive, class A> inline
97 600 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::vector<bool, A> & vector )
98 : {
99 : size_type size;
100 600 : ar( make_size_tag( size ) );
101 :
102 600 : vector.resize( static_cast<std::size_t>( size ) );
103 41600 : for(auto && v : vector)
104 : {
105 : bool b;
106 41000 : ar( b );
107 41000 : v = b;
108 : }
109 600 : }
110 : } // namespace cereal
111 :
112 : #endif // CEREAL_TYPES_VECTOR_HPP_
|