annotate DEPENDENCIES/generic/include/boost/variant/recursive_variant.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 //-----------------------------------------------------------------------------
Chris@16 2 // boost variant/recursive_variant.hpp header file
Chris@16 3 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 4 //-----------------------------------------------------------------------------
Chris@16 5 //
Chris@101 6 // Copyright (c) 2003 Eric Friedman
Chris@101 7 // Copyright (c) 2013 Antony Polukhin
Chris@16 8 //
Chris@16 9 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 10 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 11 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 12
Chris@16 13 #ifndef BOOST_VARIANT_RECURSIVE_VARIANT_HPP
Chris@16 14 #define BOOST_VARIANT_RECURSIVE_VARIANT_HPP
Chris@16 15
Chris@16 16 #include "boost/variant/variant_fwd.hpp"
Chris@16 17 #include "boost/variant/detail/enable_recursive.hpp"
Chris@16 18 #include "boost/variant/detail/substitute_fwd.hpp"
Chris@16 19 #include "boost/variant/detail/make_variant_list.hpp"
Chris@16 20 #include "boost/variant/detail/over_sequence.hpp"
Chris@16 21
Chris@16 22 #include "boost/mpl/aux_/lambda_arity_param.hpp"
Chris@16 23
Chris@16 24 #include "boost/mpl/equal.hpp"
Chris@16 25 #include "boost/mpl/eval_if.hpp"
Chris@16 26 #include "boost/mpl/identity.hpp"
Chris@16 27 #include "boost/mpl/if.hpp"
Chris@16 28 #include "boost/mpl/protect.hpp"
Chris@16 29 #include "boost/mpl/transform.hpp"
Chris@16 30 #include "boost/type_traits/is_same.hpp"
Chris@16 31 #include "boost/preprocessor/cat.hpp"
Chris@16 32 #include "boost/preprocessor/repeat.hpp"
Chris@16 33
Chris@16 34 #include "boost/mpl/bool.hpp"
Chris@16 35 #include "boost/mpl/is_sequence.hpp"
Chris@16 36 #include "boost/variant/variant.hpp"
Chris@16 37
Chris@16 38 namespace boost {
Chris@16 39
Chris@16 40 namespace detail { namespace variant {
Chris@16 41
Chris@16 42 ///////////////////////////////////////////////////////////////////////////////
Chris@16 43 // (detail) metafunction specialization substitute
Chris@16 44 //
Chris@16 45 // Handles embedded variant types when substituting for recursive_variant_.
Chris@16 46 //
Chris@16 47
Chris@16 48 #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
Chris@16 49
Chris@16 50 template <
Chris@16 51 BOOST_VARIANT_ENUM_PARAMS(typename T)
Chris@16 52 , typename RecursiveVariant
Chris@16 53 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
Chris@16 54 >
Chris@16 55 struct substitute<
Chris@16 56 ::boost::variant<
Chris@16 57 recursive_flag< T0 >
Chris@16 58 , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
Chris@16 59 >
Chris@16 60 , RecursiveVariant
Chris@16 61 , ::boost::recursive_variant_
Chris@16 62 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
Chris@16 63 >
Chris@16 64 {
Chris@16 65 typedef ::boost::variant<
Chris@16 66 recursive_flag< T0 >
Chris@16 67 , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
Chris@16 68 > type;
Chris@16 69 };
Chris@16 70
Chris@16 71 template <
Chris@16 72 BOOST_VARIANT_ENUM_PARAMS(typename T)
Chris@16 73 , typename RecursiveVariant
Chris@16 74 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
Chris@16 75 >
Chris@16 76 struct substitute<
Chris@16 77 ::boost::variant<
Chris@16 78 ::boost::detail::variant::over_sequence< T0 >
Chris@16 79 , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
Chris@16 80 >
Chris@16 81 , RecursiveVariant
Chris@16 82 , ::boost::recursive_variant_
Chris@16 83 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
Chris@16 84 >
Chris@16 85 {
Chris@16 86 private:
Chris@16 87
Chris@16 88 typedef T0 initial_types;
Chris@16 89
Chris@16 90 typedef typename mpl::transform<
Chris@16 91 initial_types
Chris@16 92 , mpl::protect< quoted_enable_recursive<RecursiveVariant,mpl::true_> >
Chris@16 93 >::type types;
Chris@16 94
Chris@16 95 public:
Chris@16 96
Chris@16 97 typedef typename mpl::if_<
Chris@16 98 mpl::equal<initial_types, types, ::boost::is_same<mpl::_1, mpl::_2> >
Chris@16 99 , ::boost::variant<
Chris@16 100 ::boost::detail::variant::over_sequence< T0 >
Chris@16 101 , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
Chris@16 102 >
Chris@16 103 , ::boost::variant< over_sequence<types> >
Chris@16 104 >::type type;
Chris@16 105 };
Chris@16 106
Chris@16 107 template <
Chris@16 108 BOOST_VARIANT_ENUM_PARAMS(typename T)
Chris@16 109 , typename RecursiveVariant
Chris@16 110 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
Chris@16 111 >
Chris@16 112 struct substitute<
Chris@16 113 ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(T) >
Chris@16 114 , RecursiveVariant
Chris@16 115 , ::boost::recursive_variant_
Chris@16 116 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
Chris@16 117 >
Chris@16 118 {
Chris@101 119 #if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
Chris@101 120
Chris@101 121 typedef ::boost::variant<
Chris@101 122 typename enable_recursive<
Chris@101 123 T0
Chris@101 124 , RecursiveVariant
Chris@101 125 , mpl::true_
Chris@101 126 >::type,
Chris@101 127 typename enable_recursive<
Chris@101 128 TN
Chris@101 129 , RecursiveVariant
Chris@101 130 , mpl::true_
Chris@101 131 >::type...
Chris@101 132 > type;
Chris@101 133
Chris@101 134 #else // defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
Chris@101 135
Chris@16 136 private: // helpers, for metafunction result (below)
Chris@16 137
Chris@16 138 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS(z,N,_) \
Chris@16 139 typedef typename enable_recursive< \
Chris@16 140 BOOST_PP_CAT(T,N) \
Chris@16 141 , RecursiveVariant \
Chris@16 142 , mpl::true_ \
Chris@16 143 >::type BOOST_PP_CAT(wknd_T,N); \
Chris@16 144 /**/
Chris@16 145
Chris@16 146 BOOST_PP_REPEAT(
Chris@16 147 BOOST_VARIANT_LIMIT_TYPES
Chris@16 148 , BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
Chris@16 149 , _
Chris@16 150 )
Chris@16 151
Chris@16 152 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_TYPEDEFS
Chris@16 153
Chris@16 154 public: // metafunction result
Chris@16 155
Chris@16 156 typedef ::boost::variant< BOOST_VARIANT_ENUM_PARAMS(wknd_T) > type;
Chris@101 157 #endif // BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES workaround
Chris@16 158 };
Chris@16 159
Chris@16 160 #else // defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
Chris@16 161
Chris@16 162 //
Chris@16 163 // no specializations: embedded variants unsupported on these compilers!
Chris@16 164 //
Chris@16 165
Chris@16 166 #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
Chris@16 167
Chris@16 168 }} // namespace detail::variant
Chris@16 169
Chris@16 170 ///////////////////////////////////////////////////////////////////////////////
Chris@16 171 // metafunction make_recursive_variant
Chris@16 172 //
Chris@16 173 // See docs and boost/variant/variant_fwd.hpp for more information.
Chris@16 174 //
Chris@16 175 template < BOOST_VARIANT_ENUM_PARAMS(typename T) >
Chris@16 176 struct make_recursive_variant
Chris@16 177 {
Chris@16 178 public: // metafunction result
Chris@16 179
Chris@16 180 typedef boost::variant<
Chris@16 181 detail::variant::recursive_flag< T0 >
Chris@16 182 , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)
Chris@16 183 > type;
Chris@16 184
Chris@16 185 };
Chris@16 186
Chris@16 187 ///////////////////////////////////////////////////////////////////////////////
Chris@16 188 // metafunction make_recursive_variant_over
Chris@16 189 //
Chris@16 190 // See docs and boost/variant/variant_fwd.hpp for more information.
Chris@16 191 //
Chris@16 192 template <typename Types>
Chris@16 193 struct make_recursive_variant_over
Chris@16 194 {
Chris@16 195 private: // precondition assertions
Chris@16 196
Chris@16 197 BOOST_STATIC_ASSERT(( ::boost::mpl::is_sequence<Types>::value ));
Chris@16 198
Chris@16 199 public: // metafunction result
Chris@16 200
Chris@16 201 typedef typename make_recursive_variant<
Chris@16 202 detail::variant::over_sequence< Types >
Chris@16 203 >::type type;
Chris@16 204
Chris@16 205 };
Chris@16 206
Chris@16 207 } // namespace boost
Chris@16 208
Chris@16 209 #endif // BOOST_VARIANT_RECURSIVE_VARIANT_HPP