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 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_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 6000 : C const & container( std::stack<T, C> const & stack ) 46 : { 47 : struct H : public std::stack<T, C> 48 : { 49 6000 : static C const & get( std::stack<T, C> const & s ) 50 : { 51 6000 : return s.*(&H::c); 52 : } 53 : }; 54 : 55 6000 : return H::get( stack ); 56 : } 57 : } 58 : 59 : //! Saving for std::stack 60 : template <class Archive, class T, class C> inline 61 2000 : void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::stack<T, C> const & stack ) 62 : { 63 2000 : ar( CEREAL_NVP_("container", stack_detail::container( stack )) ); 64 2000 : } 65 : 66 : //! Loading for std::stack 67 : template <class Archive, class T, class C> inline 68 2000 : void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::stack<T, C> & stack ) 69 : { 70 2000 : C container; 71 2000 : ar( CEREAL_NVP_("container", container) ); 72 2000 : stack = std::stack<T, C>( std::move( container ) ); 73 2000 : } 74 : } // namespace cereal 75 : 76 : #endif // CEREAL_TYPES_STACK_HPP_