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