210 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			210 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// boost variant/recursive_variant.hpp header file
							 | 
						||
| 
								 | 
							
								// See http://www.boost.org for updates, documentation, and revision history.
							 | 
						||
| 
								 | 
							
								//-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2003 Eric Friedman
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2013 Antony Polukhin
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0. (See
							 | 
						||
| 
								 | 
							
								// accompanying file LICENSE_1_0.txt or copy at
							 | 
						||
| 
								 | 
							
								// http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_VARIANT_RECURSIVE_VARIANT_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_VARIANT_RECURSIVE_VARIANT_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/variant_fwd.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/enable_recursive.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/substitute_fwd.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/make_variant_list.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/over_sequence.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/aux_/lambda_arity_param.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/equal.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/eval_if.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/identity.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/if.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/protect.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/transform.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/is_same.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/preprocessor/cat.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/preprocessor/repeat.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/bool.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/is_sequence.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/variant.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace detail { namespace variant {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// (detail) metafunction specialization substitute
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Handles embedded variant types when substituting for recursive_variant_.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								      BOOST_VARIANT_ENUM_PARAMS(typename T)
							 | 
						||
| 
								 | 
							
								    , typename RecursiveVariant
							 | 
						||
| 
								 | 
							
								      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								struct substitute<
							 | 
						||
| 
								 | 
							
								      ::boost::variant<
							 | 
						||
| 
								 | 
							
								          recursive_flag< T0 >
							 | 
						||
| 
								 | 
							
								        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
							 | 
						||
| 
								 | 
							
								        >
							 | 
						||
| 
								 | 
							
								    , RecursiveVariant
							 | 
						||
| 
								 | 
							
								    , ::boost::recursive_variant_
							 | 
						||
| 
								 | 
							
								      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    typedef ::boost::variant<
							 | 
						||
| 
								 | 
							
								          recursive_flag< T0 >
							 | 
						||
| 
								 | 
							
								        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
							 | 
						||
| 
								 | 
							
								        > type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								      BOOST_VARIANT_ENUM_PARAMS(typename T)
							 | 
						||
| 
								 | 
							
								    , typename RecursiveVariant
							 | 
						||
| 
								 | 
							
								      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								struct substitute<
							 | 
						||
| 
								 | 
							
								      ::boost::variant<
							 | 
						||
| 
								 | 
							
								          ::boost::detail::variant::over_sequence< T0 >
							 | 
						||
| 
								 | 
							
								        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
							 | 
						||
| 
								 | 
							
								        >
							 | 
						||
| 
								 | 
							
								    , RecursiveVariant
							 | 
						||
| 
								 | 
							
								    , ::boost::recursive_variant_
							 | 
						||
| 
								 | 
							
								      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef T0 initial_types;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename mpl::transform<
							 | 
						||
| 
								 | 
							
								          initial_types
							 | 
						||
| 
								 | 
							
								        , mpl::protect< quoted_enable_recursive<RecursiveVariant,mpl::true_> >
							 | 
						||
| 
								 | 
							
								        >::type types;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename mpl::if_<
							 | 
						||
| 
								 | 
							
								          mpl::equal<initial_types, types, ::boost::is_same<mpl::_1, mpl::_2> >
							 | 
						||
| 
								 | 
							
								        , ::boost::variant<
							 | 
						||
| 
								 | 
							
								              ::boost::detail::variant::over_sequence< T0 >
							 | 
						||
| 
								 | 
							
								            , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
							 | 
						||
| 
								 | 
							
								            >
							 | 
						||
| 
								 | 
							
								        , ::boost::variant< over_sequence<types> >
							 | 
						||
| 
								 | 
							
								        >::type type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <
							 | 
						||
| 
								 | 
							
								      BOOST_VARIANT_ENUM_PARAMS(typename T)
							 | 
						||
| 
								 | 
							
								    , typename RecursiveVariant
							 | 
						||
| 
								 | 
							
								      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								struct substitute<
							 | 
						||
| 
								 | 
							
								      ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >
							 | 
						||
| 
								 | 
							
								    , RecursiveVariant
							 | 
						||
| 
								 | 
							
								    , ::boost::recursive_variant_
							 | 
						||
| 
								 | 
							
								      BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
							 | 
						||
| 
								 | 
							
								    >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    typedef ::boost::variant<
							 | 
						||
| 
								 | 
							
								        typename enable_recursive<   
							 | 
						||
| 
								 | 
							
								              T0              
							 | 
						||
| 
								 | 
							
								            , RecursiveVariant               
							 | 
						||
| 
								 | 
							
								            , mpl::true_                     
							 | 
						||
| 
								 | 
							
								        >::type,
							 | 
						||
| 
								 | 
							
								        typename enable_recursive<   
							 | 
						||
| 
								 | 
							
								              TN              
							 | 
						||
| 
								 | 
							
								            , RecursiveVariant               
							 | 
						||
| 
								 | 
							
								            , mpl::true_                     
							 | 
						||
| 
								 | 
							
								        >::type...  
							 | 
						||
| 
								 | 
							
								    > type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else // defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								private: // helpers, for metafunction result (below)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS(z,N,_)  \
							 | 
						||
| 
								 | 
							
								        typedef typename enable_recursive<   \
							 | 
						||
| 
								 | 
							
								              BOOST_PP_CAT(T,N)              \
							 | 
						||
| 
								 | 
							
								            , RecursiveVariant               \
							 | 
						||
| 
								 | 
							
								            , mpl::true_                     \
							 | 
						||
| 
								 | 
							
								            >::type BOOST_PP_CAT(wknd_T,N);  \
							 | 
						||
| 
								 | 
							
								        /**/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    BOOST_PP_REPEAT(
							 | 
						||
| 
								 | 
							
								          BOOST_VARIANT_LIMIT_TYPES
							 | 
						||
| 
								 | 
							
								        , BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
							 | 
						||
| 
								 | 
							
								        , _
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // metafunction result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(wknd_T) > type;
							 | 
						||
| 
								 | 
							
								#endif // BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES workaround
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// no specializations: embedded variants unsupported on these compilers!
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}} // namespace detail::variant
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// metafunction make_recursive_variant
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// See docs and boost/variant/variant_fwd.hpp for more information.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
							 | 
						||
| 
								 | 
							
								struct make_recursive_variant
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public: // metafunction result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef boost::variant<
							 | 
						||
| 
								 | 
							
								          detail::variant::recursive_flag< T0 >
							 | 
						||
| 
								 | 
							
								        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
							 | 
						||
| 
								 | 
							
								        > type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// metafunction make_recursive_variant_over
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// See docs and boost/variant/variant_fwd.hpp for more information.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								template <typename Types>
							 | 
						||
| 
								 | 
							
								struct make_recursive_variant_over
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								private: // precondition assertions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    BOOST_STATIC_ASSERT(( ::boost::mpl::is_sequence<Types>::value ));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // metafunction result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename make_recursive_variant<
							 | 
						||
| 
								 | 
							
								          detail::variant::over_sequence< Types >
							 | 
						||
| 
								 | 
							
								        >::type type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_VARIANT_RECURSIVE_VARIANT_HPP
							 |