//----------------------------------------------------------------------------- // 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 #include #if !defined(BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT) # include # include # include #endif #include #include #include #include #include #include #include #include #include namespace boost { namespace detail { namespace variant { # define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL(T,Dest,Source) \ substitute< T , Dest , Source > \ /**/ /////////////////////////////////////////////////////////////////////////////// // (detail) metafunction enable_recursive // // See boost/variant/detail/enable_recursive_fwd.hpp for more information. // template struct enable_recursive : BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL( T, RecursiveVariant, ::boost::recursive_variant_ ) { }; template 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 , is_pointer > , t_ , boost::recursive_wrapper >::type type; }; /////////////////////////////////////////////////////////////////////////////// // (detail) metafunction class quoted_enable_recursive // // Same behavior as enable_recursive metafunction (see above). // template struct quoted_enable_recursive { template struct apply : enable_recursive { }; }; }} // namespace detail::variant } // namespace boost #endif // BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_HPP