Coverage Report

Created: 2025-07-23 07:58

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