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
|