Line data Source code
1 : /*! \file set.hpp
2 : \brief Support for types found in \<set\>
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_SET_HPP_
31 : #define CEREAL_TYPES_SET_HPP_
32 :
33 : #include "cereal/cereal.hpp"
34 : #include <set>
35 :
36 : namespace cereal
37 : {
38 : namespace set_detail
39 : {
40 : //! @internal
41 : template <class Archive, class SetT> inline
42 4000 : void save( Archive & ar, SetT const & set )
43 : {
44 4000 : ar( make_size_tag( static_cast<size_type>(set.size()) ) );
45 :
46 604000 : for( const auto & i : set )
47 600000 : ar( i );
48 4000 : }
49 :
50 : //! @internal
51 : template <class Archive, class SetT> inline
52 4000 : void load( Archive & ar, SetT & set )
53 : {
54 : size_type size;
55 4000 : ar( make_size_tag( size ) );
56 :
57 4000 : set.clear();
58 :
59 4000 : auto hint = set.begin();
60 604000 : for( size_type i = 0; i < size; ++i )
61 : {
62 480000 : typename SetT::key_type key;
63 :
64 600000 : ar( key );
65 : #ifdef CEREAL_OLDER_GCC
66 : hint = set.insert( hint, std::move( key ) );
67 : #else // NOT CEREAL_OLDER_GCC
68 600000 : hint = set.emplace_hint( hint, std::move( key ) );
69 : #endif // NOT CEREAL_OLDER_GCC
70 : }
71 4000 : }
72 : }
73 :
74 : //! Saving for std::set
75 : template <class Archive, class K, class C, class A> inline
76 2000 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::set<K, C, A> const & set )
77 : {
78 2000 : set_detail::save( ar, set );
79 2000 : }
80 :
81 : //! Loading for std::set
82 : template <class Archive, class K, class C, class A> inline
83 2000 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::set<K, C, A> & set )
84 : {
85 2000 : set_detail::load( ar, set );
86 2000 : }
87 :
88 : //! Saving for std::multiset
89 : template <class Archive, class K, class C, class A> inline
90 2000 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::multiset<K, C, A> const & multiset )
91 : {
92 2000 : set_detail::save( ar, multiset );
93 2000 : }
94 :
95 : //! Loading for std::multiset
96 : template <class Archive, class K, class C, class A> inline
97 2000 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::multiset<K, C, A> & multiset )
98 : {
99 2000 : set_detail::load( ar, multiset );
100 2000 : }
101 : } // namespace cereal
102 :
103 : #endif // CEREAL_TYPES_SET_HPP_
|