123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- //-----------------------------------------------------------------------------
- // 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
|