Line data Source code
1 : /*! \file stack.hpp
2 : \brief Support for types found in \<stack\>
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 cereal 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 RANDOLPH VOORHIES OR SHANE GRANT 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_STACK_HPP_
31 : #define CEREAL_TYPES_STACK_HPP_
32 :
33 : #include "cereal/cereal.hpp"
34 : #include <stack>
35 :
36 : // The default container for stack is deque, so let's include that too
37 : #include "cereal/types/deque.hpp"
38 :
39 : namespace cereal
40 : {
41 : namespace stack_detail
42 : {
43 : //! Allows access to the protected container in stack
44 : template <class T, class C> inline
45 12000 : C const & container( std::stack<T, C> const & stack )
46 : {
47 : struct H : public std::stack<T, C>
48 : {
49 12000 : static C const & get( std::stack<T, C> const & s )
50 : {
51 12000 : return s.*(&H::c);
52 : }
53 : };
54 :
55 12000 : return H::get( stack );
56 : }
57 2400 : }
58 :
59 : //! Saving for std::stack
60 : template <class Archive, class T, class C> inline
61 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::stack<T, C> const & stack )
62 : {
63 : ar( CEREAL_NVP_("container", stack_detail::container( stack )) );
64 : }
65 :
66 : //! Loading for std::stack
67 2400 : template <class Archive, class T, class C> inline
68 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::stack<T, C> & stack )
69 2400 : {
70 : C container;
71 : ar( CEREAL_NVP_("container", container) );
72 : stack = std::stack<T, C>( std::move( container ) );
73 : }
74 : } // namespace cereal
75 :
76 : #endif // CEREAL_TYPES_STACK_HPP_
|