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 |