134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// boost variant/detail/enable_recursive.hpp header file
							 | 
						||
| 
								 | 
							
								// See http://www.boost.org for updates, documentation, and revision history.
							 | 
						||
| 
								 | 
							
								//-----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2003
							 | 
						||
| 
								 | 
							
								// Eric Friedman
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// 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_DETAIL_ENABLE_RECURSIVE_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/enable_recursive_fwd.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/variant/variant_fwd.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT)
							 | 
						||
| 
								 | 
							
								#   include <boost/mpl/apply.hpp>
							 | 
						||
| 
								 | 
							
								#   include <boost/mpl/eval_if.hpp>
							 | 
						||
| 
								 | 
							
								#   include <boost/mpl/lambda.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/detail/substitute.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/aux_/config/ctps.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/bool_fwd.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/if.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/mpl/or.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/is_pointer.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/is_reference.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/is_same.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/variant/recursive_wrapper.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace detail { namespace variant {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#   define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \
							 | 
						||
| 
								 | 
							
								    substitute< T , Dest , Source > \
							 | 
						||
| 
								 | 
							
								    /**/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// (detail) class template rebind1
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Limited workaround in case 'substitute' metafunction unavailable.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T, typename U1>
							 | 
						||
| 
								 | 
							
								struct rebind1
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								    typedef typename mpl::lambda<
							 | 
						||
| 
								 | 
							
								          mpl::identity<T>
							 | 
						||
| 
								 | 
							
								        >::type le_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    typedef typename mpl::eval_if<
							 | 
						||
| 
								 | 
							
								          is_same< le_, mpl::identity<T> >
							 | 
						||
| 
								 | 
							
								        , le_ // identity<T>
							 | 
						||
| 
								 | 
							
								        , mpl::apply1<le_, U1>
							 | 
						||
| 
								 | 
							
								        >::type type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#   define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \
							 | 
						||
| 
								 | 
							
								    rebind1< T , Dest > \
							 | 
						||
| 
								 | 
							
								    /**/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// (detail) metafunction enable_recursive
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// See boost/variant/detail/enable_recursive_fwd.hpp for more information.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T, typename RecursiveVariant, typename NoWrapper>
							 | 
						||
| 
								 | 
							
								struct enable_recursive
							 | 
						||
| 
								 | 
							
								    : BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
							 | 
						||
| 
								 | 
							
								          T, RecursiveVariant, ::boost::recursive_variant_
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template <typename T, typename RecursiveVariant>
							 | 
						||
| 
								 | 
							
								struct enable_recursive< T,RecursiveVariant,mpl::false_ >
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								private: // helpers, for metafunction result (below)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(
							 | 
						||
| 
								 | 
							
								          T, RecursiveVariant, ::boost::recursive_variant_
							 | 
						||
| 
								 | 
							
								        )::type t_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public: // metafunction result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // [Wrap with recursive_wrapper only if rebind really changed something:]
							 | 
						||
| 
								 | 
							
								    typedef typename mpl::if_<
							 | 
						||
| 
								 | 
							
								          mpl::or_<
							 | 
						||
| 
								 | 
							
								              is_same< t_,T >
							 | 
						||
| 
								 | 
							
								            , is_reference<t_>
							 | 
						||
| 
								 | 
							
								            , is_pointer<t_>
							 | 
						||
| 
								 | 
							
								            >
							 | 
						||
| 
								 | 
							
								        , t_
							 | 
						||
| 
								 | 
							
								        , boost::recursive_wrapper<t_>
							 | 
						||
| 
								 | 
							
								        >::type type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// (detail) metafunction class quoted_enable_recursive
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Same behavior as enable_recursive metafunction (see above).
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								template <typename RecursiveVariant, typename NoWrapper>
							 | 
						||
| 
								 | 
							
								struct quoted_enable_recursive
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template <typename T>
							 | 
						||
| 
								 | 
							
								    struct apply
							 | 
						||
| 
								 | 
							
								        : enable_recursive<T, RecursiveVariant, NoWrapper>
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}} // namespace detail::variant
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP
							 |