Chris@16
|
1 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 /// \file proto_fwd.hpp
|
Chris@16
|
3 /// Forward declarations of all of proto's public types and functions.
|
Chris@16
|
4 //
|
Chris@16
|
5 // Copyright 2008 Eric Niebler. Distributed under the Boost
|
Chris@16
|
6 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_PROTO_FWD_HPP_EAN_04_01_2005
|
Chris@16
|
10 #define BOOST_PROTO_FWD_HPP_EAN_04_01_2005
|
Chris@16
|
11
|
Chris@16
|
12 #include <cstddef>
|
Chris@16
|
13 #include <climits>
|
Chris@16
|
14 #include <boost/config.hpp>
|
Chris@16
|
15 #include <boost/detail/workaround.hpp>
|
Chris@16
|
16 #include <boost/preprocessor/cat.hpp>
|
Chris@16
|
17 #include <boost/preprocessor/arithmetic/inc.hpp>
|
Chris@16
|
18 #include <boost/preprocessor/punctuation/comma.hpp>
|
Chris@16
|
19 #include <boost/preprocessor/repetition/enum_params.hpp>
|
Chris@16
|
20 #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
|
Chris@16
|
21 #include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
|
Chris@16
|
22 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
|
Chris@16
|
23 #include <boost/ref.hpp>
|
Chris@16
|
24 #include <boost/mpl/long.hpp>
|
Chris@16
|
25 #include <boost/type_traits/remove_const.hpp>
|
Chris@16
|
26 #include <boost/type_traits/remove_reference.hpp>
|
Chris@16
|
27 #include <boost/mpl/aux_/config/ttp.hpp>
|
Chris@16
|
28 #include <boost/utility/result_of.hpp>
|
Chris@16
|
29
|
Chris@16
|
30 #ifndef BOOST_PROTO_MAX_ARITY
|
Chris@16
|
31 # define BOOST_PROTO_MAX_ARITY 10
|
Chris@16
|
32 #endif
|
Chris@16
|
33
|
Chris@16
|
34 #ifndef BOOST_PROTO_MAX_LOGICAL_ARITY
|
Chris@16
|
35 # define BOOST_PROTO_MAX_LOGICAL_ARITY 10
|
Chris@16
|
36 #endif
|
Chris@16
|
37
|
Chris@16
|
38 #ifndef BOOST_PROTO_MAX_FUNCTION_CALL_ARITY
|
Chris@16
|
39 # define BOOST_PROTO_MAX_FUNCTION_CALL_ARITY BOOST_PROTO_MAX_ARITY
|
Chris@16
|
40 #endif
|
Chris@16
|
41
|
Chris@16
|
42 #if BOOST_PROTO_MAX_ARITY < 3
|
Chris@16
|
43 # error BOOST_PROTO_MAX_ARITY must be at least 3
|
Chris@16
|
44 #endif
|
Chris@16
|
45
|
Chris@16
|
46 #if BOOST_PROTO_MAX_FUNCTION_CALL_ARITY > BOOST_PROTO_MAX_ARITY
|
Chris@16
|
47 # error BOOST_PROTO_MAX_FUNCTION_CALL_ARITY cannot be larger than BOOST_PROTO_MAX_ARITY
|
Chris@16
|
48 #endif
|
Chris@16
|
49
|
Chris@16
|
50 #ifndef BOOST_PROTO_DONT_USE_PREPROCESSED_FILES
|
Chris@16
|
51 #if 10 < BOOST_PROTO_MAX_ARITY || \
|
Chris@16
|
52 10 < BOOST_PROTO_MAX_LOGICAL_ARITY || \
|
Chris@16
|
53 10 < BOOST_PROTO_MAX_FUNCTION_CALL_ARITY
|
Chris@16
|
54 #define BOOST_PROTO_DONT_USE_PREPROCESSED_FILES
|
Chris@16
|
55 #endif
|
Chris@16
|
56 #endif
|
Chris@16
|
57
|
Chris@16
|
58 #ifndef BOOST_PROTO_BROKEN_CONST_OVERLOADS
|
Chris@16
|
59 # if BOOST_WORKAROUND(__GNUC__, == 3) \
|
Chris@16
|
60 || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(310))
|
Chris@16
|
61 # define BOOST_PROTO_BROKEN_CONST_OVERLOADS
|
Chris@16
|
62 # endif
|
Chris@16
|
63 #endif
|
Chris@16
|
64
|
Chris@16
|
65 #ifndef BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS
|
Chris@16
|
66 # if BOOST_WORKAROUND(__GNUC__, == 3) \
|
Chris@16
|
67 || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(310))
|
Chris@16
|
68 # define BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS
|
Chris@16
|
69 # endif
|
Chris@16
|
70 #endif
|
Chris@16
|
71
|
Chris@16
|
72 #ifdef BOOST_PROTO_BROKEN_CONST_OVERLOADS
|
Chris@16
|
73 # include <boost/utility/enable_if.hpp>
|
Chris@16
|
74 # include <boost/type_traits/is_const.hpp>
|
Chris@16
|
75 # define BOOST_PROTO_DISABLE_IF_IS_CONST(T)\
|
Chris@16
|
76 , typename boost::disable_if_c<boost::is_const<T>::value, boost::proto::detail::undefined>::type * = 0
|
Chris@16
|
77 #else
|
Chris@16
|
78 # define BOOST_PROTO_DISABLE_IF_IS_CONST(T)
|
Chris@16
|
79 #endif
|
Chris@16
|
80
|
Chris@16
|
81 #ifdef BOOST_PROTO_BROKEN_CONST_QUALIFIED_FUNCTIONS
|
Chris@16
|
82 # include <boost/utility/enable_if.hpp>
|
Chris@16
|
83 # include <boost/type_traits/is_function.hpp>
|
Chris@16
|
84 # define BOOST_PROTO_DISABLE_IF_IS_FUNCTION(T)\
|
Chris@16
|
85 , typename boost::disable_if_c<boost::is_function<T>::value, boost::proto::detail::undefined>::type * = 0
|
Chris@16
|
86 #else
|
Chris@16
|
87 # define BOOST_PROTO_DISABLE_IF_IS_FUNCTION(T)
|
Chris@16
|
88 #endif
|
Chris@16
|
89
|
Chris@16
|
90 #ifndef BOOST_PROTO_BROKEN_PTS
|
Chris@16
|
91 # if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
|
Chris@16
|
92 # define BOOST_PROTO_BROKEN_PTS
|
Chris@16
|
93 # endif
|
Chris@16
|
94 #endif
|
Chris@16
|
95
|
Chris@16
|
96 #ifdef BOOST_NO_CXX11_DECLTYPE_N3276
|
Chris@16
|
97 # // Proto can only use the decltype-based result_of if N3276 has been
|
Chris@16
|
98 # // implemented by the compiler.
|
Chris@16
|
99 # // See http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3276.pdf
|
Chris@16
|
100 # ifndef BOOST_PROTO_USE_NORMAL_RESULT_OF
|
Chris@16
|
101 # define BOOST_PROTO_USE_NORMAL_RESULT_OF
|
Chris@16
|
102 # endif
|
Chris@16
|
103 #endif
|
Chris@16
|
104
|
Chris@16
|
105 // Unless compiler support is there, use tr1_result_of instead of
|
Chris@16
|
106 // result_of to avoid the problems addressed by N3276.
|
Chris@16
|
107 #ifdef BOOST_PROTO_USE_NORMAL_RESULT_OF
|
Chris@16
|
108 # define BOOST_PROTO_RESULT_OF boost::result_of
|
Chris@16
|
109 #else
|
Chris@16
|
110 # define BOOST_PROTO_RESULT_OF boost::tr1_result_of
|
Chris@16
|
111 #endif
|
Chris@16
|
112
|
Chris@16
|
113 // If we're using the decltype-based result_of, we need to be a bit
|
Chris@16
|
114 // stricter about the return types of some functions.
|
Chris@16
|
115 #if defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_PROTO_USE_NORMAL_RESULT_OF)
|
Chris@16
|
116 # define BOOST_PROTO_STRICT_RESULT_OF
|
Chris@16
|
117 # define BOOST_PROTO_RETURN_TYPE_STRICT_LOOSE(X, Y) X
|
Chris@16
|
118 #else
|
Chris@16
|
119 # define BOOST_PROTO_RETURN_TYPE_STRICT_LOOSE(X, Y) Y
|
Chris@16
|
120 #endif
|
Chris@16
|
121
|
Chris@16
|
122 #ifdef BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING
|
Chris@16
|
123 # define BOOST_PROTO_EXTENDED_TEMPLATE_PARAMETERS_MATCHING
|
Chris@16
|
124 #endif
|
Chris@16
|
125
|
Chris@101
|
126 #if defined(_MSC_VER)
|
Chris@16
|
127 # define BOOST_PROTO_DISABLE_MSVC_C4522 __pragma(warning(disable : 4522)) // 'class' : multiple assignment operators specified
|
Chris@16
|
128 # define BOOST_PROTO_DISABLE_MSVC_C4714 __pragma(warning(disable : 4714)) // function 'xxx' marked as __forceinline not inlined
|
Chris@16
|
129 #else
|
Chris@16
|
130 # define BOOST_PROTO_DISABLE_MSVC_C4522
|
Chris@16
|
131 # define BOOST_PROTO_DISABLE_MSVC_C4714
|
Chris@16
|
132 #endif
|
Chris@16
|
133
|
Chris@16
|
134 namespace boost { namespace proto
|
Chris@16
|
135 {
|
Chris@16
|
136 namespace detail
|
Chris@16
|
137 {
|
Chris@16
|
138 typedef char yes_type;
|
Chris@16
|
139 typedef char (&no_type)[2];
|
Chris@16
|
140
|
Chris@16
|
141 template<int N>
|
Chris@16
|
142 struct sized_type
|
Chris@16
|
143 {
|
Chris@16
|
144 typedef char (&type)[N];
|
Chris@16
|
145 };
|
Chris@16
|
146
|
Chris@16
|
147 struct dont_care;
|
Chris@16
|
148 struct undefined; // leave this undefined
|
Chris@16
|
149 struct not_a_valid_type;
|
Chris@16
|
150
|
Chris@16
|
151 struct private_type_
|
Chris@16
|
152 {
|
Chris@16
|
153 private_type_ operator ,(int) const;
|
Chris@16
|
154 };
|
Chris@16
|
155
|
Chris@16
|
156 template<typename T>
|
Chris@16
|
157 struct uncvref
|
Chris@16
|
158 {
|
Chris@16
|
159 typedef T type;
|
Chris@16
|
160 };
|
Chris@16
|
161
|
Chris@16
|
162 template<typename T>
|
Chris@16
|
163 struct uncvref<T const>
|
Chris@16
|
164 {
|
Chris@16
|
165 typedef T type;
|
Chris@16
|
166 };
|
Chris@16
|
167
|
Chris@16
|
168 template<typename T>
|
Chris@16
|
169 struct uncvref<T &>
|
Chris@16
|
170 {
|
Chris@16
|
171 typedef T type;
|
Chris@16
|
172 };
|
Chris@16
|
173
|
Chris@16
|
174 template<typename T>
|
Chris@16
|
175 struct uncvref<T const &>
|
Chris@16
|
176 {
|
Chris@16
|
177 typedef T type;
|
Chris@16
|
178 };
|
Chris@16
|
179
|
Chris@16
|
180 template<typename T, std::size_t N>
|
Chris@16
|
181 struct uncvref<T const[N]>
|
Chris@16
|
182 {
|
Chris@16
|
183 typedef T type[N];
|
Chris@16
|
184 };
|
Chris@16
|
185
|
Chris@16
|
186 template<typename T, std::size_t N>
|
Chris@16
|
187 struct uncvref<T (&)[N]>
|
Chris@16
|
188 {
|
Chris@16
|
189 typedef T type[N];
|
Chris@16
|
190 };
|
Chris@16
|
191
|
Chris@16
|
192 template<typename T, std::size_t N>
|
Chris@16
|
193 struct uncvref<T const (&)[N]>
|
Chris@16
|
194 {
|
Chris@16
|
195 typedef T type[N];
|
Chris@16
|
196 };
|
Chris@16
|
197
|
Chris@16
|
198 struct ignore
|
Chris@16
|
199 {
|
Chris@16
|
200 ignore()
|
Chris@16
|
201 {}
|
Chris@16
|
202
|
Chris@16
|
203 template<typename T>
|
Chris@16
|
204 ignore(T const &)
|
Chris@16
|
205 {}
|
Chris@16
|
206 };
|
Chris@16
|
207
|
Chris@16
|
208 /// INTERNAL ONLY
|
Chris@16
|
209 ///
|
Chris@16
|
210 #define BOOST_PROTO_UNCVREF(X) \
|
Chris@16
|
211 typename boost::proto::detail::uncvref<X>::type \
|
Chris@16
|
212 /**/
|
Chris@16
|
213
|
Chris@16
|
214 struct _default;
|
Chris@16
|
215
|
Chris@16
|
216 struct not_a_domain;
|
Chris@16
|
217 struct not_a_grammar;
|
Chris@16
|
218 struct not_a_generator;
|
Chris@16
|
219
|
Chris@16
|
220 template<typename T, typename Void = void>
|
Chris@16
|
221 struct is_transform_;
|
Chris@16
|
222
|
Chris@16
|
223 template<typename T, typename Void = void>
|
Chris@16
|
224 struct is_aggregate_;
|
Chris@16
|
225
|
Chris@16
|
226 template<typename Expr>
|
Chris@16
|
227 struct flat_view;
|
Chris@16
|
228 }
|
Chris@16
|
229
|
Chris@16
|
230 typedef detail::ignore const ignore;
|
Chris@16
|
231
|
Chris@16
|
232 namespace argsns_
|
Chris@16
|
233 {
|
Chris@16
|
234 template<typename Arg0>
|
Chris@16
|
235 struct term;
|
Chris@16
|
236
|
Chris@16
|
237 #define M0(Z, N, DATA) \
|
Chris@16
|
238 template<BOOST_PP_ENUM_PARAMS_Z(Z, N, typename Arg)> struct BOOST_PP_CAT(list, N); \
|
Chris@16
|
239 /**/
|
Chris@16
|
240 BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), M0, ~)
|
Chris@16
|
241 #undef M0
|
Chris@16
|
242 }
|
Chris@16
|
243
|
Chris@16
|
244 using namespace argsns_;
|
Chris@16
|
245
|
Chris@16
|
246 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
247 // Operator tags
|
Chris@16
|
248 namespace tagns_
|
Chris@16
|
249 {
|
Chris@16
|
250 namespace tag
|
Chris@16
|
251 {
|
Chris@16
|
252 struct terminal;
|
Chris@16
|
253 struct unary_plus;
|
Chris@16
|
254 struct negate;
|
Chris@16
|
255 struct dereference;
|
Chris@16
|
256 struct complement;
|
Chris@16
|
257 struct address_of;
|
Chris@16
|
258 struct logical_not;
|
Chris@16
|
259 struct pre_inc;
|
Chris@16
|
260 struct pre_dec;
|
Chris@16
|
261 struct post_inc;
|
Chris@16
|
262 struct post_dec;
|
Chris@16
|
263
|
Chris@16
|
264 struct shift_left;
|
Chris@16
|
265 struct shift_right;
|
Chris@16
|
266 struct multiplies;
|
Chris@16
|
267 struct divides;
|
Chris@16
|
268 struct modulus;
|
Chris@16
|
269 struct plus;
|
Chris@16
|
270 struct minus;
|
Chris@16
|
271 struct less;
|
Chris@16
|
272 struct greater;
|
Chris@16
|
273 struct less_equal;
|
Chris@16
|
274 struct greater_equal;
|
Chris@16
|
275 struct equal_to;
|
Chris@16
|
276 struct not_equal_to;
|
Chris@16
|
277 struct logical_or;
|
Chris@16
|
278 struct logical_and;
|
Chris@16
|
279 struct bitwise_and;
|
Chris@16
|
280 struct bitwise_or;
|
Chris@16
|
281 struct bitwise_xor;
|
Chris@16
|
282 struct comma;
|
Chris@16
|
283 struct mem_ptr;
|
Chris@16
|
284
|
Chris@16
|
285 struct assign;
|
Chris@16
|
286 struct shift_left_assign;
|
Chris@16
|
287 struct shift_right_assign;
|
Chris@16
|
288 struct multiplies_assign;
|
Chris@16
|
289 struct divides_assign;
|
Chris@16
|
290 struct modulus_assign;
|
Chris@16
|
291 struct plus_assign;
|
Chris@16
|
292 struct minus_assign;
|
Chris@16
|
293 struct bitwise_and_assign;
|
Chris@16
|
294 struct bitwise_or_assign;
|
Chris@16
|
295 struct bitwise_xor_assign;
|
Chris@16
|
296 struct subscript;
|
Chris@16
|
297 struct member;
|
Chris@16
|
298 struct if_else_;
|
Chris@16
|
299 struct function;
|
Chris@16
|
300
|
Chris@16
|
301 // Fusion tags
|
Chris@16
|
302 template<typename Tag, typename Domain> struct proto_expr;
|
Chris@16
|
303 template<typename Tag, typename Domain> struct proto_expr_iterator;
|
Chris@16
|
304 template<typename Tag, typename Domain> struct proto_flat_view;
|
Chris@16
|
305 }
|
Chris@16
|
306 }
|
Chris@16
|
307
|
Chris@16
|
308 using namespace tagns_;
|
Chris@16
|
309
|
Chris@16
|
310 template<typename Expr>
|
Chris@16
|
311 struct tag_of;
|
Chris@16
|
312
|
Chris@16
|
313 ////////////////////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
314 struct _;
|
Chris@16
|
315
|
Chris@16
|
316 ////////////////////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
317 struct default_generator;
|
Chris@16
|
318
|
Chris@16
|
319 struct basic_default_generator;
|
Chris@16
|
320
|
Chris@16
|
321 template<template<typename> class Extends>
|
Chris@16
|
322 struct generator;
|
Chris@16
|
323
|
Chris@16
|
324 template<template<typename> class Extends>
|
Chris@16
|
325 struct pod_generator;
|
Chris@16
|
326
|
Chris@16
|
327 struct by_value_generator;
|
Chris@16
|
328
|
Chris@16
|
329 template<typename First, typename Second>
|
Chris@16
|
330 struct compose_generators;
|
Chris@16
|
331
|
Chris@16
|
332 template<typename Generator, typename Void = void>
|
Chris@16
|
333 struct wants_basic_expr;
|
Chris@16
|
334
|
Chris@16
|
335 template<typename Generator>
|
Chris@16
|
336 struct use_basic_expr;
|
Chris@16
|
337
|
Chris@16
|
338 ////////////////////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
339 namespace domainns_
|
Chris@16
|
340 {
|
Chris@16
|
341 typedef detail::not_a_domain no_super_domain;
|
Chris@16
|
342
|
Chris@16
|
343 template<
|
Chris@16
|
344 typename Generator = default_generator
|
Chris@16
|
345 , typename Grammar = proto::_
|
Chris@16
|
346 , typename Super = no_super_domain
|
Chris@16
|
347 >
|
Chris@16
|
348 struct domain;
|
Chris@16
|
349
|
Chris@16
|
350 struct default_domain;
|
Chris@16
|
351
|
Chris@16
|
352 struct basic_default_domain;
|
Chris@16
|
353
|
Chris@16
|
354 struct deduce_domain;
|
Chris@16
|
355
|
Chris@16
|
356 template<typename Domain, typename Tag, typename Args, bool WantsBasicExpr = wants_basic_expr<typename Domain::proto_generator>::value>
|
Chris@16
|
357 struct base_expr;
|
Chris@16
|
358 }
|
Chris@16
|
359
|
Chris@16
|
360 using namespace domainns_;
|
Chris@16
|
361
|
Chris@16
|
362 ////////////////////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
363 namespace exprns_
|
Chris@16
|
364 {
|
Chris@16
|
365 template<typename Tag, typename Args, long Arity = Args::arity>
|
Chris@16
|
366 struct basic_expr;
|
Chris@16
|
367
|
Chris@16
|
368 template<typename Tag, typename Args, long Arity = Args::arity>
|
Chris@16
|
369 struct expr;
|
Chris@16
|
370
|
Chris@16
|
371 template<
|
Chris@16
|
372 typename Expr
|
Chris@16
|
373 , typename Derived
|
Chris@16
|
374 , typename Domain = default_domain
|
Chris@16
|
375 , long Arity = Expr::proto_arity_c
|
Chris@16
|
376 >
|
Chris@16
|
377 struct extends;
|
Chris@16
|
378
|
Chris@16
|
379 template<typename This, typename Fun, typename Domain>
|
Chris@16
|
380 struct virtual_member;
|
Chris@16
|
381
|
Chris@16
|
382 struct is_proto_expr;
|
Chris@16
|
383 }
|
Chris@16
|
384 ////////////////////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
385
|
Chris@16
|
386 using exprns_::expr;
|
Chris@16
|
387 using exprns_::basic_expr;
|
Chris@16
|
388 using exprns_::extends;
|
Chris@16
|
389 using exprns_::is_proto_expr;
|
Chris@16
|
390
|
Chris@16
|
391 template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)>
|
Chris@16
|
392 struct or_;
|
Chris@16
|
393
|
Chris@16
|
394 template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)>
|
Chris@16
|
395 struct and_;
|
Chris@16
|
396
|
Chris@16
|
397 template<typename Grammar>
|
Chris@16
|
398 struct not_;
|
Chris@16
|
399
|
Chris@16
|
400 template<typename Condition, typename Then = _, typename Else = not_<_> >
|
Chris@16
|
401 struct if_;
|
Chris@16
|
402
|
Chris@16
|
403 template<typename Cases, typename Transform = tag_of<_>()>
|
Chris@16
|
404 struct switch_;
|
Chris@16
|
405
|
Chris@16
|
406 template<typename T>
|
Chris@16
|
407 struct exact;
|
Chris@16
|
408
|
Chris@16
|
409 template<typename T>
|
Chris@16
|
410 struct convertible_to;
|
Chris@16
|
411
|
Chris@16
|
412 template<typename Grammar>
|
Chris@16
|
413 struct vararg;
|
Chris@16
|
414
|
Chris@16
|
415 struct pack;
|
Chris@16
|
416
|
Chris@16
|
417 // Boost bug https://svn.boost.org/trac/boost/ticket/4602
|
Chris@16
|
418 //int const N = INT_MAX;
|
Chris@16
|
419 int const N = (INT_MAX >> 10);
|
Chris@16
|
420
|
Chris@16
|
421 namespace context
|
Chris@16
|
422 {
|
Chris@16
|
423 struct null_context;
|
Chris@16
|
424
|
Chris@16
|
425 template<typename Expr, typename Context, long Arity = Expr::proto_arity_c>
|
Chris@16
|
426 struct null_eval;
|
Chris@16
|
427
|
Chris@16
|
428 struct default_context;
|
Chris@16
|
429
|
Chris@16
|
430 template<typename Expr, typename Context, typename Tag = typename Expr::proto_tag, long Arity = Expr::proto_arity_c>
|
Chris@16
|
431 struct default_eval;
|
Chris@16
|
432
|
Chris@16
|
433 template<typename Derived, typename DefaultCtx = default_context>
|
Chris@16
|
434 struct callable_context;
|
Chris@16
|
435
|
Chris@16
|
436 template<typename Expr, typename Context, long Arity = Expr::proto_arity_c>
|
Chris@16
|
437 struct callable_eval;
|
Chris@16
|
438 }
|
Chris@16
|
439
|
Chris@16
|
440 using context::null_context;
|
Chris@16
|
441 using context::null_eval;
|
Chris@16
|
442 using context::default_context;
|
Chris@16
|
443 using context::default_eval;
|
Chris@16
|
444 using context::callable_context;
|
Chris@16
|
445 using context::callable_eval;
|
Chris@16
|
446
|
Chris@16
|
447 namespace utility
|
Chris@16
|
448 {
|
Chris@16
|
449 template<typename T, typename Domain = default_domain>
|
Chris@16
|
450 struct literal;
|
Chris@16
|
451 }
|
Chris@16
|
452
|
Chris@16
|
453 using utility::literal;
|
Chris@16
|
454
|
Chris@16
|
455 namespace result_of
|
Chris@16
|
456 {
|
Chris@16
|
457 template<typename T, typename Domain = default_domain>
|
Chris@16
|
458 struct as_expr;
|
Chris@16
|
459
|
Chris@16
|
460 template<typename T, typename Domain = default_domain>
|
Chris@16
|
461 struct as_child;
|
Chris@16
|
462
|
Chris@16
|
463 template<typename Expr, typename N = mpl::long_<0> >
|
Chris@16
|
464 struct child;
|
Chris@16
|
465
|
Chris@16
|
466 template<typename Expr, long N>
|
Chris@16
|
467 struct child_c;
|
Chris@16
|
468
|
Chris@16
|
469 template<typename Expr>
|
Chris@16
|
470 struct left;
|
Chris@16
|
471
|
Chris@16
|
472 template<typename Expr>
|
Chris@16
|
473 struct right;
|
Chris@16
|
474
|
Chris@16
|
475 template<typename Expr>
|
Chris@16
|
476 struct deep_copy;
|
Chris@16
|
477
|
Chris@16
|
478 template<typename Expr, typename Context>
|
Chris@16
|
479 struct eval;
|
Chris@16
|
480
|
Chris@16
|
481 template<
|
Chris@16
|
482 typename Tag
|
Chris@16
|
483 , typename DomainOrA0
|
Chris@16
|
484 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(
|
Chris@16
|
485 BOOST_PROTO_MAX_ARITY
|
Chris@16
|
486 , typename A
|
Chris@16
|
487 , = void BOOST_PP_INTERCEPT
|
Chris@16
|
488 )
|
Chris@16
|
489 , typename Void = void
|
Chris@16
|
490 >
|
Chris@16
|
491 struct make_expr;
|
Chris@16
|
492
|
Chris@16
|
493 template<typename Tag, typename DomainOrSequence, typename SequenceOrVoid = void, typename Void = void>
|
Chris@16
|
494 struct unpack_expr;
|
Chris@16
|
495
|
Chris@16
|
496 template<typename T>
|
Chris@16
|
497 struct as_env;
|
Chris@16
|
498
|
Chris@16
|
499 template<typename Env, typename Tag>
|
Chris@16
|
500 struct has_env_var;
|
Chris@16
|
501
|
Chris@16
|
502 template<typename Env, typename Tag>
|
Chris@16
|
503 struct env_var;
|
Chris@16
|
504 }
|
Chris@16
|
505
|
Chris@16
|
506 template<typename T, typename Void = void>
|
Chris@16
|
507 struct is_expr;
|
Chris@16
|
508
|
Chris@16
|
509 template<typename T, typename Void = void>
|
Chris@16
|
510 struct is_domain;
|
Chris@16
|
511
|
Chris@16
|
512 template<typename SubDomain, typename SuperDomain>
|
Chris@16
|
513 struct is_sub_domain_of;
|
Chris@16
|
514
|
Chris@16
|
515 template<typename T, typename Void = void>
|
Chris@16
|
516 struct is_env;
|
Chris@16
|
517
|
Chris@16
|
518 template<typename Expr>
|
Chris@16
|
519 struct arity_of;
|
Chris@16
|
520
|
Chris@16
|
521 template<typename T, typename Void = void>
|
Chris@16
|
522 struct domain_of;
|
Chris@16
|
523
|
Chris@16
|
524 template<typename Expr, typename Grammar>
|
Chris@16
|
525 struct matches;
|
Chris@16
|
526
|
Chris@16
|
527 // Generic expression metafunctions and
|
Chris@16
|
528 // grammar elements
|
Chris@16
|
529 template<typename Tag, typename Arg>
|
Chris@16
|
530 struct unary_expr;
|
Chris@16
|
531
|
Chris@16
|
532 template<typename Tag, typename Left, typename Right>
|
Chris@16
|
533 struct binary_expr;
|
Chris@16
|
534
|
Chris@16
|
535 template<typename Tag, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)>
|
Chris@16
|
536 struct nary_expr;
|
Chris@16
|
537
|
Chris@16
|
538 // Specific expression metafunctions and
|
Chris@16
|
539 // grammar elements, for convenience
|
Chris@16
|
540 template<typename T> struct terminal;
|
Chris@16
|
541 template<typename T> struct unary_plus;
|
Chris@16
|
542 template<typename T> struct negate;
|
Chris@16
|
543 template<typename T> struct dereference;
|
Chris@16
|
544 template<typename T> struct complement;
|
Chris@16
|
545 template<typename T> struct address_of;
|
Chris@16
|
546 template<typename T> struct logical_not;
|
Chris@16
|
547 template<typename T> struct pre_inc;
|
Chris@16
|
548 template<typename T> struct pre_dec;
|
Chris@16
|
549 template<typename T> struct post_inc;
|
Chris@16
|
550 template<typename T> struct post_dec;
|
Chris@16
|
551
|
Chris@16
|
552 template<typename T, typename U> struct shift_left;
|
Chris@16
|
553 template<typename T, typename U> struct shift_right;
|
Chris@16
|
554 template<typename T, typename U> struct multiplies;
|
Chris@16
|
555 template<typename T, typename U> struct divides;
|
Chris@16
|
556 template<typename T, typename U> struct modulus;
|
Chris@16
|
557 template<typename T, typename U> struct plus;
|
Chris@16
|
558 template<typename T, typename U> struct minus;
|
Chris@16
|
559 template<typename T, typename U> struct less;
|
Chris@16
|
560 template<typename T, typename U> struct greater;
|
Chris@16
|
561 template<typename T, typename U> struct less_equal;
|
Chris@16
|
562 template<typename T, typename U> struct greater_equal;
|
Chris@16
|
563 template<typename T, typename U> struct equal_to;
|
Chris@16
|
564 template<typename T, typename U> struct not_equal_to;
|
Chris@16
|
565 template<typename T, typename U> struct logical_or;
|
Chris@16
|
566 template<typename T, typename U> struct logical_and;
|
Chris@16
|
567 template<typename T, typename U> struct bitwise_and;
|
Chris@16
|
568 template<typename T, typename U> struct bitwise_or;
|
Chris@16
|
569 template<typename T, typename U> struct bitwise_xor;
|
Chris@16
|
570 template<typename T, typename U> struct comma;
|
Chris@16
|
571 template<typename T, typename U> struct mem_ptr;
|
Chris@16
|
572
|
Chris@16
|
573 template<typename T, typename U> struct assign;
|
Chris@16
|
574 template<typename T, typename U> struct shift_left_assign;
|
Chris@16
|
575 template<typename T, typename U> struct shift_right_assign;
|
Chris@16
|
576 template<typename T, typename U> struct multiplies_assign;
|
Chris@16
|
577 template<typename T, typename U> struct divides_assign;
|
Chris@16
|
578 template<typename T, typename U> struct modulus_assign;
|
Chris@16
|
579 template<typename T, typename U> struct plus_assign;
|
Chris@16
|
580 template<typename T, typename U> struct minus_assign;
|
Chris@16
|
581 template<typename T, typename U> struct bitwise_and_assign;
|
Chris@16
|
582 template<typename T, typename U> struct bitwise_or_assign;
|
Chris@16
|
583 template<typename T, typename U> struct bitwise_xor_assign;
|
Chris@16
|
584 template<typename T, typename U> struct subscript;
|
Chris@16
|
585 template<typename T, typename U> struct member;
|
Chris@16
|
586 template<typename T, typename U, typename V> struct if_else_;
|
Chris@16
|
587
|
Chris@16
|
588 template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_ARITY, typename A, void)>
|
Chris@16
|
589 struct function;
|
Chris@16
|
590
|
Chris@16
|
591 namespace functional
|
Chris@16
|
592 {
|
Chris@16
|
593 struct left;
|
Chris@16
|
594 struct right;
|
Chris@16
|
595 struct eval;
|
Chris@16
|
596 struct deep_copy;
|
Chris@16
|
597
|
Chris@16
|
598 template<typename Domain = default_domain>
|
Chris@16
|
599 struct as_expr;
|
Chris@16
|
600
|
Chris@16
|
601 template<typename Domain = default_domain>
|
Chris@16
|
602 struct as_child;
|
Chris@16
|
603
|
Chris@16
|
604 template<typename N = mpl::long_<0> >
|
Chris@16
|
605 struct child;
|
Chris@16
|
606
|
Chris@16
|
607 template<long N>
|
Chris@16
|
608 struct child_c;
|
Chris@16
|
609
|
Chris@16
|
610 struct as_env;
|
Chris@16
|
611
|
Chris@16
|
612 template<typename Tag>
|
Chris@16
|
613 struct has_env_var;
|
Chris@16
|
614
|
Chris@16
|
615 template<typename Tag>
|
Chris@16
|
616 struct env_var;
|
Chris@16
|
617
|
Chris@16
|
618 template<typename Tag, typename Domain = deduce_domain>
|
Chris@16
|
619 struct make_expr;
|
Chris@16
|
620
|
Chris@16
|
621 template<typename Tag, typename Domain = deduce_domain>
|
Chris@16
|
622 struct unpack_expr;
|
Chris@16
|
623
|
Chris@16
|
624 typedef make_expr<tag::terminal> make_terminal;
|
Chris@16
|
625 typedef make_expr<tag::unary_plus> make_unary_plus;
|
Chris@16
|
626 typedef make_expr<tag::negate> make_negate;
|
Chris@16
|
627 typedef make_expr<tag::dereference> make_dereference;
|
Chris@16
|
628 typedef make_expr<tag::complement> make_complement;
|
Chris@16
|
629 typedef make_expr<tag::address_of> make_address_of;
|
Chris@16
|
630 typedef make_expr<tag::logical_not> make_logical_not;
|
Chris@16
|
631 typedef make_expr<tag::pre_inc> make_pre_inc;
|
Chris@16
|
632 typedef make_expr<tag::pre_dec> make_pre_dec;
|
Chris@16
|
633 typedef make_expr<tag::post_inc> make_post_inc;
|
Chris@16
|
634 typedef make_expr<tag::post_dec> make_post_dec;
|
Chris@16
|
635 typedef make_expr<tag::shift_left> make_shift_left;
|
Chris@16
|
636 typedef make_expr<tag::shift_right> make_shift_right;
|
Chris@16
|
637 typedef make_expr<tag::multiplies> make_multiplies;
|
Chris@16
|
638 typedef make_expr<tag::divides> make_divides;
|
Chris@16
|
639 typedef make_expr<tag::modulus> make_modulus;
|
Chris@16
|
640 typedef make_expr<tag::plus> make_plus;
|
Chris@16
|
641 typedef make_expr<tag::minus> make_minus;
|
Chris@16
|
642 typedef make_expr<tag::less> make_less;
|
Chris@16
|
643 typedef make_expr<tag::greater> make_greater;
|
Chris@16
|
644 typedef make_expr<tag::less_equal> make_less_equal;
|
Chris@16
|
645 typedef make_expr<tag::greater_equal> make_greater_equal;
|
Chris@16
|
646 typedef make_expr<tag::equal_to> make_equal_to;
|
Chris@16
|
647 typedef make_expr<tag::not_equal_to> make_not_equal_to;
|
Chris@16
|
648 typedef make_expr<tag::logical_or> make_logical_or;
|
Chris@16
|
649 typedef make_expr<tag::logical_and> make_logical_and;
|
Chris@16
|
650 typedef make_expr<tag::bitwise_and> make_bitwise_and;
|
Chris@16
|
651 typedef make_expr<tag::bitwise_or> make_bitwise_or;
|
Chris@16
|
652 typedef make_expr<tag::bitwise_xor> make_bitwise_xor;
|
Chris@16
|
653 typedef make_expr<tag::comma> make_comma;
|
Chris@16
|
654 typedef make_expr<tag::mem_ptr> make_mem_ptr;
|
Chris@16
|
655 typedef make_expr<tag::assign> make_assign;
|
Chris@16
|
656 typedef make_expr<tag::shift_left_assign> make_shift_left_assign;
|
Chris@16
|
657 typedef make_expr<tag::shift_right_assign> make_shift_right_assign;
|
Chris@16
|
658 typedef make_expr<tag::multiplies_assign> make_multiplies_assign;
|
Chris@16
|
659 typedef make_expr<tag::divides_assign> make_divides_assign;
|
Chris@16
|
660 typedef make_expr<tag::modulus_assign> make_modulus_assign;
|
Chris@16
|
661 typedef make_expr<tag::plus_assign> make_plus_assign;
|
Chris@16
|
662 typedef make_expr<tag::minus_assign> make_minus_assign;
|
Chris@16
|
663 typedef make_expr<tag::bitwise_and_assign> make_bitwise_and_assign;
|
Chris@16
|
664 typedef make_expr<tag::bitwise_or_assign> make_bitwise_or_assign;
|
Chris@16
|
665 typedef make_expr<tag::bitwise_xor_assign> make_bitwise_xor_assign;
|
Chris@16
|
666 typedef make_expr<tag::subscript> make_subscript;
|
Chris@16
|
667 typedef make_expr<tag::if_else_> make_if_else;
|
Chris@16
|
668 typedef make_expr<tag::function> make_function;
|
Chris@16
|
669
|
Chris@16
|
670 struct flatten;
|
Chris@16
|
671 struct make_pair;
|
Chris@16
|
672 struct first;
|
Chris@16
|
673 struct second;
|
Chris@16
|
674 struct at;
|
Chris@16
|
675 struct pop_front;
|
Chris@16
|
676 struct push_front;
|
Chris@16
|
677 struct pop_back;
|
Chris@16
|
678 struct push_back;
|
Chris@16
|
679 struct reverse;
|
Chris@16
|
680 }
|
Chris@16
|
681
|
Chris@16
|
682 typedef functional::flatten _flatten;
|
Chris@16
|
683 typedef functional::make_pair _make_pair;
|
Chris@16
|
684 typedef functional::first _first;
|
Chris@16
|
685 typedef functional::second _second;
|
Chris@16
|
686 typedef functional::pop_front _at;
|
Chris@16
|
687 typedef functional::pop_front _pop_front;
|
Chris@16
|
688 typedef functional::push_front _push_front;
|
Chris@16
|
689 typedef functional::pop_back _pop_back;
|
Chris@16
|
690 typedef functional::push_back _push_back;
|
Chris@16
|
691 typedef functional::reverse _reverse;
|
Chris@16
|
692 typedef functional::eval _eval;
|
Chris@16
|
693 struct _deep_copy;
|
Chris@16
|
694
|
Chris@16
|
695 typedef functional::make_expr<tag::terminal> _make_terminal;
|
Chris@16
|
696 typedef functional::make_expr<tag::unary_plus> _make_unary_plus;
|
Chris@16
|
697 typedef functional::make_expr<tag::negate> _make_negate;
|
Chris@16
|
698 typedef functional::make_expr<tag::dereference> _make_dereference;
|
Chris@16
|
699 typedef functional::make_expr<tag::complement> _make_complement;
|
Chris@16
|
700 typedef functional::make_expr<tag::address_of> _make_address_of;
|
Chris@16
|
701 typedef functional::make_expr<tag::logical_not> _make_logical_not;
|
Chris@16
|
702 typedef functional::make_expr<tag::pre_inc> _make_pre_inc;
|
Chris@16
|
703 typedef functional::make_expr<tag::pre_dec> _make_pre_dec;
|
Chris@16
|
704 typedef functional::make_expr<tag::post_inc> _make_post_inc;
|
Chris@16
|
705 typedef functional::make_expr<tag::post_dec> _make_post_dec;
|
Chris@16
|
706 typedef functional::make_expr<tag::shift_left> _make_shift_left;
|
Chris@16
|
707 typedef functional::make_expr<tag::shift_right> _make_shift_right;
|
Chris@16
|
708 typedef functional::make_expr<tag::multiplies> _make_multiplies;
|
Chris@16
|
709 typedef functional::make_expr<tag::divides> _make_divides;
|
Chris@16
|
710 typedef functional::make_expr<tag::modulus> _make_modulus;
|
Chris@16
|
711 typedef functional::make_expr<tag::plus> _make_plus;
|
Chris@16
|
712 typedef functional::make_expr<tag::minus> _make_minus;
|
Chris@16
|
713 typedef functional::make_expr<tag::less> _make_less;
|
Chris@16
|
714 typedef functional::make_expr<tag::greater> _make_greater;
|
Chris@16
|
715 typedef functional::make_expr<tag::less_equal> _make_less_equal;
|
Chris@16
|
716 typedef functional::make_expr<tag::greater_equal> _make_greater_equal;
|
Chris@16
|
717 typedef functional::make_expr<tag::equal_to> _make_equal_to;
|
Chris@16
|
718 typedef functional::make_expr<tag::not_equal_to> _make_not_equal_to;
|
Chris@16
|
719 typedef functional::make_expr<tag::logical_or> _make_logical_or;
|
Chris@16
|
720 typedef functional::make_expr<tag::logical_and> _make_logical_and;
|
Chris@16
|
721 typedef functional::make_expr<tag::bitwise_and> _make_bitwise_and;
|
Chris@16
|
722 typedef functional::make_expr<tag::bitwise_or> _make_bitwise_or;
|
Chris@16
|
723 typedef functional::make_expr<tag::bitwise_xor> _make_bitwise_xor;
|
Chris@16
|
724 typedef functional::make_expr<tag::comma> _make_comma;
|
Chris@16
|
725 typedef functional::make_expr<tag::mem_ptr> _make_mem_ptr;
|
Chris@16
|
726 typedef functional::make_expr<tag::assign> _make_assign;
|
Chris@16
|
727 typedef functional::make_expr<tag::shift_left_assign> _make_shift_left_assign;
|
Chris@16
|
728 typedef functional::make_expr<tag::shift_right_assign> _make_shift_right_assign;
|
Chris@16
|
729 typedef functional::make_expr<tag::multiplies_assign> _make_multiplies_assign;
|
Chris@16
|
730 typedef functional::make_expr<tag::divides_assign> _make_divides_assign;
|
Chris@16
|
731 typedef functional::make_expr<tag::modulus_assign> _make_modulus_assign;
|
Chris@16
|
732 typedef functional::make_expr<tag::plus_assign> _make_plus_assign;
|
Chris@16
|
733 typedef functional::make_expr<tag::minus_assign> _make_minus_assign;
|
Chris@16
|
734 typedef functional::make_expr<tag::bitwise_and_assign> _make_bitwise_and_assign;
|
Chris@16
|
735 typedef functional::make_expr<tag::bitwise_or_assign> _make_bitwise_or_assign;
|
Chris@16
|
736 typedef functional::make_expr<tag::bitwise_xor_assign> _make_bitwise_xor_assign;
|
Chris@16
|
737 typedef functional::make_expr<tag::subscript> _make_subscript;
|
Chris@16
|
738 typedef functional::make_expr<tag::if_else_> _make_if_else;
|
Chris@16
|
739 typedef functional::make_expr<tag::function> _make_function;
|
Chris@16
|
740
|
Chris@16
|
741 template<typename T>
|
Chris@16
|
742 struct is_callable;
|
Chris@16
|
743
|
Chris@16
|
744 template<typename T>
|
Chris@16
|
745 struct is_transform;
|
Chris@16
|
746
|
Chris@16
|
747 template<typename T>
|
Chris@16
|
748 struct is_aggregate;
|
Chris@16
|
749
|
Chris@16
|
750 #define BOOST_PROTO_UNEXPR() typedef int proto_is_expr_;
|
Chris@16
|
751 #define BOOST_PROTO_CALLABLE() typedef void proto_is_callable_;
|
Chris@16
|
752 #define BOOST_PROTO_AGGREGATE() typedef void proto_is_aggregate_;
|
Chris@16
|
753 #define BOOST_PROTO_USE_BASIC_EXPR() typedef void proto_use_basic_expr_;
|
Chris@16
|
754
|
Chris@16
|
755 struct callable
|
Chris@16
|
756 {
|
Chris@16
|
757 BOOST_PROTO_CALLABLE()
|
Chris@16
|
758 };
|
Chris@16
|
759
|
Chris@16
|
760 namespace envns_
|
Chris@16
|
761 {
|
Chris@16
|
762 struct key_not_found;
|
Chris@16
|
763
|
Chris@16
|
764 struct empty_env;
|
Chris@16
|
765
|
Chris@16
|
766 typedef int empty_state;
|
Chris@16
|
767
|
Chris@16
|
768 template<typename Tag, typename Value, typename Base = empty_env>
|
Chris@16
|
769 struct env;
|
Chris@16
|
770
|
Chris@16
|
771 struct data_type;
|
Chris@16
|
772
|
Chris@16
|
773 struct transforms_type;
|
Chris@16
|
774 }
|
Chris@16
|
775
|
Chris@16
|
776 using envns_::key_not_found;
|
Chris@16
|
777 using envns_::empty_env;
|
Chris@16
|
778 using envns_::empty_state;
|
Chris@16
|
779 using envns_::env;
|
Chris@16
|
780 using envns_::data_type;
|
Chris@16
|
781 using envns_::transforms_type;
|
Chris@16
|
782
|
Chris@16
|
783 struct external_transform;
|
Chris@16
|
784
|
Chris@16
|
785 template<typename PrimitiveTransform = void, typename X = void>
|
Chris@16
|
786 struct transform;
|
Chris@16
|
787
|
Chris@16
|
788 template<typename Grammar, typename Fun = Grammar>
|
Chris@16
|
789 struct when;
|
Chris@16
|
790
|
Chris@16
|
791 template<typename Fun>
|
Chris@16
|
792 struct otherwise;
|
Chris@16
|
793
|
Chris@16
|
794 template<typename Fun>
|
Chris@16
|
795 struct call;
|
Chris@16
|
796
|
Chris@16
|
797 template<typename Fun>
|
Chris@16
|
798 struct make;
|
Chris@16
|
799
|
Chris@16
|
800 template<typename PrimitiveTransform>
|
Chris@16
|
801 struct protect;
|
Chris@16
|
802
|
Chris@16
|
803 template<typename T>
|
Chris@16
|
804 struct noinvoke;
|
Chris@16
|
805
|
Chris@16
|
806 template<typename Fun>
|
Chris@16
|
807 struct lazy;
|
Chris@16
|
808
|
Chris@16
|
809 template<typename Sequence, typename State, typename Fun>
|
Chris@16
|
810 struct fold;
|
Chris@16
|
811
|
Chris@16
|
812 template<typename Sequence, typename State, typename Fun>
|
Chris@16
|
813 struct reverse_fold;
|
Chris@16
|
814
|
Chris@16
|
815 // Q: can we replace fold_tree with fold<flatten(_), state, fun> ?
|
Chris@16
|
816 // A: once segmented Fusion works well.
|
Chris@16
|
817 template<typename Sequence, typename State, typename Fun>
|
Chris@16
|
818 struct fold_tree;
|
Chris@16
|
819
|
Chris@16
|
820 template<typename Sequence, typename State, typename Fun>
|
Chris@16
|
821 struct reverse_fold_tree;
|
Chris@16
|
822
|
Chris@16
|
823 template<typename Grammar, typename Domain = deduce_domain>
|
Chris@16
|
824 struct pass_through;
|
Chris@16
|
825
|
Chris@16
|
826 template<typename Grammar = detail::_default>
|
Chris@16
|
827 struct _default;
|
Chris@16
|
828
|
Chris@16
|
829 struct _expr;
|
Chris@16
|
830 struct _state;
|
Chris@16
|
831 struct _data;
|
Chris@16
|
832
|
Chris@16
|
833 struct _value;
|
Chris@16
|
834
|
Chris@16
|
835 struct _void;
|
Chris@16
|
836
|
Chris@16
|
837 template<typename T, T I>
|
Chris@16
|
838 struct integral_c;
|
Chris@16
|
839
|
Chris@16
|
840 template<char I>
|
Chris@16
|
841 struct char_;
|
Chris@16
|
842
|
Chris@16
|
843 template<int I>
|
Chris@16
|
844 struct int_;
|
Chris@16
|
845
|
Chris@16
|
846 template<long I>
|
Chris@16
|
847 struct long_;
|
Chris@16
|
848
|
Chris@16
|
849 template<std::size_t I>
|
Chris@16
|
850 struct size_t;
|
Chris@16
|
851
|
Chris@16
|
852 template<int I>
|
Chris@16
|
853 struct _child_c;
|
Chris@16
|
854
|
Chris@16
|
855 typedef _child_c<0> _child0;
|
Chris@16
|
856 typedef _child_c<1> _child1;
|
Chris@16
|
857 typedef _child0 _child;
|
Chris@16
|
858 typedef _child0 _left;
|
Chris@16
|
859 typedef _child1 _right;
|
Chris@16
|
860
|
Chris@16
|
861 // _child2, _child3, _child4, ...
|
Chris@16
|
862 #define M0(Z, N, DATA) typedef _child_c<N> BOOST_PP_CAT(_child, N);
|
Chris@16
|
863 BOOST_PP_REPEAT_FROM_TO(
|
Chris@16
|
864 2
|
Chris@16
|
865 , BOOST_PP_DEC(BOOST_PROTO_MAX_ARITY)
|
Chris@16
|
866 , M0
|
Chris@16
|
867 , ~
|
Chris@16
|
868 )
|
Chris@16
|
869 #undef M0
|
Chris@16
|
870
|
Chris@16
|
871 struct _byref;
|
Chris@16
|
872 struct _byval;
|
Chris@16
|
873
|
Chris@16
|
874 template<typename Tag>
|
Chris@16
|
875 struct _env_var;
|
Chris@16
|
876
|
Chris@16
|
877 struct _env;
|
Chris@16
|
878
|
Chris@16
|
879 template<typename T>
|
Chris@16
|
880 struct is_extension;
|
Chris@16
|
881
|
Chris@16
|
882 namespace exops = exprns_;
|
Chris@16
|
883
|
Chris@16
|
884 }} // namespace boost::proto
|
Chris@16
|
885
|
Chris@16
|
886 #endif
|