annotate DEPENDENCIES/generic/include/boost/variant/detail/substitute.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1
Chris@16 2 #if !defined(BOOST_PP_IS_ITERATING)
Chris@16 3
Chris@16 4 ///// header body
Chris@16 5
Chris@16 6 //-----------------------------------------------------------------------------
Chris@16 7 // boost variant/detail/substitute.hpp header file
Chris@16 8 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 9 //-----------------------------------------------------------------------------
Chris@16 10 //
Chris@16 11 // Copyright (c) 2003
Chris@16 12 // Eric Friedman
Chris@16 13 //
Chris@16 14 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 15 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 16 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 17
Chris@16 18 #ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
Chris@16 19 #define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
Chris@16 20
Chris@16 21 #include "boost/mpl/aux_/config/ctps.hpp"
Chris@16 22
Chris@16 23 #include "boost/variant/detail/substitute_fwd.hpp"
Chris@101 24 #include "boost/variant/variant_fwd.hpp" // for BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES
Chris@16 25 #include "boost/mpl/aux_/lambda_arity_param.hpp"
Chris@16 26 #include "boost/mpl/aux_/preprocessor/params.hpp"
Chris@16 27 #include "boost/mpl/aux_/preprocessor/repeat.hpp"
Chris@16 28 #include "boost/mpl/int_fwd.hpp"
Chris@16 29 #include "boost/mpl/limits/arity.hpp"
Chris@16 30 #include "boost/preprocessor/cat.hpp"
Chris@16 31 #include "boost/preprocessor/empty.hpp"
Chris@16 32 #include "boost/preprocessor/arithmetic/inc.hpp"
Chris@16 33 #include "boost/preprocessor/iterate.hpp"
Chris@16 34
Chris@16 35 namespace boost {
Chris@16 36 namespace detail { namespace variant {
Chris@16 37
Chris@16 38 #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
Chris@16 39
Chris@16 40 ///////////////////////////////////////////////////////////////////////////////
Chris@16 41 // (detail) metafunction substitute
Chris@16 42 //
Chris@16 43 // Substitutes one type for another in the given type expression.
Chris@16 44 //
Chris@16 45
Chris@16 46 //
Chris@16 47 // primary template
Chris@16 48 //
Chris@16 49 template <
Chris@16 50 typename T, typename Dest, typename Source
Chris@16 51 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
Chris@16 52 typename Arity /* = ... (see substitute_fwd.hpp) */
Chris@16 53 )
Chris@16 54 >
Chris@16 55 struct substitute
Chris@16 56 {
Chris@16 57 typedef T type;
Chris@16 58 };
Chris@16 59
Chris@16 60 //
Chris@16 61 // tag substitution specializations
Chris@16 62 //
Chris@16 63
Chris@16 64 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \
Chris@16 65 template <typename Dest, typename Source> \
Chris@16 66 struct substitute< \
Chris@16 67 CV_ Source \
Chris@16 68 , Dest \
Chris@16 69 , Source \
Chris@16 70 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
Chris@16 71 > \
Chris@16 72 { \
Chris@16 73 typedef CV_ Dest type; \
Chris@16 74 }; \
Chris@16 75 /**/
Chris@16 76
Chris@16 77 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )
Chris@16 78 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)
Chris@16 79 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)
Chris@16 80 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)
Chris@16 81
Chris@16 82 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG
Chris@16 83
Chris@16 84 //
Chris@16 85 // pointer specializations
Chris@16 86 //
Chris@16 87 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \
Chris@16 88 template <typename T, typename Dest, typename Source> \
Chris@16 89 struct substitute< \
Chris@16 90 T * CV_ \
Chris@16 91 , Dest \
Chris@16 92 , Source \
Chris@16 93 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
Chris@16 94 > \
Chris@16 95 { \
Chris@16 96 typedef typename substitute< \
Chris@16 97 T, Dest, Source \
Chris@16 98 >::type * CV_ type; \
Chris@16 99 }; \
Chris@16 100 /**/
Chris@16 101
Chris@16 102 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )
Chris@16 103 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)
Chris@16 104 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)
Chris@16 105 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)
Chris@16 106
Chris@16 107 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER
Chris@16 108
Chris@16 109 //
Chris@16 110 // reference specializations
Chris@16 111 //
Chris@16 112 template <typename T, typename Dest, typename Source>
Chris@16 113 struct substitute<
Chris@16 114 T&
Chris@16 115 , Dest
Chris@16 116 , Source
Chris@16 117 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
Chris@16 118 >
Chris@16 119 {
Chris@16 120 typedef typename substitute<
Chris@16 121 T, Dest, Source
Chris@16 122 >::type & type;
Chris@16 123 };
Chris@16 124
Chris@16 125 //
Chris@16 126 // template expression (i.e., F<...>) specializations
Chris@16 127 //
Chris@16 128
Chris@101 129 #if !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
Chris@101 130 template <
Chris@101 131 template <typename...> class F
Chris@101 132 , typename... Ts
Chris@101 133 , typename Dest
Chris@101 134 , typename Source
Chris@101 135 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
Chris@101 136 >
Chris@101 137 struct substitute<
Chris@101 138 F<Ts...>
Chris@101 139 , Dest
Chris@101 140 , Source
Chris@101 141 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
Chris@101 142 >
Chris@101 143 {
Chris@101 144 typedef F<typename substitute<
Chris@101 145 Ts, Dest, Source
Chris@101 146 >::type...> type;
Chris@101 147 };
Chris@101 148 #endif // !defined(BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES)
Chris@101 149
Chris@16 150 #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \
Chris@16 151 typedef typename substitute< \
Chris@16 152 BOOST_PP_CAT(U,N), Dest, Source \
Chris@16 153 >::type BOOST_PP_CAT(u,N); \
Chris@16 154 /**/
Chris@16 155
Chris@16 156 #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \
Chris@16 157 BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \
Chris@16 158 /**/
Chris@16 159
Chris@16 160 #define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
Chris@16 161 #define BOOST_PP_FILENAME_1 "boost/variant/detail/substitute.hpp"
Chris@16 162 #include BOOST_PP_ITERATE()
Chris@16 163
Chris@16 164 #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL
Chris@16 165 #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF
Chris@16 166
Chris@16 167 #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
Chris@16 168
Chris@16 169 }} // namespace detail::variant
Chris@16 170 } // namespace boost
Chris@16 171
Chris@16 172 #endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
Chris@16 173
Chris@16 174 ///// iteration, depth == 1
Chris@16 175
Chris@16 176 #elif BOOST_PP_ITERATION_DEPTH() == 1
Chris@16 177 #define i BOOST_PP_FRAME_ITERATION(1)
Chris@16 178
Chris@16 179 #if i > 0
Chris@16 180
Chris@16 181 //
Chris@16 182 // template specializations
Chris@16 183 //
Chris@16 184 template <
Chris@16 185 template < BOOST_MPL_PP_PARAMS(i,typename P) > class T
Chris@16 186 , BOOST_MPL_PP_PARAMS(i,typename U)
Chris@16 187 , typename Dest
Chris@16 188 , typename Source
Chris@16 189 >
Chris@16 190 struct substitute<
Chris@16 191 T< BOOST_MPL_PP_PARAMS(i,U) >
Chris@16 192 , Dest
Chris@16 193 , Source
Chris@16 194 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>)
Chris@16 195 >
Chris@16 196 {
Chris@16 197 private:
Chris@16 198 BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
Chris@16 199
Chris@16 200 public:
Chris@16 201 typedef T< BOOST_MPL_PP_PARAMS(i,u) > type;
Chris@16 202 };
Chris@16 203
Chris@16 204 //
Chris@16 205 // function specializations
Chris@16 206 //
Chris@16 207 template <
Chris@16 208 typename R
Chris@16 209 , BOOST_MPL_PP_PARAMS(i,typename U)
Chris@16 210 , typename Dest
Chris@16 211 , typename Source
Chris@16 212 >
Chris@16 213 struct substitute<
Chris@16 214 R (*)( BOOST_MPL_PP_PARAMS(i,U) )
Chris@16 215 , Dest
Chris@16 216 , Source
Chris@16 217 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
Chris@16 218 >
Chris@16 219 {
Chris@16 220 private:
Chris@16 221 typedef typename substitute< R, Dest, Source >::type r;
Chris@16 222 BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
Chris@16 223
Chris@16 224 public:
Chris@16 225 typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) );
Chris@16 226 };
Chris@16 227
Chris@16 228 #elif i == 0
Chris@16 229
Chris@16 230 //
Chris@16 231 // zero-arg function specialization
Chris@16 232 //
Chris@16 233 template <
Chris@16 234 typename R, typename Dest, typename Source
Chris@16 235 >
Chris@16 236 struct substitute<
Chris@16 237 R (*)( void )
Chris@16 238 , Dest
Chris@16 239 , Source
Chris@16 240 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
Chris@16 241 >
Chris@16 242 {
Chris@16 243 private:
Chris@16 244 typedef typename substitute< R, Dest, Source >::type r;
Chris@16 245
Chris@16 246 public:
Chris@16 247 typedef r (*type)( void );
Chris@16 248 };
Chris@16 249
Chris@16 250 #endif // i
Chris@16 251
Chris@16 252 #undef i
Chris@16 253 #endif // BOOST_PP_IS_ITERATING