2 // NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
\r
4 #if !defined(BOOST_PP_IS_ITERATING)
\r
8 // Copyright Aleksey Gurtovoy 2000-2008
\r
10 // Distributed under the Boost Software License, Version 1.0.
\r
11 // (See accompanying file LICENSE_1_0.txt or copy at
\r
12 // http://www.boost.org/LICENSE_1_0.txt)
\r
14 // See http://www.boost.org/libs/mpl for documentation.
\r
16 // $Id: sequence_wrapper.hpp 49271 2008-10-11 06:46:00Z agurtovoy $
\r
17 // $Date: 2008-10-11 02:46:00 -0400 (Sat, 11 Oct 2008) $
\r
18 // $Revision: 49271 $
\r
20 # include <boost/mpl/aux_/config/ctps.hpp>
\r
21 # include <boost/mpl/aux_/config/static_constant.hpp>
\r
22 # include <boost/mpl/aux_/nttp_decl.hpp>
\r
24 # include <boost/preprocessor/arithmetic/sub.hpp>
\r
25 # include <boost/preprocessor/tuple/elem.hpp>
\r
26 # include <boost/preprocessor/enum_params_with_a_default.hpp>
\r
27 # include <boost/preprocessor/enum_params.hpp>
\r
28 # include <boost/preprocessor/enum.hpp>
\r
29 # include <boost/preprocessor/repeat.hpp>
\r
30 # include <boost/preprocessor/comma_if.hpp>
\r
31 # include <boost/preprocessor/iterate.hpp>
\r
33 #if defined(BOOST_MPL_PREPROCESSING_MODE)
\r
37 namespace boost { namespace mpl {
\r
39 #if !defined(AUX778076_SEQUENCE_BASE_NAME)
\r
40 # define AUX778076_SEQUENCE_BASE_NAME AUX778076_SEQUENCE_NAME
\r
43 #if !defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)
\r
45 # define AUX778076_SEQUENCE_PARAM_NAME T
\r
46 # define AUX778076_SEQUENCE_TEMPLATE_PARAM typename T
\r
47 # define AUX778076_SEQUENCE_DEFAULT na
\r
49 # define AUX778076_SEQUENCE_NAME_N(n) \
\r
50 BOOST_PP_CAT(AUX778076_SEQUENCE_BASE_NAME,n) \
\r
53 # define AUX778076_SEQUENCE_PARAMS() \
\r
54 BOOST_PP_ENUM_PARAMS( \
\r
55 AUX778076_SEQUENCE_LIMIT \
\r
56 , AUX778076_SEQUENCE_TEMPLATE_PARAM \
\r
60 # define AUX778076_SEQUENCE_ARGS() \
\r
61 BOOST_PP_ENUM_PARAMS( \
\r
62 AUX778076_SEQUENCE_LIMIT \
\r
67 # define AUX778076_SEQUENCE_DEFAULT_PARAMS() \
\r
68 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \
\r
69 AUX778076_SEQUENCE_LIMIT \
\r
70 , AUX778076_SEQUENCE_TEMPLATE_PARAM \
\r
71 , AUX778076_SEQUENCE_DEFAULT \
\r
75 # define AUX778076_SEQUENCE_N_PARAMS(n) \
\r
76 BOOST_PP_ENUM_PARAMS(n, AUX778076_SEQUENCE_TEMPLATE_PARAM) \
\r
79 # define AUX778076_SEQUENCE_N_ARGS(n) \
\r
80 BOOST_PP_ENUM_PARAMS(n, T) \
\r
83 # define AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(n) \
\r
84 BOOST_PP_ENUM_PARAMS(n, T) \
\r
85 BOOST_PP_COMMA_IF(n) \
\r
87 BOOST_PP_SUB_D(1,AUX778076_SEQUENCE_LIMIT,n) \
\r
88 , BOOST_PP_TUPLE_ELEM_3_2 \
\r
89 , AUX778076_SEQUENCE_DEFAULT \
\r
93 #else // AUX778076_SEQUENCE_INTEGRAL_WRAPPER
\r
95 # define AUX778076_SEQUENCE_PARAM_NAME C
\r
96 # define AUX778076_SEQUENCE_TEMPLATE_PARAM BOOST_MPL_AUX_NTTP_DECL(long, C)
\r
97 # define AUX778076_SEQUENCE_DEFAULT LONG_MAX
\r
99 # define AUX778076_SEQUENCE_PARAMS() \
\r
100 typename T, BOOST_PP_ENUM_PARAMS( \
\r
101 AUX778076_SEQUENCE_LIMIT \
\r
102 , AUX778076_SEQUENCE_TEMPLATE_PARAM \
\r
106 # define AUX778076_SEQUENCE_ARGS() \
\r
107 T, BOOST_PP_ENUM_PARAMS( \
\r
108 AUX778076_SEQUENCE_LIMIT \
\r
113 # define AUX778076_SEQUENCE_DEFAULT_PARAMS() \
\r
115 BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \
\r
116 AUX778076_SEQUENCE_LIMIT \
\r
117 , AUX778076_SEQUENCE_TEMPLATE_PARAM \
\r
118 , AUX778076_SEQUENCE_DEFAULT \
\r
122 # define AUX778076_SEQUENCE_N_PARAMS(n) \
\r
123 typename T BOOST_PP_COMMA_IF(n) \
\r
124 BOOST_PP_ENUM_PARAMS(n, AUX778076_SEQUENCE_TEMPLATE_PARAM) \
\r
127 # if !defined(AUX778076_SEQUENCE_CONVERT_CN_TO)
\r
128 # define AUX778076_SEQUENCE_CONVERT_CN_TO(z,n,TARGET) BOOST_PP_CAT(C,n)
\r
131 # define AUX778076_SEQUENCE_N_ARGS(n) \
\r
132 T BOOST_PP_COMMA_IF(n) \
\r
133 BOOST_PP_ENUM(n,AUX778076_SEQUENCE_CONVERT_CN_TO,T) \
\r
136 # define AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(n) \
\r
137 T, BOOST_PP_ENUM_PARAMS(n, C) \
\r
138 BOOST_PP_COMMA_IF(n) \
\r
140 BOOST_PP_SUB_D(1,AUX778076_SEQUENCE_LIMIT,n) \
\r
141 , BOOST_PP_TUPLE_ELEM_3_2 \
\r
142 , AUX778076_SEQUENCE_DEFAULT \
\r
146 #endif // AUX778076_SEQUENCE_INTEGRAL_WRAPPER
\r
149 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
\r
150 // forward declaration
\r
152 AUX778076_SEQUENCE_DEFAULT_PARAMS()
\r
154 struct AUX778076_SEQUENCE_NAME;
\r
157 template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
\r
158 struct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser);
\r
162 #define BOOST_PP_ITERATION_PARAMS_1 \
\r
163 (3,(0, AUX778076_SEQUENCE_LIMIT, <boost/mpl/aux_/sequence_wrapper.hpp>))
\r
164 #include BOOST_PP_ITERATE()
\r
166 // real C++ version is already taken care of
\r
167 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
\r
171 #define AUX778076_COUNT_ARGS_PREFIX AUX778076_SEQUENCE_NAME
\r
172 #define AUX778076_COUNT_ARGS_DEFAULT AUX778076_SEQUENCE_DEFAULT
\r
173 #define AUX778076_COUNT_ARGS_PARAM_NAME AUX778076_SEQUENCE_PARAM_NAME
\r
174 #define AUX778076_COUNT_ARGS_TEMPLATE_PARAM AUX778076_SEQUENCE_TEMPLATE_PARAM
\r
175 #define AUX778076_COUNT_ARGS_ARITY AUX778076_SEQUENCE_LIMIT
\r
176 #define AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES
\r
177 #include <boost/mpl/aux_/count_args.hpp>
\r
180 AUX778076_SEQUENCE_PARAMS()
\r
182 struct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)
\r
184 typedef aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_count_args)<
\r
185 BOOST_PP_ENUM_PARAMS(AUX778076_SEQUENCE_LIMIT, AUX778076_SEQUENCE_PARAM_NAME)
\r
188 typedef typename aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser)< arg_num_::value >
\r
189 ::template result_< AUX778076_SEQUENCE_ARGS() >::type type;
\r
195 AUX778076_SEQUENCE_DEFAULT_PARAMS()
\r
197 struct AUX778076_SEQUENCE_NAME
\r
198 : aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)<
\r
199 AUX778076_SEQUENCE_ARGS()
\r
202 typedef typename aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)<
\r
203 AUX778076_SEQUENCE_ARGS()
\r
207 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
\r
209 # undef AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS
\r
210 # undef AUX778076_SEQUENCE_N_ARGS
\r
211 # undef AUX778076_SEQUENCE_CONVERT_CN_TO
\r
212 # undef AUX778076_SEQUENCE_N_PARAMS
\r
213 # undef AUX778076_SEQUENCE_DEFAULT_PARAMS
\r
214 # undef AUX778076_SEQUENCE_ARGS
\r
215 # undef AUX778076_SEQUENCE_PARAMS
\r
216 # undef AUX778076_SEQUENCE_NAME_N
\r
217 # undef AUX778076_SEQUENCE_DEFAULT
\r
218 # undef AUX778076_SEQUENCE_TEMPLATE_PARAM
\r
219 # undef AUX778076_SEQUENCE_PARAM_NAME
\r
220 # undef AUX778076_SEQUENCE_LIMIT
\r
221 # undef AUX778076_SEQUENCE_BASE_NAME
\r
222 # undef AUX778076_SEQUENCE_NAME
\r
223 # undef AUX778076_SEQUENCE_INTEGRAL_WRAPPER
\r
230 #define i_ BOOST_PP_FRAME_ITERATION(1)
\r
232 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
\r
234 #if i_ == AUX778076_SEQUENCE_LIMIT
\r
236 /// primary template (not a specialization!)
\r
238 AUX778076_SEQUENCE_N_PARAMS(i_)
\r
240 struct AUX778076_SEQUENCE_NAME
\r
241 : AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >
\r
243 typedef typename AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;
\r
249 AUX778076_SEQUENCE_N_PARAMS(i_)
\r
251 struct AUX778076_SEQUENCE_NAME< AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(i_) >
\r
252 : AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >
\r
254 #if i_ > 0 || defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)
\r
255 typedef typename AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;
\r
257 typedef AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;
\r
261 #endif // i_ == AUX778076_SEQUENCE_LIMIT
\r
268 struct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser)<i_>
\r
271 AUX778076_SEQUENCE_PARAMS()
\r
275 #if i_ > 0 || defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)
\r
276 typedef typename AUX778076_SEQUENCE_NAME_N(i_)<
\r
277 AUX778076_SEQUENCE_N_ARGS(i_)
\r
280 typedef AUX778076_SEQUENCE_NAME_N(i_)<
\r
281 AUX778076_SEQUENCE_N_ARGS(i_)
\r
289 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
\r
292 #endif // BOOST_PP_IS_ITERATING
\r