Line data Source code
1 : /*! \file queue.hpp
2 : \brief Support for types found in \<queue\>
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_QUEUE_HPP_
31 : #define CEREAL_TYPES_QUEUE_HPP_
32 :
33 : #include "cereal/details/helpers.hpp"
34 : #include <queue>
35 :
36 : // The default container for queue is deque, so let's include that too
37 : #include "cereal/types/deque.hpp"
38 : // The default comparator for queue is less
39 : #include "cereal/types/functional.hpp"
40 :
41 : namespace cereal
42 : {
43 : namespace queue_detail
44 : {
45 : //! Allows access to the protected container in queue
46 : /*! @internal */
47 : template <class T, class C> inline
48 6000 : C const & container( std::queue<T, C> const & queue )
49 : {
50 : struct H : public std::queue<T, C>
51 : {
52 6000 : static C const & get( std::queue<T, C> const & q )
53 : {
54 6000 : return q.*(&H::c);
55 : }
56 : };
57 :
58 6000 : return H::get( queue );
59 : }
60 :
61 : //! Allows access to the protected container in priority queue
62 : /*! @internal */
63 : template <class T, class C, class Comp> inline
64 6000 : C const & container( std::priority_queue<T, C, Comp> const & priority_queue )
65 : {
66 : struct H : public std::priority_queue<T, C, Comp>
67 : {
68 6000 : static C const & get( std::priority_queue<T, C, Comp> const & pq )
69 : {
70 6000 : return pq.*(&H::c);
71 : }
72 : };
73 :
74 6000 : return H::get( priority_queue );
75 : }
76 :
77 : //! Allows access to the protected comparator in priority queue
78 : /*! @internal */
79 : template <class T, class C, class Comp> inline
80 2000 : Comp const & comparator( std::priority_queue<T, C, Comp> const & priority_queue )
81 : {
82 : struct H : public std::priority_queue<T, C, Comp>
83 : {
84 2000 : static Comp const & get( std::priority_queue<T, C, Comp> const & pq )
85 : {
86 2000 : return pq.*(&H::comp);
87 : }
88 : };
89 :
90 2000 : return H::get( priority_queue );
91 : }
92 : }
93 :
94 : //! Saving for std::queue
95 : template <class Archive, class T, class C> inline
96 2000 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::queue<T, C> const & queue )
97 : {
98 2000 : ar( CEREAL_NVP_("container", queue_detail::container( queue )) );
99 2000 : }
100 :
101 : //! Loading for std::queue
102 : template <class Archive, class T, class C> inline
103 2000 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::queue<T, C> & queue )
104 : {
105 2000 : C container;
106 2000 : ar( CEREAL_NVP_("container", container) );
107 2000 : queue = std::queue<T, C>( std::move( container ) );
108 2000 : }
109 :
110 : //! Saving for std::priority_queue
111 : template <class Archive, class T, class C, class Comp> inline
112 2000 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::priority_queue<T, C, Comp> const & priority_queue )
113 : {
114 2000 : ar( CEREAL_NVP_("comparator", queue_detail::comparator( priority_queue )) );
115 2000 : ar( CEREAL_NVP_("container", queue_detail::container( priority_queue )) );
116 2000 : }
117 :
118 : //! Loading for std::priority_queue
119 : template <class Archive, class T, class C, class Comp> inline
120 2000 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::priority_queue<T, C, Comp> & priority_queue )
121 : {
122 : Comp comparator;
123 2000 : ar( CEREAL_NVP_("comparator", comparator) );
124 :
125 2000 : C container;
126 2000 : ar( CEREAL_NVP_("container", container) );
127 :
128 2000 : priority_queue = std::priority_queue<T, C, Comp>( comparator, std::move( container ) );
129 2000 : }
130 : } // namespace cereal
131 :
132 : #endif // CEREAL_TYPES_QUEUE_HPP_
|