annotate DEPENDENCIES/generic/include/boost/proto/proto_fwd.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
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