Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
2 #if !defined(BOOST_PP_IS_ITERATING)
6 //-----------------------------------------------------------------------------
7 // boost variant/detail/substitute.hpp header file
8 // See http://www.boost.org for updates, documentation, and revision history.
9 //-----------------------------------------------------------------------------
14 // Distributed under the Boost Software License, Version 1.0. (See
15 // accompanying file LICENSE_1_0.txt or copy at
16 // http://www.boost.org/LICENSE_1_0.txt)
18 #ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
19 #define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
21 #include "boost/mpl/aux_/config/ctps.hpp"
23 #include "boost/variant/detail/substitute_fwd.hpp"
24 #include "boost/mpl/aux_/lambda_arity_param.hpp"
25 #include "boost/mpl/aux_/preprocessor/params.hpp"
26 #include "boost/mpl/aux_/preprocessor/repeat.hpp"
27 #include "boost/mpl/int_fwd.hpp"
28 #include "boost/mpl/limits/arity.hpp"
29 #include "boost/preprocessor/cat.hpp"
30 #include "boost/preprocessor/empty.hpp"
31 #include "boost/preprocessor/arithmetic/inc.hpp"
32 #include "boost/preprocessor/iterate.hpp"
35 namespace detail { namespace variant {
37 #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
39 ///////////////////////////////////////////////////////////////////////////////
40 // (detail) metafunction substitute
42 // Substitutes one type for another in the given type expression.
49 typename T, typename Dest, typename Source
50 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
51 typename Arity /* = ... (see substitute_fwd.hpp) */
60 // tag substitution specializations
63 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \
64 template <typename Dest, typename Source> \
69 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
72 typedef CV_ Dest type; \
76 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )
77 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)
78 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)
79 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)
81 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG
84 // pointer specializations
86 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \
87 template <typename T, typename Dest, typename Source> \
92 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
95 typedef typename substitute< \
101 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )
102 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)
103 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)
104 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)
106 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER
109 // reference specializations
111 template <typename T, typename Dest, typename Source>
116 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
119 typedef typename substitute<
125 // template expression (i.e., F<...>) specializations
128 #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \
129 typedef typename substitute< \
130 BOOST_PP_CAT(U,N), Dest, Source \
131 >::type BOOST_PP_CAT(u,N); \
134 #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \
135 BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \
138 #define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
139 #define BOOST_PP_FILENAME_1 "boost/variant/detail/substitute.hpp"
140 #include BOOST_PP_ITERATE()
142 #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL
143 #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF
145 #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
147 }} // namespace detail::variant
150 #endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
152 ///// iteration, depth == 1
154 #elif BOOST_PP_ITERATION_DEPTH() == 1
155 #define i BOOST_PP_FRAME_ITERATION(1)
160 // template specializations
163 template < BOOST_MPL_PP_PARAMS(i,typename P) > class T
164 , BOOST_MPL_PP_PARAMS(i,typename U)
169 T< BOOST_MPL_PP_PARAMS(i,U) >
172 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>)
176 BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
179 typedef T< BOOST_MPL_PP_PARAMS(i,u) > type;
183 // function specializations
187 , BOOST_MPL_PP_PARAMS(i,typename U)
192 R (*)( BOOST_MPL_PP_PARAMS(i,U) )
195 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
199 typedef typename substitute< R, Dest, Source >::type r;
200 BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
203 typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) );
209 // zero-arg function specialization
212 typename R, typename Dest, typename Source
218 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
222 typedef typename substitute< R, Dest, Source >::type r;
225 typedef r (*type)( void );
231 #endif // BOOST_PP_IS_ITERATING