1<?xml version="1.0" encoding="utf-8"?> 2<!-- 3 Copyright 2012 Eric Niebler 4 5 Distributed under the Boost 6 Software License, Version 1.0. (See accompanying 7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 8 --> 9<header name="boost/proto/traits.hpp"> 10 <para> 11 Contains definitions for various expression traits and utilities like 12 <computeroutput><classname alt="boost::proto::tag_of">proto::tag_of</classname><></computeroutput> and 13 <computeroutput><classname alt="boost::proto::arity_of">proto::arity_of</classname><></computeroutput>; 14 the functions 15 <computeroutput><functionname alt="boost::proto::value">proto::value</functionname>()</computeroutput>, 16 <computeroutput><functionname alt="boost::proto::left">proto::left</functionname>()</computeroutput> and 17 <computeroutput><functionname alt="boost::proto::right">proto::right</functionname>()</computeroutput>; 18 <computeroutput><functionname alt="boost::proto::child">proto::child</functionname>()</computeroutput>, 19 <computeroutput><functionname alt="boost::proto::child_c">proto::child_c</functionname>()</computeroutput>, 20 <computeroutput><functionname alt="boost::proto::as_expr">proto::as_expr</functionname>()</computeroutput>, 21 <computeroutput><functionname alt="boost::proto::as_child">proto::as_child</functionname>()</computeroutput>, 22 and assorted helpers. 23 </para> 24 <namespace name="boost"> 25 <namespace name="proto"> 26 27 <struct name="is_callable"> 28 <template> 29 <template-type-parameter name="T"/> 30 </template> 31 <purpose>Boolean metafunction which tells whether a type is a callable 32 <conceptname>PolymorphicFunctionObject</conceptname> or not.</purpose> 33 <description> 34 <para> 35 <computeroutput>proto::is_callable<></computeroutput> is used by the 36 <computeroutput><classname alt="proto::when">proto::when<></classname></computeroutput> 37 transform to determine whether a function type <computeroutput>R(A<subscript>1</subscript>,...A<subscript>n</subscript>)</computeroutput> 38 is a <conceptname>CallableTransform</conceptname> or an <conceptname>ObjectTransform</conceptname>. 39 The former are evaluated using <computeroutput><classname>proto::call<></classname></computeroutput> 40 and the later with <computeroutput><classname>proto::make<></classname></computeroutput>. 41 If <computeroutput>proto::is_callable<R>::value</computeroutput> is <computeroutput>true</computeroutput>, 42 the function type is a <conceptname>CallableTransform</conceptname>; otherwise, it is an <conceptname>ObjectTransform</conceptname>. 43 </para> 44 <para> 45 Unless specialized for a type 46 <computeroutput>T</computeroutput>, <computeroutput>proto::is_callable<T>::value</computeroutput> 47 is computed as follows: 48 <itemizedlist> 49 <listitem> 50 <para> 51 If <computeroutput>T</computeroutput> is a template type 52 <computeroutput>X<Y<subscript>0</subscript>,...Y<subscript>n</subscript>></computeroutput>, 53 where all <computeroutput>Y<subscript>x</subscript></computeroutput> are types for 54 <computeroutput>x</computeroutput> in <computeroutput>[0,n]</computeroutput>, 55 <computeroutput>proto::is_callable<T>::value</computeroutput> is 56 <computeroutput>boost::is_same<Y<subscript>n</subscript>, <classname>proto::callable</classname>>::value</computeroutput>. 57 </para> 58 </listitem> 59 <listitem> 60 <para> 61 If <computeroutput>T</computeroutput> is derived from <computeroutput><classname>proto::callable</classname></computeroutput>, 62 <computeroutput>proto::is_callable<T>::value</computeroutput> is <computeroutput>true</computeroutput>. 63 </para> 64 </listitem> 65 <listitem> 66 <para> 67 Otherwise, <computeroutput>proto::is_callable<T>::value</computeroutput> 68 is <computeroutput>false</computeroutput>. 69 </para> 70 </listitem> 71 </itemizedlist> 72 </para> 73 </description> 74 <inherit><type>mpl::bool_<<replaceable>true-or-false</replaceable>></type></inherit> 75 </struct> 76 77 <struct name="is_transform"> 78 <template> 79 <template-type-parameter name="T"/> 80 </template> 81 <purpose>Boolean metafunction which tells whether a type is a 82 <conceptname>PrimitiveTransform</conceptname> or not.</purpose> 83 <description> 84 <para> 85 <computeroutput>proto::is_transform<></computeroutput> is used by the 86 <computeroutput><classname alt="proto::make">proto::make<></classname></computeroutput> 87 transform to determine whether a type <computeroutput>R</computeroutput> represents a 88 <conceptname>PrimitiveTransform</conceptname> to apply, or whether it merely represents itself. 89 </para> 90 <para> 91 It is also used by the 92 <computeroutput><classname alt="proto::call">proto::call<></classname></computeroutput> 93 transform to determine whether the function types <computeroutput>R()</computeroutput>, 94 <computeroutput>R(A1)</computeroutput>, and <computeroutput>R(A1, A2)</computeroutput> should 95 be passed the expression, state and data parameters (as needed). 96 </para> 97 <para> 98 Unless specialized for a type 99 <computeroutput>T</computeroutput>, <computeroutput>proto::is_transform<T>::value</computeroutput> 100 is computed as follows: 101 <itemizedlist> 102 <listitem> 103 <para> 104 If <computeroutput>T</computeroutput> is a class type that inherits directly or indirectly from 105 an instantiation of 106 <computeroutput><classname alt="proto::transform">proto::transform<></classname></computeroutput>, 107 <computeroutput>proto::is_transform<T>::value</computeroutput> is <computeroutput>true</computeroutput>. 108 </para> 109 </listitem> 110 <listitem> 111 <para> 112 Otherwise, <computeroutput>proto::is_transform<T>::value</computeroutput> 113 is <computeroutput>false</computeroutput>. 114 </para> 115 </listitem> 116 </itemizedlist> 117 </para> 118 </description> 119 <inherit><type>mpl::bool_<<replaceable>true-or-false</replaceable>></type></inherit> 120 </struct> 121 122 <struct name="is_aggregate"> 123 <template> 124 <template-type-parameter name="T"/> 125 </template> 126 <purpose>A Boolean metafunction that indicates whether a type requires aggregate initialization. </purpose> 127 <description> 128 <para> 129 <computeroutput>proto::is_aggregate<></computeroutput> is used by the 130 <computeroutput><classname>proto::make<></classname></computeroutput> transform to determine how 131 to construct an object of some type <computeroutput>T</computeroutput>, given some initialization arguments 132 <computeroutput>a<subscript>0</subscript>,...a<subscript>n</subscript></computeroutput>. 133 If <computeroutput>proto::is_aggregate<T>::value</computeroutput> is <computeroutput>true</computeroutput>, 134 then an object of type <computeroutput>T</computeroutput> will be initialized as 135 <computeroutput>T t = {a<subscript>0</subscript>,...a<subscript>n</subscript>};</computeroutput>. 136 Otherwise, it will be initialized as 137 <computeroutput>T t(a<subscript>0</subscript>,...a<subscript>n</subscript>)</computeroutput>. 138 </para> 139 <para> 140 Note: <computeroutput><classname>proto::expr<></classname></computeroutput> and 141 <computeroutput><classname>proto::basic_expr<></classname></computeroutput>are aggregates. 142 </para> 143 </description> 144 <inherit><type>mpl::bool_<<replaceable>true-or-false</replaceable>></type></inherit> 145 </struct> 146 147 <namespace name="functional"> 148 <struct name="as_expr"> 149 <template> 150 <template-type-parameter name="Domain"> 151 <default><classname>proto::default_domain</classname></default> 152 </template-type-parameter> 153 </template> 154 <purpose>A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 155 <computeroutput><functionname alt="proto::as_expr">proto::as_expr()</functionname></computeroutput> function. 156 </purpose> 157 <inherit><type><classname>proto::callable</classname></type></inherit> 158 <struct-specialization name="result"> 159 <template> 160 <template-type-parameter name="This"/> 161 <template-type-parameter name="T"/> 162 </template> 163 <specialization> 164 <template-arg>This(T)</template-arg> 165 </specialization> 166 <inherit><type><classname>proto::result_of::as_expr</classname>< typename remove_reference< T >::type, Domain ></type></inherit> 167 </struct-specialization> 168 <method-group name="public member functions"> 169 <method name="operator()" cv="const"> 170 <type>typename <classname>proto::result_of::as_expr</classname>< T, Domain >::type</type> 171 <template> 172 <template-type-parameter name="T"/> 173 </template> 174 <parameter name="t"> 175 <paramtype>T &</paramtype> 176 <description> 177 <para>The object to wrap. </para> 178 </description> 179 </parameter> 180 <description> 181 <para> 182 Wrap an object in a Proto terminal if it isn't a Proto expression already. 183 </para> 184 </description> 185 <returns> 186 <para> 187 <computeroutput><functionname>proto::as_expr</functionname><Domain>(t)</computeroutput> 188 </para> 189 </returns> 190 </method> 191 <method name="operator()" cv="const"> 192 <type>typename <classname>proto::result_of::as_expr</classname>< T const, Domain >::type</type> 193 <template> 194 <template-type-parameter name="T"/> 195 </template> 196 <parameter name="t"> 197 <paramtype>T const &</paramtype> 198 </parameter> 199 <description> 200 <para>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </para> 201 </description> 202 </method> 203 </method-group> 204 </struct> 205 206 <struct name="as_child"> 207 <template> 208 <template-type-parameter name="Domain"> 209 <default><classname>proto::default_domain</classname></default> 210 </template-type-parameter> 211 </template> 212 <purpose> 213 A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 214 <computeroutput><functionname alt="proto::as_child">proto::as_child()</functionname></computeroutput> function. 215 </purpose> 216 <inherit><type><classname>proto::callable</classname></type></inherit> 217 <struct-specialization name="result"> 218 <template> 219 <template-type-parameter name="This"/> 220 <template-type-parameter name="T"/> 221 </template> 222 <specialization> 223 <template-arg>This(T)</template-arg> 224 </specialization> 225 <inherit><type><classname>proto::result_of::as_child</classname>< typename remove_reference< T >::type, Domain ></type></inherit> 226 </struct-specialization> 227 <method-group name="public member functions"> 228 <method name="operator()" cv="const"> 229 <type>typename <classname>proto::result_of::as_child</classname>< T, Domain >::type</type> 230 <template> 231 <template-type-parameter name="T"/> 232 </template> 233 <parameter name="t"> 234 <paramtype>T &</paramtype> 235 <description> 236 <para>The object to wrap. </para> 237 </description> 238 </parameter> 239 <description> 240 <para> 241 Wrap an object in a Proto terminal if it isn't a Proto expression already. 242 </para> 243 </description> 244 <returns> 245 <para> 246 <computeroutput><functionname>proto::as_child</functionname><Domain>(t)</computeroutput> 247 </para> 248 </returns> 249 </method> 250 <method name="operator()" cv="const"> 251 <type>typename <classname>proto::result_of::as_child</classname>< T const, Domain >::type</type> 252 <template> 253 <template-type-parameter name="T"/> 254 </template> 255 <parameter name="t"> 256 <paramtype>T const &</paramtype> 257 </parameter> 258 <description> 259 <para>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </para> 260 </description> 261 </method> 262 </method-group> 263 </struct> 264 265 <struct name="child_c"> 266 <template> 267 <template-nontype-parameter name="N"> 268 <type>long</type> 269 </template-nontype-parameter> 270 </template> 271 <purpose> 272 A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 273 <computeroutput><functionname alt="proto::child_c">proto::child_c()</functionname></computeroutput> function. 274 </purpose> 275 <inherit><type><classname>proto::callable</classname></type></inherit> 276 <struct-specialization name="result"> 277 <template> 278 <template-type-parameter name="This"/> 279 <template-type-parameter name="Expr"/> 280 </template> 281 <specialization> 282 <template-arg>This(Expr)</template-arg> 283 </specialization> 284 <inherit><type><classname>proto::result_of::child_c</classname>< Expr, N ></type></inherit> 285 </struct-specialization> 286 <method-group name="public member functions"> 287 <method name="operator()" cv="const"> 288 <type>typename <classname>proto::result_of::child_c</classname>< Expr &, N >::type</type> 289 <template> 290 <template-type-parameter name="Expr"/> 291 </template> 292 <parameter name="expr"> 293 <paramtype>Expr &</paramtype> 294 <description> 295 <para>The expression node. </para> 296 </description> 297 </parameter> 298 <description> 299 <para> 300 Return the <replaceable>N</replaceable><superscript>th</superscript> child of the given expression. 301 </para> 302 </description> 303 <requires> 304 <para> 305 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 306 <computeroutput>true</computeroutput> 307 </para> 308 <para> 309 <computeroutput>N < Expr::proto_arity::value</computeroutput> 310 </para> 311 </requires> 312 <returns> 313 <para> 314 <computeroutput><functionname>proto::child_c</functionname><N>(expr)</computeroutput> 315 </para> 316 </returns> 317 <throws> 318 <simpara>Will not throw.</simpara> 319 </throws> 320 </method> 321 <method name="operator()" cv="const"> 322 <type>typename <classname>proto::result_of::child_c</classname>< Expr const &, N >::type</type> 323 <template> 324 <template-type-parameter name="Expr"/> 325 </template> 326 <parameter name="expr"> 327 <paramtype>Expr const &</paramtype> 328 </parameter> 329 <description> 330 <para>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </para> 331 </description> 332 </method> 333 </method-group> 334 </struct> 335 336 <struct name="child"> 337 <template> 338 <template-type-parameter name="N"> 339 <default>mpl::long_<0></default> 340 </template-type-parameter> 341 </template> 342 <purpose>A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 343 <computeroutput><functionname alt="proto::child">proto::child()</functionname></computeroutput> function.</purpose> 344 <description> 345 <para> 346 A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 347 <computeroutput><functionname alt="proto::child">proto::child()</functionname></computeroutput> 348 function. <computeroutput>N</computeroutput> is required to be an MPL Integral Constant. 349 </para> 350 </description> 351 <inherit><type><classname>proto::callable</classname></type></inherit> 352 <struct-specialization name="result"> 353 <template> 354 <template-type-parameter name="This"/> 355 <template-type-parameter name="Expr"/> 356 </template> 357 <specialization> 358 <template-arg>This(Expr)</template-arg> 359 </specialization> 360 <inherit> 361 <type><classname>proto::result_of::child</classname>< Expr, N ></type> 362 </inherit> 363 </struct-specialization> 364 <method-group name="public member functions"> 365 <method name="operator()" cv="const"> 366 <type>typename <classname>proto::result_of::child</classname>< Expr &, N >::type</type> 367 <template> 368 <template-type-parameter name="Expr"/> 369 </template> 370 <parameter name="expr"> 371 <paramtype>Expr &</paramtype> 372 <description> 373 <para>The expression node. </para> 374 </description> 375 </parameter> 376 <description> 377 <para> 378 Return the <replaceable>N</replaceable><superscript>th</superscript> child of the given expression. 379 </para> 380 </description> 381 <requires> 382 <para> 383 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 384 <computeroutput>true</computeroutput> 385 </para> 386 <para> 387 <computeroutput>N::value < Expr::proto_arity::value</computeroutput> 388 </para> 389 </requires> 390 <returns> 391 <para> 392 <computeroutput><functionname>proto::child</functionname><N>(expr)</computeroutput> 393 </para> 394 </returns> 395 <throws> 396 <simpara>Will not throw.</simpara> 397 </throws> 398 </method> 399 <method name="operator()" cv="const"> 400 <type>typename <classname>proto::result_of::child</classname>< Expr const &, N >::type</type> 401 <template> 402 <template-type-parameter name="Expr"/> 403 </template> 404 <parameter name="expr"> 405 <paramtype>Expr const &</paramtype> 406 </parameter> 407 <description> 408 <para>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </para> 409 </description> 410 </method> 411 </method-group> 412 </struct> 413 414 <struct name="value"> 415 <purpose> 416 A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 417 <computeroutput><functionname alt="proto::value">proto::value()</functionname></computeroutput> function. 418 </purpose> 419 <inherit><type><classname>proto::callable</classname></type></inherit> 420 <struct-specialization name="result"> 421 <template> 422 <template-type-parameter name="This"/> 423 <template-type-parameter name="Expr"/> 424 </template> 425 <specialization> 426 <template-arg>This(Expr)</template-arg> 427 </specialization> 428 <inherit> 429 <type><classname>proto::result_of::value</classname>< Expr ></type> 430 </inherit> 431 </struct-specialization> 432 <method-group name="public member functions"> 433 <method name="operator()" cv="const"> 434 <type>typename <classname>proto::result_of::value</classname>< Expr & >::type</type> 435 <template> 436 <template-type-parameter name="Expr"/> 437 </template> 438 <parameter name="expr"> 439 <paramtype>Expr &</paramtype> 440 <description> 441 <para>The terminal expression node. </para> 442 </description> 443 </parameter> 444 <description> 445 <para> 446 Return the value of the given terminal expression. 447 </para> 448 </description> 449 <requires> 450 <para> 451 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 452 <computeroutput>true</computeroutput> 453 </para> 454 <para> 455 <computeroutput>0 == Expr::proto_arity::value</computeroutput> 456 </para> 457 </requires> 458 <returns> 459 <para> 460 <computeroutput><functionname>proto::value</functionname>(expr)</computeroutput> 461 </para> 462 </returns> 463 <throws> 464 <simpara>Will not throw.</simpara> 465 </throws> 466 </method> 467 <method name="operator()" cv="const"> 468 <type>typename <classname>proto::result_of::value</classname>< Expr const & >::type</type> 469 <template> 470 <template-type-parameter name="Expr"/> 471 </template> 472 <parameter name="expr"> 473 <paramtype>Expr const &</paramtype> 474 </parameter> 475 <description> 476 <para>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </para> 477 </description> 478 </method> 479 </method-group> 480 </struct> 481 482 <struct name="left"> 483 <purpose>A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 484 <computeroutput><functionname alt="proto::left">proto::left()</functionname></computeroutput> function.</purpose> 485 <struct-specialization name="result"> 486 <template> 487 <template-type-parameter name="This"/> 488 <template-type-parameter name="Expr"/> 489 </template> 490 <specialization> 491 <template-arg>This(Expr)</template-arg> 492 </specialization> 493 <inherit> 494 <type><classname>proto::result_of::left</classname>< Expr ></type> 495 </inherit> 496 </struct-specialization> 497 <inherit> 498 <type><classname>proto::callable</classname></type> 499 </inherit> 500 <method-group name="public member functions"> 501 <method name="operator()" cv="const"> 502 <type>typename <classname>proto::result_of::left</classname>< Expr & >::type</type> 503 <template> 504 <template-type-parameter name="Expr"/> 505 </template> 506 <parameter name="expr"> 507 <paramtype>Expr &</paramtype> 508 <description> 509 <para>The expression node. </para> 510 </description> 511 </parameter> 512 <description> 513 <para> 514 Return the left child of the given binary expression. 515 </para> 516 </description> 517 <requires> 518 <para> 519 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 520 <computeroutput>true</computeroutput> 521 </para> 522 <para> 523 <computeroutput>2 == Expr::proto_arity::value</computeroutput> 524 </para> 525 </requires> 526 <returns> 527 <para> 528 <computeroutput><functionname>proto::left</functionname>(expr)</computeroutput> 529 </para> 530 </returns> 531 <throws> 532 <simpara>Will not throw.</simpara> 533 </throws> 534 </method> 535 <method name="operator()" cv="const"> 536 <type>typename <classname>proto::result_of::left</classname>< Expr const & >::type</type> 537 <template> 538 <template-type-parameter name="Expr"/> 539 </template> 540 <parameter name="expr"> 541 <paramtype>Expr const &</paramtype> 542 </parameter> 543 <description> 544 <para>This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. </para> 545 </description> 546 </method> 547 </method-group> 548 </struct> 549 550 <struct name="right"> 551 <purpose>A callable <conceptname>PolymorphicFunctionObject</conceptname> that is equivalent to the 552 <computeroutput><functionname alt="proto::right">proto::right()</functionname></computeroutput> function.</purpose> 553 <struct-specialization name="result"> 554 <template> 555 <template-type-parameter name="This"/> 556 <template-type-parameter name="Expr"/> 557 </template> 558 <specialization> 559 <template-arg>This(Expr)</template-arg> 560 </specialization> 561 <inherit> 562 <type><classname>proto::result_of::right</classname>< Expr ></type> 563 </inherit> 564 </struct-specialization> 565 <inherit> 566 <type><classname>proto::callable</classname></type> 567 </inherit> 568 <method-group name="public member functions"> 569 <method name="operator()" cv="const"> 570 <type>typename <classname>proto::result_of::right</classname>< Expr & >::type</type> 571 <template> 572 <template-type-parameter name="Expr"/> 573 </template> 574 <parameter name="expr"> 575 <paramtype>Expr &</paramtype> 576 <description> 577 <para>The expression node. </para> 578 </description> 579 </parameter> 580 <description> 581 <para>Return the right child of the given binary expression.</para> 582 </description> 583 <requires> 584 <para> 585 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is <computeroutput>true</computeroutput> 586 </para> 587 <para> 588 <computeroutput>2 == Expr::proto_arity::value</computeroutput> 589 </para> 590 </requires> 591 <returns> 592 <para> 593 <computeroutput><functionname>proto::right</functionname>(expr)</computeroutput> 594 </para> 595 </returns> 596 <throws> 597 <simpara>Will not throw.</simpara> 598 </throws> 599 </method> 600 <method name="operator()" cv="const"> 601 <type>typename <classname>proto::result_of::right</classname>< Expr const & >::type</type> 602 <template> 603 <template-type-parameter name="Expr"/> 604 </template> 605 <parameter name="expr"> 606 <paramtype>Expr const &</paramtype> 607 </parameter> 608 </method> 609 </method-group> 610 </struct> 611 </namespace> 612 613 <struct name="terminal"> 614 <template> 615 <template-type-parameter name="T"/> 616 </template> 617 <inherit><classname>proto::transform</classname>< terminal<T> ></inherit> 618 <purpose>A metafunction for generating terminal expression types, a grammar element for matching 619 terminal expressions, and 620 a <conceptname>PrimitiveTransform</conceptname> that returns the current expression unchanged. </purpose> 621 <struct name="impl"> 622 <template> 623 <template-type-parameter name="Expr"/> 624 <template-type-parameter name="State"/> 625 <template-type-parameter name="Data"/> 626 </template> 627 <inherit><classname>proto::transform_impl</classname>< Expr, State, Data ></inherit> 628 <typedef name="result_type"> 629 <type>Expr</type> 630 </typedef> 631 <method-group name="public member functions"> 632 <method name="operator()" cv="const"> 633 <type>Expr</type> 634 <parameter name="expr"> 635 <paramtype>typename impl::expr_param</paramtype> 636 <description> 637 <para>The current expression </para> 638 </description> 639 </parameter> 640 <parameter name=""> 641 <paramtype>typename impl::state_param</paramtype> 642 </parameter> 643 <parameter name=""> 644 <paramtype>typename impl::data_param</paramtype> 645 </parameter> 646 <requires> 647 <para> 648 <computeroutput><classname>proto::matches</classname><Expr, proto::terminal<T> >::value</computeroutput> is <computeroutput>true</computeroutput>. 649 </para> 650 </requires> 651 <returns> 652 <para> 653 <computeroutput>expr</computeroutput> 654 </para> 655 </returns> 656 <throws> 657 <simpara>Will not throw.</simpara> 658 </throws> 659 </method> 660 </method-group> 661 </struct> 662 <typedef name="type"> 663 <type><classname>proto::expr</classname>< <classname>proto::tag::terminal</classname>, <classname>proto::term</classname>< T > ></type> 664 </typedef> 665 <typedef name="proto_grammar"> 666 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::terminal</classname>, <classname>proto::term</classname>< T > ></type> 667 </typedef> 668 </struct> 669 670 <struct name="if_else_"> 671 <template> 672 <template-type-parameter name="T"/> 673 <template-type-parameter name="U"/> 674 <template-type-parameter name="V"/> 675 </template> 676 <inherit><classname>proto::transform</classname>< if_else_<T, U, V> ></inherit> 677 <purpose>A metafunction for generating ternary conditional expression types, a grammar element for 678 matching ternary conditional expressions, and 679 a <conceptname>PrimitiveTransform</conceptname> 680 that dispatches to the 681 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 682 transform.</purpose> 683 <struct name="impl"> 684 <template> 685 <template-type-parameter name="Expr"/> 686 <template-type-parameter name="State"/> 687 <template-type-parameter name="Data"/> 688 </template> 689 <inherit> 690 <type><classname>proto::pass_through</classname><if_else_>::template impl<Expr, State, Data></type> 691 </inherit> 692 </struct> 693 <typedef name="type"> 694 <type><classname>proto::expr</classname>< <classname>proto::tag::if_else_</classname>, <classname alt="proto::listN">proto::list3</classname>< T, U, V > ></type> 695 </typedef> 696 <typedef name="proto_grammar"> 697 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::if_else_</classname>, <classname alt="proto::listN">proto::list3</classname>< T, U, V > ></type> 698 </typedef> 699 </struct> 700 701 <struct name="unary_plus"> 702 <template> 703 <template-type-parameter name="T"/> 704 </template> 705 <inherit><classname>proto::transform</classname>< unary_plus<T> ></inherit> 706 <purpose>A metafunction for generating unary plus expression types, 707 a grammar element for matching unary plus expressions, and 708 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 709 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 710 transform.</purpose> 711 <struct name="impl"> 712 <template> 713 <template-type-parameter name="Expr"/> 714 <template-type-parameter name="State"/> 715 <template-type-parameter name="Data"/> 716 </template> 717 <inherit> 718 <type><classname>proto::pass_through</classname><unary_plus>::template impl<Expr, State, Data></type> 719 </inherit> 720 </struct> 721 <typedef name="type"> 722 <type><classname>proto::expr</classname>< <classname>proto::tag::unary_plus</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 723 </typedef> 724 <typedef name="proto_grammar"> 725 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::unary_plus</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 726 </typedef> 727 </struct> 728 729 <struct name="negate"> 730 <template> 731 <template-type-parameter name="T"/> 732 </template> 733 <inherit><classname>proto::transform</classname>< negate<T> ></inherit> 734 <purpose>A metafunction for generating unary minus expression types, 735 a grammar element for matching unary minus expressions, and 736 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 737 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 738 transform.</purpose> 739 <struct name="impl"> 740 <template> 741 <template-type-parameter name="Expr"/> 742 <template-type-parameter name="State"/> 743 <template-type-parameter name="Data"/> 744 </template> 745 <inherit> 746 <type><classname>proto::pass_through</classname><negate>::template impl<Expr, State, Data></type> 747 </inherit> 748 </struct> 749 <typedef name="type"> 750 <type><classname>proto::expr</classname>< <classname>proto::tag::negate</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 751 </typedef> 752 <typedef name="proto_grammar"> 753 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::negate</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 754 </typedef> 755 </struct> 756 757 <struct name="dereference"> 758 <template> 759 <template-type-parameter name="T"/> 760 </template> 761 <inherit><classname>proto::transform</classname>< dereference<T> ></inherit> 762 <purpose>A metafunction for generating defereference expression types, 763 a grammar element for matching dereference expressions, and 764 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 765 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 766 transform.</purpose> 767 <struct name="impl"> 768 <template> 769 <template-type-parameter name="Expr"/> 770 <template-type-parameter name="State"/> 771 <template-type-parameter name="Data"/> 772 </template> 773 <inherit> 774 <type><classname>proto::pass_through</classname><dereference>::template impl<Expr, State, Data></type> 775 </inherit> 776 </struct> 777 <typedef name="type"> 778 <type><classname>proto::expr</classname>< <classname>proto::tag::dereference</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 779 </typedef> 780 <typedef name="proto_grammar"> 781 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::dereference</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 782 </typedef> 783 </struct> 784 785 <struct name="complement"> 786 <template> 787 <template-type-parameter name="T"/> 788 </template> 789 <inherit><classname>proto::transform</classname>< complement<T> ></inherit> 790 <purpose>A metafunction for generating complement expression types, 791 a grammar element for matching complement expressions, and 792 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 793 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 794 transform.</purpose> 795 <struct name="impl"> 796 <template> 797 <template-type-parameter name="Expr"/> 798 <template-type-parameter name="State"/> 799 <template-type-parameter name="Data"/> 800 </template> 801 <inherit> 802 <type><classname>proto::pass_through</classname><complement>::template impl<Expr, State, Data></type> 803 </inherit> 804 </struct> 805 <typedef name="type"> 806 <type><classname>proto::expr</classname>< <classname>proto::tag::complement</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 807 </typedef> 808 <typedef name="proto_grammar"> 809 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::complement</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 810 </typedef> 811 </struct> 812 813 <struct name="address_of"> 814 <template> 815 <template-type-parameter name="T"/> 816 </template> 817 <inherit><classname>proto::transform</classname>< address_of<T> ></inherit> 818 <purpose>A metafunction for generating address_of expression types, 819 a grammar element for matching address_of expressions, and 820 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 821 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 822 transform.</purpose> 823 <struct name="impl"> 824 <template> 825 <template-type-parameter name="Expr"/> 826 <template-type-parameter name="State"/> 827 <template-type-parameter name="Data"/> 828 </template> 829 <inherit> 830 <type><classname>proto::pass_through</classname><address_of>::template impl<Expr, State, Data></type> 831 </inherit> 832 </struct> 833 <typedef name="type"> 834 <type><classname>proto::expr</classname>< <classname>proto::tag::address_of</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 835 </typedef> 836 <typedef name="proto_grammar"> 837 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::address_of</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 838 </typedef> 839 </struct> 840 841 <struct name="logical_not"> 842 <template> 843 <template-type-parameter name="T"/> 844 </template> 845 <inherit><classname>proto::transform</classname>< logical_not<T> ></inherit> 846 <purpose>A metafunction for generating logical_not expression types, 847 a grammar element for matching logical_not expressions, and 848 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 849 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 850 transform.</purpose> 851 <struct name="impl"> 852 <template> 853 <template-type-parameter name="Expr"/> 854 <template-type-parameter name="State"/> 855 <template-type-parameter name="Data"/> 856 </template> 857 <inherit> 858 <type><classname>proto::pass_through</classname><logical_not>::template impl<Expr, State, Data></type> 859 </inherit> 860 </struct> 861 <typedef name="type"> 862 <type><classname>proto::expr</classname>< <classname>proto::tag::logical_not</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 863 </typedef> 864 <typedef name="proto_grammar"> 865 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::logical_not</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 866 </typedef> 867 </struct> 868 869 <struct name="pre_inc"> 870 <template> 871 <template-type-parameter name="T"/> 872 </template> 873 <inherit><classname>proto::transform</classname>< pre_inc<T> ></inherit> 874 <purpose>A metafunction for generating pre-increment expression types, 875 a grammar element for matching pre-increment expressions, and 876 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 877 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 878 transform.</purpose> 879 <struct name="impl"> 880 <template> 881 <template-type-parameter name="Expr"/> 882 <template-type-parameter name="State"/> 883 <template-type-parameter name="Data"/> 884 </template> 885 <inherit> 886 <type><classname>proto::pass_through</classname><pre_inc>::template impl<Expr, State, Data></type> 887 </inherit> 888 </struct> 889 <typedef name="type"> 890 <type><classname>proto::expr</classname>< <classname>proto::tag::pre_inc</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 891 </typedef> 892 <typedef name="proto_grammar"> 893 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::pre_inc</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 894 </typedef> 895 </struct> 896 897 <struct name="pre_dec"> 898 <template> 899 <template-type-parameter name="T"/> 900 </template> 901 <inherit><classname>proto::transform</classname>< pre_dec<T> ></inherit> 902 <purpose>A metafunction for generating pre-decrement expression types, 903 a grammar element for matching pre-decrement expressions, and 904 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 905 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 906 transform.</purpose> 907 <struct name="impl"> 908 <template> 909 <template-type-parameter name="Expr"/> 910 <template-type-parameter name="State"/> 911 <template-type-parameter name="Data"/> 912 </template> 913 <inherit> 914 <type><classname>proto::pass_through</classname><pre_dec>::template impl<Expr, State, Data></type> 915 </inherit> 916 </struct> 917 <typedef name="type"> 918 <type><classname>proto::expr</classname>< <classname>proto::tag::pre_dec</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 919 </typedef> 920 <typedef name="proto_grammar"> 921 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::pre_dec</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 922 </typedef> 923 </struct> 924 925 <struct name="post_inc"> 926 <template> 927 <template-type-parameter name="T"/> 928 </template> 929 <inherit><classname>proto::transform</classname>< post_inc<T> ></inherit> 930 <purpose>A metafunction for generating post-increment expression types, 931 a grammar element for matching post-increment expressions, and 932 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 933 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 934 transform.</purpose> 935 <struct name="impl"> 936 <template> 937 <template-type-parameter name="Expr"/> 938 <template-type-parameter name="State"/> 939 <template-type-parameter name="Data"/> 940 </template> 941 <inherit> 942 <type><classname>proto::pass_through</classname><post_inc>::template impl<Expr, State, Data></type> 943 </inherit> 944 </struct> 945 <typedef name="type"> 946 <type><classname>proto::expr</classname>< <classname>proto::tag::post_inc</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 947 </typedef> 948 <typedef name="proto_grammar"> 949 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::post_inc</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 950 </typedef> 951 </struct> 952 953 <struct name="post_dec"> 954 <template> 955 <template-type-parameter name="T"/> 956 </template> 957 <inherit><classname>proto::transform</classname>< post_dec<T> ></inherit> 958 <purpose>A metafunction for generating post-decrement expression types, 959 a grammar element for matching post-decrement expressions, and 960 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 961 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 962 transform.</purpose> 963 <struct name="impl"> 964 <template> 965 <template-type-parameter name="Expr"/> 966 <template-type-parameter name="State"/> 967 <template-type-parameter name="Data"/> 968 </template> 969 <inherit> 970 <type><classname>proto::pass_through</classname><post_dec>::template impl<Expr, State, Data></type> 971 </inherit> 972 </struct> 973 <typedef name="type"> 974 <type><classname>proto::expr</classname>< <classname>proto::tag::post_dec</classname>, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 975 </typedef> 976 <typedef name="proto_grammar"> 977 <type> 978 <classname>proto::basic_expr</classname>< <classname>proto::tag::post_dec</classname>, <classname alt="proto::listN">proto::list1</classname>< T > > 979 </type> 980 </typedef> 981 </struct> 982 983 <struct name="shift_left"> 984 <template> 985 <template-type-parameter name="T"/> 986 <template-type-parameter name="U"/> 987 </template> 988 <inherit><classname>proto::transform</classname>< shift_left<T, U> ></inherit> 989 <purpose>A metafunction for generating left-shift expression types, 990 a grammar element for matching left-shift expressions, and 991 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 992 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 993 transform.</purpose> 994 <struct name="impl"> 995 <template> 996 <template-type-parameter name="Expr"/> 997 <template-type-parameter name="State"/> 998 <template-type-parameter name="Data"/> 999 </template> 1000 <inherit> 1001 <type><classname>proto::pass_through</classname><shift_left>::template impl<Expr, State, Data></type> 1002 </inherit> 1003 </struct> 1004 <typedef name="type"> 1005 <type><classname>proto::expr</classname>< <classname>proto::tag::shift_left</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1006 </typedef> 1007 <typedef name="proto_grammar"> 1008 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::shift_left</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1009 </typedef> 1010 </struct> 1011 1012 <struct name="shift_right"> 1013 <template> 1014 <template-type-parameter name="T"/> 1015 <template-type-parameter name="U"/> 1016 </template> 1017 <inherit><classname>proto::transform</classname>< shift_right<T, U> ></inherit> 1018 <purpose>A metafunction for generating right-shift expression types, 1019 a grammar element for matching right-shift expressions, and a 1020 <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1021 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1022 transform.</purpose> 1023 <struct name="impl"> 1024 <template> 1025 <template-type-parameter name="Expr"/> 1026 <template-type-parameter name="State"/> 1027 <template-type-parameter name="Data"/> 1028 </template> 1029 <inherit> 1030 <type><classname>proto::pass_through</classname><shift_right>::template impl<Expr, State, Data></type> 1031 </inherit> 1032 </struct> 1033 <typedef name="type"> 1034 <type><classname>proto::expr</classname>< <classname>proto::tag::shift_right</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1035 </typedef> 1036 <typedef name="proto_grammar"> 1037 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::shift_right</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1038 </typedef> 1039 </struct> 1040 1041 <struct name="multiplies"> 1042 <template> 1043 <template-type-parameter name="T"/> 1044 <template-type-parameter name="U"/> 1045 </template> 1046 <inherit><classname>proto::transform</classname>< multiplies<T, U> ></inherit> 1047 <purpose>A metafunction for generating multiplies expression types, 1048 a grammar element for matching multiplies expressions, and 1049 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1050 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1051 transform.</purpose> 1052 <struct name="impl"> 1053 <template> 1054 <template-type-parameter name="Expr"/> 1055 <template-type-parameter name="State"/> 1056 <template-type-parameter name="Data"/> 1057 </template> 1058 <inherit> 1059 <type><classname>proto::pass_through</classname><multiplies>::template impl<Expr, State, Data></type> 1060 </inherit> 1061 </struct> 1062 <typedef name="type"> 1063 <type><classname>proto::expr</classname>< <classname>proto::tag::multiplies</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1064 </typedef> 1065 <typedef name="proto_grammar"> 1066 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::multiplies</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1067 </typedef> 1068 </struct> 1069 1070 <struct name="divides"> 1071 <template> 1072 <template-type-parameter name="T"/> 1073 <template-type-parameter name="U"/> 1074 </template> 1075 <inherit><classname>proto::transform</classname>< divides<T, U> ></inherit> 1076 <purpose>A metafunction for generating divides expression types, 1077 a grammar element for matching divides expressions, and 1078 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1079 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1080 transform.</purpose> 1081 <struct name="impl"> 1082 <template> 1083 <template-type-parameter name="Expr"/> 1084 <template-type-parameter name="State"/> 1085 <template-type-parameter name="Data"/> 1086 </template> 1087 <inherit> 1088 <type><classname>proto::pass_through</classname><divides>::template impl<Expr, State, Data></type> 1089 </inherit> 1090 </struct> 1091 <typedef name="type"> 1092 <type><classname>proto::expr</classname>< <classname>proto::tag::divides</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1093 </typedef> 1094 <typedef name="proto_grammar"> 1095 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::divides</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1096 </typedef> 1097 </struct> 1098 1099 <struct name="modulus"> 1100 <template> 1101 <template-type-parameter name="T"/> 1102 <template-type-parameter name="U"/> 1103 </template> 1104 <inherit><classname>proto::transform</classname>< modulus<T, U> ></inherit> 1105 <purpose>A metafunction for generating modulus expression types, 1106 a grammar element for matching modulus expressions, and 1107 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1108 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1109 transform.</purpose> 1110 <struct name="impl"> 1111 <template> 1112 <template-type-parameter name="Expr"/> 1113 <template-type-parameter name="State"/> 1114 <template-type-parameter name="Data"/> 1115 </template> 1116 <inherit> 1117 <type><classname>proto::pass_through</classname><modulus>::template impl<Expr, State, Data></type> 1118 </inherit> 1119 </struct> 1120 <typedef name="type"> 1121 <type><classname>proto::expr</classname>< <classname>proto::tag::modulus</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1122 </typedef> 1123 <typedef name="proto_grammar"> 1124 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::modulus</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1125 </typedef> 1126 </struct> 1127 1128 <struct name="plus"> 1129 <template> 1130 <template-type-parameter name="T"/> 1131 <template-type-parameter name="U"/> 1132 </template> 1133 <inherit><classname>proto::transform</classname>< plus<T, U> ></inherit> 1134 <purpose>A metafunction for generating binary plus expression types, 1135 a grammar element for matching binary plus expressions, and 1136 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1137 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1138 transform.</purpose> 1139 <struct name="impl"> 1140 <template> 1141 <template-type-parameter name="Expr"/> 1142 <template-type-parameter name="State"/> 1143 <template-type-parameter name="Data"/> 1144 </template> 1145 <inherit> 1146 <type><classname>proto::pass_through</classname><plus>::template impl<Expr, State, Data></type> 1147 </inherit> 1148 </struct> 1149 <typedef name="type"> 1150 <type><classname>proto::expr</classname>< <classname>proto::tag::plus</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1151 </typedef> 1152 <typedef name="proto_grammar"> 1153 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::plus</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1154 </typedef> 1155 </struct> 1156 1157 <struct name="minus"> 1158 <template> 1159 <template-type-parameter name="T"/> 1160 <template-type-parameter name="U"/> 1161 </template> 1162 <inherit><classname>proto::transform</classname>< minus<T, U> ></inherit> 1163 <purpose>A metafunction for generating binary minus expression types, 1164 a grammar element for matching binary minus expressions, and 1165 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1166 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1167 transform.</purpose> 1168 <struct name="impl"> 1169 <template> 1170 <template-type-parameter name="Expr"/> 1171 <template-type-parameter name="State"/> 1172 <template-type-parameter name="Data"/> 1173 </template> 1174 <inherit> 1175 <type><classname>proto::pass_through</classname><minus>::template impl<Expr, State, Data></type> 1176 </inherit> 1177 </struct> 1178 <typedef name="type"> 1179 <type><classname>proto::expr</classname>< <classname>proto::tag::minus</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1180 </typedef> 1181 <typedef name="proto_grammar"> 1182 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::minus</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1183 </typedef> 1184 </struct> 1185 1186 <struct name="less"> 1187 <template> 1188 <template-type-parameter name="T"/> 1189 <template-type-parameter name="U"/> 1190 </template> 1191 <inherit><classname>proto::transform</classname>< less<T, U> ></inherit> 1192 <purpose>A metafunction for generating less expression types, 1193 a grammar element for matching less expressions, and 1194 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1195 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1196 transform.</purpose> 1197 <struct name="impl"> 1198 <template> 1199 <template-type-parameter name="Expr"/> 1200 <template-type-parameter name="State"/> 1201 <template-type-parameter name="Data"/> 1202 </template> 1203 <inherit> 1204 <type><classname>proto::pass_through</classname><less>::template impl<Expr, State, Data></type> 1205 </inherit> 1206 </struct> 1207 <typedef name="type"> 1208 <type><classname>proto::expr</classname>< <classname>proto::tag::less</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1209 </typedef> 1210 <typedef name="proto_grammar"> 1211 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::less</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1212 </typedef> 1213 </struct> 1214 1215 <struct name="greater"> 1216 <template> 1217 <template-type-parameter name="T"/> 1218 <template-type-parameter name="U"/> 1219 </template> 1220 <inherit><classname>proto::transform</classname>< greater<T, U> ></inherit> 1221 <purpose>A metafunction for generating greater expression types, 1222 a grammar element for matching greater expressions, and 1223 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1224 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1225 transform.</purpose> 1226 <struct name="impl"> 1227 <template> 1228 <template-type-parameter name="Expr"/> 1229 <template-type-parameter name="State"/> 1230 <template-type-parameter name="Data"/> 1231 </template> 1232 <inherit> 1233 <type><classname>proto::pass_through</classname><greater>::template impl<Expr, State, Data></type> 1234 </inherit> 1235 </struct> 1236 <typedef name="type"> 1237 <type><classname>proto::expr</classname>< <classname>proto::tag::greater</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1238 </typedef> 1239 <typedef name="proto_grammar"> 1240 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::greater</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1241 </typedef> 1242 </struct> 1243 1244 <struct name="less_equal"> 1245 <template> 1246 <template-type-parameter name="T"/> 1247 <template-type-parameter name="U"/> 1248 </template> 1249 <inherit><classname>proto::transform</classname>< less_equal<T, U> ></inherit> 1250 <purpose>A metafunction for generating less-or-equal expression types, 1251 a grammar element for matching less-or-equal expressions, and 1252 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1253 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1254 transform.</purpose> 1255 <struct name="impl"> 1256 <template> 1257 <template-type-parameter name="Expr"/> 1258 <template-type-parameter name="State"/> 1259 <template-type-parameter name="Data"/> 1260 </template> 1261 <inherit> 1262 <type><classname>proto::pass_through</classname><less_equal>::template impl<Expr, State, Data></type> 1263 </inherit> 1264 </struct> 1265 <typedef name="type"> 1266 <type><classname>proto::expr</classname>< <classname>proto::tag::less_equal</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1267 </typedef> 1268 <typedef name="proto_grammar"> 1269 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::less_equal</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1270 </typedef> 1271 </struct> 1272 1273 <struct name="greater_equal"> 1274 <template> 1275 <template-type-parameter name="T"/> 1276 <template-type-parameter name="U"/> 1277 </template> 1278 <inherit><classname>proto::transform</classname>< greater_equal<T, U> ></inherit> 1279 <purpose>A metafunction for generating greater-or-equal expression types, 1280 a grammar element for matching greater-or-equal expressions, and 1281 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1282 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1283 transform.</purpose> 1284 <struct name="impl"> 1285 <template> 1286 <template-type-parameter name="Expr"/> 1287 <template-type-parameter name="State"/> 1288 <template-type-parameter name="Data"/> 1289 </template> 1290 <inherit> 1291 <type><classname>proto::pass_through</classname><greater_equal>::template impl<Expr, State, Data></type> 1292 </inherit> 1293 </struct> 1294 <typedef name="type"> 1295 <type><classname>proto::expr</classname>< <classname>proto::tag::greater_equal</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1296 </typedef> 1297 <typedef name="proto_grammar"> 1298 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::greater_equal</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1299 </typedef> 1300 </struct> 1301 1302 <struct name="equal_to"> 1303 <template> 1304 <template-type-parameter name="T"/> 1305 <template-type-parameter name="U"/> 1306 </template> 1307 <inherit><classname>proto::transform</classname>< equal_to<T, U> ></inherit> 1308 <purpose>A metafunction for generating equal-to expression types, 1309 a grammar element for matching equal-to expressions, and 1310 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1311 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1312 transform.</purpose> 1313 <struct name="impl"> 1314 <template> 1315 <template-type-parameter name="Expr"/> 1316 <template-type-parameter name="State"/> 1317 <template-type-parameter name="Data"/> 1318 </template> 1319 <inherit> 1320 <type><classname>proto::pass_through</classname><equal_to>::template impl<Expr, State, Data></type> 1321 </inherit> 1322 </struct> 1323 <typedef name="type"> 1324 <type><classname>proto::expr</classname>< <classname>proto::tag::equal_to</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1325 </typedef> 1326 <typedef name="proto_grammar"> 1327 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::equal_to</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1328 </typedef> 1329 </struct> 1330 1331 <struct name="not_equal_to"> 1332 <template> 1333 <template-type-parameter name="T"/> 1334 <template-type-parameter name="U"/> 1335 </template> 1336 <inherit><classname>proto::transform</classname>< not_equal_to<T, U> ></inherit> 1337 <purpose>A metafunction for generating not-equal-to expression types, 1338 a grammar element for matching not-equal-to expressions, and 1339 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1340 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1341 transform.</purpose> 1342 <struct name="impl"> 1343 <template> 1344 <template-type-parameter name="Expr"/> 1345 <template-type-parameter name="State"/> 1346 <template-type-parameter name="Data"/> 1347 </template> 1348 <inherit> 1349 <type><classname>proto::pass_through</classname><mot_equal_to>::template impl<Expr, State, Data></type> 1350 </inherit> 1351 </struct> 1352 <typedef name="type"> 1353 <type><classname>proto::expr</classname>< <classname>proto::tag::not_equal_to</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1354 </typedef> 1355 <typedef name="proto_grammar"> 1356 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::not_equal_to</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1357 </typedef> 1358 </struct> 1359 1360 <struct name="logical_or"> 1361 <template> 1362 <template-type-parameter name="T"/> 1363 <template-type-parameter name="U"/> 1364 </template> 1365 <inherit><classname>proto::transform</classname>< logical_or<T, U> ></inherit> 1366 <purpose>A metafunction for generating logical-or expression types, 1367 a grammar element for matching logical-or expressions, and 1368 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1369 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1370 transform.</purpose> 1371 <struct name="impl"> 1372 <template> 1373 <template-type-parameter name="Expr"/> 1374 <template-type-parameter name="State"/> 1375 <template-type-parameter name="Data"/> 1376 </template> 1377 <inherit> 1378 <type><classname>proto::pass_through</classname><logical_or>::template impl<Expr, State, Data></type> 1379 </inherit> 1380 </struct> 1381 <typedef name="type"> 1382 <type><classname>proto::expr</classname>< <classname>proto::tag::logical_or</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1383 </typedef> 1384 <typedef name="proto_grammar"> 1385 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::logical_or</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1386 </typedef> 1387 </struct> 1388 1389 <struct name="logical_and"> 1390 <template> 1391 <template-type-parameter name="T"/> 1392 <template-type-parameter name="U"/> 1393 </template> 1394 <inherit><classname>proto::transform</classname>< logical_and<T, U> ></inherit> 1395 <purpose>A metafunction for generating logical-and expression types, 1396 a grammar element for matching logical-and expressions, and 1397 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1398 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1399 transform.</purpose> 1400 <struct name="impl"> 1401 <template> 1402 <template-type-parameter name="Expr"/> 1403 <template-type-parameter name="State"/> 1404 <template-type-parameter name="Data"/> 1405 </template> 1406 <inherit> 1407 <type><classname>proto::pass_through</classname><logical_and>::template impl<Expr, State, Data></type> 1408 </inherit> 1409 </struct> 1410 <typedef name="type"> 1411 <type><classname>proto::expr</classname>< <classname>proto::tag::logical_and</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1412 </typedef> 1413 <typedef name="proto_grammar"> 1414 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::logical_and</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1415 </typedef> 1416 </struct> 1417 1418 <struct name="bitwise_and"> 1419 <template> 1420 <template-type-parameter name="T"/> 1421 <template-type-parameter name="U"/> 1422 </template> 1423 <inherit><classname>proto::transform</classname>< bitwise_and<T, U> ></inherit> 1424 <purpose>A metafunction for generating bitwise-and expression types, 1425 a grammar element for matching bitwise-and expressions, and 1426 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1427 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1428 transform.</purpose> 1429 <struct name="impl"> 1430 <template> 1431 <template-type-parameter name="Expr"/> 1432 <template-type-parameter name="State"/> 1433 <template-type-parameter name="Data"/> 1434 </template> 1435 <inherit> 1436 <type><classname>proto::pass_through</classname><bitwise_and>::template impl<Expr, State, Data></type> 1437 </inherit> 1438 </struct> 1439 <typedef name="type"> 1440 <type><classname>proto::expr</classname>< <classname>proto::tag::bitwise_and</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1441 </typedef> 1442 <typedef name="proto_grammar"> 1443 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::bitwise_and</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1444 </typedef> 1445 </struct> 1446 1447 <struct name="bitwise_or"> 1448 <template> 1449 <template-type-parameter name="T"/> 1450 <template-type-parameter name="U"/> 1451 </template> 1452 <inherit><classname>proto::transform</classname>< bitwise_or<T, U> ></inherit> 1453 <purpose>A metafunction for generating bitwise-or expression types, 1454 a grammar element for matching bitwise-or expressions, and 1455 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1456 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1457 transform.</purpose> 1458 <struct name="impl"> 1459 <template> 1460 <template-type-parameter name="Expr"/> 1461 <template-type-parameter name="State"/> 1462 <template-type-parameter name="Data"/> 1463 </template> 1464 <inherit> 1465 <type><classname>proto::pass_through</classname><bitwise_or>::template impl<Expr, State, Data></type> 1466 </inherit> 1467 </struct> 1468 <typedef name="type"> 1469 <type><classname>proto::expr</classname>< <classname>proto::tag::bitwise_or</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1470 </typedef> 1471 <typedef name="proto_grammar"> 1472 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::bitwise_or</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1473 </typedef> 1474 </struct> 1475 1476 <struct name="bitwise_xor"> 1477 <template> 1478 <template-type-parameter name="T"/> 1479 <template-type-parameter name="U"/> 1480 </template> 1481 <inherit><classname>proto::transform</classname>< bitwise_xor<T, U> ></inherit> 1482 <purpose>A metafunction for generating bitwise-xor expression types, 1483 a grammar element for matching bitwise-xor expressions, and 1484 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1485 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1486 transform.</purpose> 1487 <struct name="impl"> 1488 <template> 1489 <template-type-parameter name="Expr"/> 1490 <template-type-parameter name="State"/> 1491 <template-type-parameter name="Data"/> 1492 </template> 1493 <inherit> 1494 <type><classname>proto::pass_through</classname><bitwise_xor>::template impl<Expr, State, Data></type> 1495 </inherit> 1496 </struct> 1497 <typedef name="type"> 1498 <type><classname>proto::expr</classname>< <classname>proto::tag::bitwise_xor</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1499 </typedef> 1500 <typedef name="proto_grammar"> 1501 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::bitwise_xor</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1502 </typedef> 1503 </struct> 1504 1505 <struct name="comma"> 1506 <template> 1507 <template-type-parameter name="T"/> 1508 <template-type-parameter name="U"/> 1509 </template> 1510 <inherit><classname>proto::transform</classname>< comma<T, U> ></inherit> 1511 <purpose>A metafunction for generating comma expression types, 1512 a grammar element for matching comma expressions, and 1513 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1514 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1515 transform.</purpose> 1516 <struct name="impl"> 1517 <template> 1518 <template-type-parameter name="Expr"/> 1519 <template-type-parameter name="State"/> 1520 <template-type-parameter name="Data"/> 1521 </template> 1522 <inherit> 1523 <type><classname>proto::pass_through</classname><comma>::template impl<Expr, State, Data></type> 1524 </inherit> 1525 </struct> 1526 <typedef name="type"> 1527 <type><classname>proto::expr</classname>< <classname>proto::tag::comma</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1528 </typedef> 1529 <typedef name="proto_grammar"> 1530 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::comma</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1531 </typedef> 1532 </struct> 1533 1534 <struct name="mem_ptr"> 1535 <template> 1536 <template-type-parameter name="T"/> 1537 <template-type-parameter name="U"/> 1538 </template> 1539 <inherit><classname>proto::transform</classname>< mem_ptr<T, U> ></inherit> 1540 <struct name="impl"> 1541 <template> 1542 <template-type-parameter name="Expr"/> 1543 <template-type-parameter name="State"/> 1544 <template-type-parameter name="Data"/> 1545 </template> 1546 <inherit> 1547 <type><classname>proto::pass_through</classname><mem_ptr>::template impl<Expr, State, Data></type> 1548 </inherit> 1549 </struct> 1550 <typedef name="type"> 1551 <type><classname>proto::expr</classname>< <classname>proto::tag::mem_ptr</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1552 </typedef> 1553 <typedef name="proto_grammar"> 1554 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::mem_ptr</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1555 </typedef> 1556 </struct> 1557 1558 <struct name="assign"> 1559 <template> 1560 <template-type-parameter name="T"/> 1561 <template-type-parameter name="U"/> 1562 </template> 1563 <inherit><classname>proto::transform</classname>< assign<T, U> ></inherit> 1564 <purpose>A metafunction for generating assignment expression types, 1565 a grammar element for matching assignment expressions, and 1566 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1567 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1568 transform.</purpose> 1569 <struct name="impl"> 1570 <template> 1571 <template-type-parameter name="Expr"/> 1572 <template-type-parameter name="State"/> 1573 <template-type-parameter name="Data"/> 1574 </template> 1575 <inherit> 1576 <type><classname>proto::pass_through</classname><assign>::template impl<Expr, State, Data></type> 1577 </inherit> 1578 </struct> 1579 <typedef name="type"> 1580 <type><classname>proto::expr</classname>< <classname>proto::tag::assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1581 </typedef> 1582 <typedef name="proto_grammar"> 1583 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1584 </typedef> 1585 </struct> 1586 1587 <struct name="shift_left_assign"> 1588 <template> 1589 <template-type-parameter name="T"/> 1590 <template-type-parameter name="U"/> 1591 </template> 1592 <inherit><classname>proto::transform</classname>< shift_left_assign<T, U> ></inherit> 1593 <purpose>A metafunction for generating left-shift-assign expression types, 1594 a grammar element for matching left-shift-assign expressions, and 1595 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1596 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1597 transform.</purpose> 1598 <struct name="impl"> 1599 <template> 1600 <template-type-parameter name="Expr"/> 1601 <template-type-parameter name="State"/> 1602 <template-type-parameter name="Data"/> 1603 </template> 1604 <inherit> 1605 <type><classname>proto::pass_through</classname><shift_left_assign>::template impl<Expr, State, Data></type> 1606 </inherit> 1607 </struct> 1608 <typedef name="type"> 1609 <type><classname>proto::expr</classname>< <classname>proto::tag::shift_left_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1610 </typedef> 1611 <typedef name="proto_grammar"> 1612 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::shift_left_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1613 </typedef> 1614 </struct> 1615 1616 <struct name="shift_right_assign"> 1617 <template> 1618 <template-type-parameter name="T"/> 1619 <template-type-parameter name="U"/> 1620 </template> 1621 <inherit><classname>proto::transform</classname>< shift_right_assign<T, U> ></inherit> 1622 <purpose>A metafunction for generating right-shift-assign expression types, 1623 a grammar element for matching right-shift-assign expressions, and 1624 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1625 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1626 transform.</purpose> 1627 <struct name="impl"> 1628 <template> 1629 <template-type-parameter name="Expr"/> 1630 <template-type-parameter name="State"/> 1631 <template-type-parameter name="Data"/> 1632 </template> 1633 <inherit> 1634 <type><classname>proto::pass_through</classname><shift_right_assign>::template impl<Expr, State, Data></type> 1635 </inherit> 1636 </struct> 1637 <typedef name="type"> 1638 <type><classname>proto::expr</classname>< <classname>proto::tag::shift_right_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1639 </typedef> 1640 <typedef name="proto_grammar"> 1641 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::shift_right_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1642 </typedef> 1643 </struct> 1644 1645 <struct name="multiplies_assign"> 1646 <template> 1647 <template-type-parameter name="T"/> 1648 <template-type-parameter name="U"/> 1649 </template> 1650 <inherit><classname>proto::transform</classname>< multiplies_assign<T, U> ></inherit> 1651 <purpose>A metafunction for generating multiplies-assign expression types, 1652 a grammar element for matching multiplies-assign expressions, and 1653 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1654 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1655 transform.</purpose> 1656 <struct name="impl"> 1657 <template> 1658 <template-type-parameter name="Expr"/> 1659 <template-type-parameter name="State"/> 1660 <template-type-parameter name="Data"/> 1661 </template> 1662 <inherit> 1663 <type><classname>proto::pass_through</classname><multiplies_assign>::template impl<Expr, State, Data></type> 1664 </inherit> 1665 </struct> 1666 <typedef name="type"> 1667 <type><classname>proto::expr</classname>< <classname>proto::tag::multiplies_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1668 </typedef> 1669 <typedef name="proto_grammar"> 1670 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::multiplies_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1671 </typedef> 1672 </struct> 1673 1674 <struct name="divides_assign"> 1675 <template> 1676 <template-type-parameter name="T"/> 1677 <template-type-parameter name="U"/> 1678 </template> 1679 <inherit><classname>proto::transform</classname>< divides_assign<T, U> ></inherit> 1680 <purpose>A metafunction for generating divides-assign expression types, 1681 a grammar element for matching divides-assign expressions, and 1682 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1683 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1684 transform.</purpose> 1685 <struct name="impl"> 1686 <template> 1687 <template-type-parameter name="Expr"/> 1688 <template-type-parameter name="State"/> 1689 <template-type-parameter name="Data"/> 1690 </template> 1691 <inherit> 1692 <type><classname>proto::pass_through</classname><divides_assign>::template impl<Expr, State, Data></type> 1693 </inherit> 1694 </struct> 1695 <typedef name="type"> 1696 <type><classname>proto::expr</classname>< <classname>proto::tag::divides_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1697 </typedef> 1698 <typedef name="proto_grammar"> 1699 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::divides_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1700 </typedef> 1701 </struct> 1702 1703 <struct name="modulus_assign"> 1704 <template> 1705 <template-type-parameter name="T"/> 1706 <template-type-parameter name="U"/> 1707 </template> 1708 <inherit><classname>proto::transform</classname>< modulus_assign<T, U> ></inherit> 1709 <purpose>A metafunction for generating modulus-assign expression types, 1710 a grammar element for matching modulus-assign expressions, and 1711 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1712 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1713 transform.</purpose> 1714 <struct name="impl"> 1715 <template> 1716 <template-type-parameter name="Expr"/> 1717 <template-type-parameter name="State"/> 1718 <template-type-parameter name="Data"/> 1719 </template> 1720 <inherit> 1721 <type><classname>proto::pass_through</classname><modulus_assign>::template impl<Expr, State, Data></type> 1722 </inherit> 1723 </struct> 1724 <typedef name="type"> 1725 <type><classname>proto::expr</classname>< <classname>proto::tag::modulus_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1726 </typedef> 1727 <typedef name="proto_grammar"> 1728 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::modulus_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1729 </typedef> 1730 </struct> 1731 1732 <struct name="plus_assign"> 1733 <template> 1734 <template-type-parameter name="T"/> 1735 <template-type-parameter name="U"/> 1736 </template> 1737 <inherit><classname>proto::transform</classname>< plus_assign<T, U> ></inherit> 1738 <purpose>A metafunction for generating plus-assign expression types, 1739 a grammar element for matching plus-assign expressions, and 1740 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1741 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1742 transform.</purpose> 1743 <struct name="impl"> 1744 <template> 1745 <template-type-parameter name="Expr"/> 1746 <template-type-parameter name="State"/> 1747 <template-type-parameter name="Data"/> 1748 </template> 1749 <inherit> 1750 <type><classname>proto::pass_through</classname><plus_assign>::template impl<Expr, State, Data></type> 1751 </inherit> 1752 </struct> 1753 <typedef name="type"> 1754 <type><classname>proto::expr</classname>< <classname>proto::tag::plus_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1755 </typedef> 1756 <typedef name="proto_grammar"> 1757 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::plus_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1758 </typedef> 1759 </struct> 1760 1761 <struct name="minus_assign"> 1762 <template> 1763 <template-type-parameter name="T"/> 1764 <template-type-parameter name="U"/> 1765 </template> 1766 <inherit><classname>proto::transform</classname>< minus_assign<T, U> ></inherit> 1767 <purpose>A metafunction for generating minus-assign expression types, 1768 a grammar element for matching minus-assign expressions, and 1769 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1770 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1771 transform.</purpose> 1772 <struct name="impl"> 1773 <template> 1774 <template-type-parameter name="Expr"/> 1775 <template-type-parameter name="State"/> 1776 <template-type-parameter name="Data"/> 1777 </template> 1778 <inherit> 1779 <type><classname>proto::pass_through</classname><minus_assign>::template impl<Expr, State, Data></type> 1780 </inherit> 1781 </struct> 1782 <typedef name="type"> 1783 <type><classname>proto::expr</classname>< <classname>proto::tag::minus_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1784 </typedef> 1785 <typedef name="proto_grammar"> 1786 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::minus_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1787 </typedef> 1788 </struct> 1789 1790 <struct name="bitwise_and_assign"> 1791 <template> 1792 <template-type-parameter name="T"/> 1793 <template-type-parameter name="U"/> 1794 </template> 1795 <inherit><classname>proto::transform</classname>< bitwise_and_assign<T, U> ></inherit> 1796 <purpose>A metafunction for generating bitwise-and-assign expression types, 1797 a grammar element for matching bitwise-and-assign expressions, and 1798 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1799 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1800 transform.</purpose> 1801 <struct name="impl"> 1802 <template> 1803 <template-type-parameter name="Expr"/> 1804 <template-type-parameter name="State"/> 1805 <template-type-parameter name="Data"/> 1806 </template> 1807 <inherit> 1808 <type><classname>proto::pass_through</classname><bitwise_and_assign>::template impl<Expr, State, Data></type> 1809 </inherit> 1810 </struct> 1811 <typedef name="type"> 1812 <type><classname>proto::expr</classname>< <classname>proto::tag::bitwise_and_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1813 </typedef> 1814 <typedef name="proto_grammar"> 1815 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::bitwise_and_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1816 </typedef> 1817 </struct> 1818 1819 <struct name="bitwise_or_assign"> 1820 <template> 1821 <template-type-parameter name="T"/> 1822 <template-type-parameter name="U"/> 1823 </template> 1824 <inherit><classname>proto::transform</classname>< bitwise_or_assign<T, U> ></inherit> 1825 <purpose>A metafunction for generating bitwise-or-assign expression types, 1826 a grammar element for matching bitwise-or-assign expressions, and 1827 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1828 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1829 transform.</purpose> 1830 <struct name="impl"> 1831 <template> 1832 <template-type-parameter name="Expr"/> 1833 <template-type-parameter name="State"/> 1834 <template-type-parameter name="Data"/> 1835 </template> 1836 <inherit> 1837 <type><classname>proto::pass_through</classname><bitwise_or_assign>::template impl<Expr, State, Data></type> 1838 </inherit> 1839 </struct> 1840 <typedef name="type"> 1841 <type><classname>proto::expr</classname>< <classname>proto::tag::bitwise_or_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1842 </typedef> 1843 <typedef name="proto_grammar"> 1844 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::bitwise_or_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1845 </typedef> 1846 </struct> 1847 1848 <struct name="bitwise_xor_assign"> 1849 <template> 1850 <template-type-parameter name="T"/> 1851 <template-type-parameter name="U"/> 1852 </template> 1853 <inherit><classname>proto::transform</classname>< bitwise_xor_assign<T, U> ></inherit> 1854 <purpose>A metafunction for generating bitwise-xor-assign expression types, 1855 a grammar element for matching bitwise-xor-assign expressions, and 1856 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1857 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1858 transform.</purpose> 1859 <struct name="impl"> 1860 <template> 1861 <template-type-parameter name="Expr"/> 1862 <template-type-parameter name="State"/> 1863 <template-type-parameter name="Data"/> 1864 </template> 1865 <inherit> 1866 <type><classname>proto::pass_through</classname><bitwise_xor_assign>::template impl<Expr, State, Data></type> 1867 </inherit> 1868 </struct> 1869 <typedef name="type"> 1870 <type><classname>proto::expr</classname>< <classname>proto::tag::bitwise_xor_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1871 </typedef> 1872 <typedef name="proto_grammar"> 1873 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::bitwise_xor_assign</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1874 </typedef> 1875 </struct> 1876 1877 <struct name="subscript"> 1878 <template> 1879 <template-type-parameter name="T"/> 1880 <template-type-parameter name="U"/> 1881 </template> 1882 <inherit><classname>proto::transform</classname>< subscript<T, U> ></inherit> 1883 <purpose>A metafunction for generating subscript expression types, 1884 a grammar element for matching subscript expressions, and 1885 a <conceptname>PrimitiveTransform</conceptname> that dispatches to the 1886 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1887 transform.</purpose> 1888 <struct name="impl"> 1889 <template> 1890 <template-type-parameter name="Expr"/> 1891 <template-type-parameter name="State"/> 1892 <template-type-parameter name="Data"/> 1893 </template> 1894 <inherit> 1895 <type><classname>proto::pass_through</classname><subscript>::template impl<Expr, State, Data></type> 1896 </inherit> 1897 </struct> 1898 <typedef name="type"> 1899 <type><classname>proto::expr</classname>< <classname>proto::tag::subscript</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1900 </typedef> 1901 <typedef name="proto_grammar"> 1902 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::subscript</classname>, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 1903 </typedef> 1904 </struct> 1905 1906 <struct name="function"> 1907 <template> 1908 <template-type-parameter name="A" pack="1"/> 1909 </template> 1910 <inherit><classname>proto::transform</classname>< function<A...> ></inherit> 1911 <purpose>A metafunction for generating function-call expression types, a grammar element for 1912 matching function-call expressions, and 1913 a <conceptname>PrimitiveTransform</conceptname> 1914 that dispatches to the 1915 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 1916 transform.</purpose> 1917 <struct name="impl"> 1918 <template> 1919 <template-type-parameter name="Expr"/> 1920 <template-type-parameter name="State"/> 1921 <template-type-parameter name="Data"/> 1922 </template> 1923 <inherit> 1924 <type><classname>proto::pass_through</classname><function>::template impl<Expr, State, Data></type> 1925 </inherit> 1926 </struct> 1927 <typedef name="type"> 1928 <type><classname>proto::expr</classname>< <classname>proto::tag::function</classname>, <classname alt="proto::listN">proto::list<replaceable>N</replaceable></classname>< A... > ></type> 1929 </typedef> 1930 <typedef name="proto_grammar"> 1931 <type><classname>proto::basic_expr</classname>< <classname>proto::tag::function</classname>, <classname alt="proto::listN">proto::list<replaceable>N</replaceable></classname>< A... > ></type> 1932 </typedef> 1933 </struct> 1934 1935 <struct name="nullary_expr"> 1936 <template> 1937 <template-type-parameter name="Tag"/> 1938 <template-type-parameter name="T"/> 1939 </template> 1940 <inherit><classname>proto::transform</classname>< nullary_expr<Tag, T> ></inherit> 1941 <purpose>A metafunction for generating nullary expression types, a grammar element for matching 1942 nullary expressions, and 1943 a <conceptname>PrimitiveTransform</conceptname> that returns the current expression unchanged. </purpose> 1944 <description> 1945 <para> 1946 Use <computeroutput>proto::nullary_expr<<classname>proto::_</classname>, <classname>proto::_</classname>></computeroutput> 1947 as a grammar element to match any nullary expression. 1948 </para> 1949 </description> 1950 <struct name="impl"> 1951 <template> 1952 <template-type-parameter name="Expr"/> 1953 <template-type-parameter name="State"/> 1954 <template-type-parameter name="Data"/> 1955 </template> 1956 <inherit><classname>proto::transform_impl</classname>< Expr, State, Data ></inherit> 1957 <typedef name="result_type"> 1958 <type>Expr</type> 1959 </typedef> 1960 <method-group name="public member functions"> 1961 <method name="operator()" cv="const"> 1962 <type>Expr</type> 1963 <parameter name="expr"> 1964 <paramtype>typename impl::expr_param</paramtype> 1965 <description> 1966 <para>The current expression </para> 1967 </description> 1968 </parameter> 1969 <parameter name=""> 1970 <paramtype>typename impl::state_param</paramtype> 1971 </parameter> 1972 <parameter name=""> 1973 <paramtype>typename impl::data_param</paramtype> 1974 </parameter> 1975 <requires> 1976 <para> 1977 <computeroutput><classname>proto::matches</classname><Expr, proto::nullary_expr<Tag, T> >::value</computeroutput> is <computeroutput>true</computeroutput>. 1978 </para> 1979 </requires> 1980 <returns> 1981 <para> 1982 <computeroutput>expr</computeroutput> 1983 </para> 1984 </returns> 1985 <throws> 1986 <simpara>Will not throw.</simpara> 1987 </throws> 1988 </method> 1989 </method-group> 1990 </struct> 1991 <typedef name="type"> 1992 <type><classname>proto::expr</classname>< Tag, <classname>proto::term</classname>< T > ></type> 1993 </typedef> 1994 <typedef name="proto_grammar"> 1995 <type><classname>proto::basic_expr</classname>< Tag, <classname>proto::term</classname>< T > ></type> 1996 </typedef> 1997 </struct> 1998 1999 <struct name="unary_expr"> 2000 <template> 2001 <template-type-parameter name="Tag"/> 2002 <template-type-parameter name="T"/> 2003 </template> 2004 <inherit><classname>proto::transform</classname>< unary_expr<Tag, T> ></inherit> 2005 <purpose>A metafunction for generating unary expression types with a specified tag type, 2006 a grammar element for matching unary expressions, and 2007 a <conceptname>PrimitiveTransform</conceptname> 2008 that dispatches to the 2009 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 2010 transform.</purpose> 2011 <description> 2012 <para> 2013 Use <computeroutput>proto::unary_expr<<classname>proto::_</classname>, <classname>proto::_</classname>></computeroutput> 2014 as a grammar element to match any unary expression. 2015 </para> 2016 </description> 2017 <struct name="impl"> 2018 <template> 2019 <template-type-parameter name="Expr"/> 2020 <template-type-parameter name="State"/> 2021 <template-type-parameter name="Data"/> 2022 </template> 2023 <inherit> 2024 <type><classname>proto::pass_through</classname><unary_expr>::template impl<Expr, State, Data></type> 2025 </inherit> 2026 </struct> 2027 <typedef name="type"> 2028 <type><classname>proto::expr</classname>< Tag, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 2029 </typedef> 2030 <typedef name="proto_grammar"> 2031 <type><classname>proto::basic_expr</classname>< Tag, <classname alt="proto::listN">proto::list1</classname>< T > ></type> 2032 </typedef> 2033 </struct> 2034 2035 <struct name="binary_expr"> 2036 <template> 2037 <template-type-parameter name="Tag"/> 2038 <template-type-parameter name="T"/> 2039 <template-type-parameter name="U"/> 2040 </template> 2041 <inherit><classname>proto::transform</classname>< binary_expr<Tag, T, U> ></inherit> 2042 <purpose>A metafunction for generating binary expression types with a specified tag type, 2043 a grammar element for matching binary expressions, and 2044 a <conceptname>PrimitiveTransform</conceptname> 2045 that dispatches to the 2046 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 2047 transform.</purpose> 2048 <description> 2049 <para> 2050 Use <computeroutput>proto::binary_expr<<classname>proto::_</classname>, <classname>proto::_</classname>, <classname>proto::_</classname>></computeroutput> as a grammar element to match any binary expression. 2051 </para> 2052 </description> 2053 <struct name="impl"> 2054 <template> 2055 <template-type-parameter name="Expr"/> 2056 <template-type-parameter name="State"/> 2057 <template-type-parameter name="Data"/> 2058 </template> 2059 <inherit> 2060 <type><classname>proto::pass_through</classname><binary_expr>::template impl<Expr, State, Data></type> 2061 </inherit> 2062 </struct> 2063 <typedef name="type"> 2064 <type><classname>proto::expr</classname>< Tag, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 2065 </typedef> 2066 <typedef name="proto_grammar"> 2067 <type><classname>proto::basic_expr</classname>< Tag, <classname alt="proto::listN">proto::list2</classname>< T, U > ></type> 2068 </typedef> 2069 </struct> 2070 2071 <struct name="nary_expr"> 2072 <template> 2073 <template-type-parameter name="Tag"/> 2074 <template-type-parameter name="A" pack="1"/> 2075 </template> 2076 <inherit><classname>proto::transform</classname>< nary_expr<Tag, A...> ></inherit> 2077 <purpose>A metafunction for generating n-ary expression types with a specified tag type, 2078 a grammar element for matching n-ary expressions, and 2079 a <conceptname>PrimitiveTransform</conceptname> 2080 that dispatches to the 2081 <computeroutput><classname alt="proto::pass_through">proto::pass_through<></classname></computeroutput> 2082 transform.</purpose> 2083 <description> 2084 <para> 2085 Use <computeroutput>proto::nary_expr<<classname>proto::_</classname>, <classname>proto::vararg</classname><<classname>proto::_</classname>> ></computeroutput> 2086 as a grammar element to match any n-ary expression; that is, any non-terminal. 2087 </para> 2088 </description> 2089 <struct name="impl"> 2090 <template> 2091 <template-type-parameter name="Expr"/> 2092 <template-type-parameter name="State"/> 2093 <template-type-parameter name="Data"/> 2094 </template> 2095 <inherit> 2096 <type><classname>proto::pass_through</classname><nary_expr>::template impl<Expr, State, Data></type> 2097 </inherit> 2098 </struct> 2099 <typedef name="type"> 2100 <type><classname>proto::expr</classname>< Tag, <classname alt="proto::listN">proto::list<replaceable>N</replaceable></classname>< A... > ></type> 2101 </typedef> 2102 <typedef name="proto_grammar"> 2103 <type><classname>proto::basic_expr</classname>< Tag, <classname alt="proto::listN">proto::list<replaceable>N</replaceable></classname>< A... > ></type> 2104 </typedef> 2105 </struct> 2106 2107 <struct name="is_expr"> 2108 <template> 2109 <template-type-parameter name="T"/> 2110 </template> 2111 <inherit><type>mpl::bool_<<replaceable>true-or-false</replaceable>></type></inherit> 2112 <purpose>A Boolean metafunction that indicates whether a given type <computeroutput>T</computeroutput> 2113 is a Proto expression type.</purpose> 2114 <description> 2115 <para> 2116 If <computeroutput>T</computeroutput> is an instantiation of 2117 <computeroutput><classname alt="proto::expr">proto::expr<></classname></computeroutput> or 2118 <computeroutput><classname alt="proto::basic_expr">proto::basic_expr<></classname></computeroutput> or is an extension 2119 (via <classname alt="proto::extends">proto::extends<></classname> or 2120 <macroname>BOOST_PROTO_EXTENDS</macroname>()) of such an instantiation, 2121 <computeroutput><classname>proto::is_expr</classname><T>::value</computeroutput> 2122 is <computeroutput>true</computeroutput>. 2123 Otherwise, <computeroutput><classname>proto::is_expr</classname><T>::value</computeroutput> 2124 is <computeroutput>false</computeroutput>. 2125 </para> 2126 </description> 2127 </struct> 2128 2129 <struct name="tag_of"> 2130 <template> 2131 <template-type-parameter name="Expr"/> 2132 </template> 2133 <purpose>A metafunction that returns the tag type of a Proto expression. </purpose> 2134 <typedef name="type"> 2135 <type>typename Expr::proto_tag</type> 2136 </typedef> 2137 </struct> 2138 2139 <struct name="arity_of"> 2140 <template> 2141 <template-type-parameter name="Expr"/> 2142 </template> 2143 <purpose>A metafunction that returns the arity of a Proto expression. </purpose> 2144 <inherit><type>Expr::proto_arity</type></inherit> 2145 </struct> 2146 2147 <namespace name="result_of"> 2148 <struct name="as_expr"> 2149 <template> 2150 <template-type-parameter name="T"/> 2151 <template-type-parameter name="Domain"> 2152 <default><classname>proto::default_domain</classname></default> 2153 </template-type-parameter> 2154 </template> 2155 <purpose>A metafunction that computes the return type of the 2156 <computeroutput><functionname>proto::as_expr</functionname>()</computeroutput> function.</purpose> 2157 <description> 2158 <para> 2159 The <computeroutput>proto::result_of::as_expr<></computeroutput> metafunction turns types 2160 into Proto expression types, if they are not already, in a domain-specific way. It is intended 2161 for use to compute the type of a local variable that can hold the result of the 2162 <computeroutput><functionname>proto::as_expr</functionname>()</computeroutput> function. 2163 </para> 2164 <para> 2165 See <computeroutput><classname>proto::domain::as_expr</classname><></computeroutput> 2166 for a complete description of the default behavior. 2167 </para> 2168 </description> 2169 <typedef name="type"> 2170 <type>typename Domain::template as_expr< T >::result_type</type> 2171 </typedef> 2172 </struct> 2173 2174 <struct name="as_child"> 2175 <template> 2176 <template-type-parameter name="T"/> 2177 <template-type-parameter name="Domain"> 2178 <default><classname>proto::default_domain</classname></default> 2179 </template-type-parameter> 2180 </template> 2181 <purpose>A metafunction that computes the return type of the 2182 <computeroutput><functionname>proto::as_child</functionname>()</computeroutput> function.</purpose> 2183 <description> 2184 <para> 2185 The <computeroutput>proto::result_of::as_child<></computeroutput> metafunction turns types 2186 into Proto expression types, if they are not already, in a domain-specific way. It is used by Proto 2187 to compute the type of an object to store as a child in another expression node. 2188 </para> 2189 <para> 2190 See <computeroutput><classname>proto::domain::as_child</classname><></computeroutput> 2191 for a complete description of the default behavior. 2192 </para> 2193 </description> 2194 <typedef name="type"> 2195 <type>typename Domain::template as_child< T >::result_type</type> 2196 </typedef> 2197 </struct> 2198 2199 <struct name="child"> 2200 <template> 2201 <template-type-parameter name="Expr"/> 2202 <template-type-parameter name="N"> 2203 <default>mpl::long_<0></default> 2204 </template-type-parameter> 2205 </template> 2206 <inherit><type><classname>proto::result_of::child_c</classname><Expr, N::value></type></inherit> 2207 <purpose>A metafunction that returns the type of the <replaceable>N</replaceable><superscript>th</superscript> 2208 child of a Proto expression, where N is an MPL Integral Constant. </purpose> 2209 <description> 2210 <para> 2211 <computeroutput>proto::result_of::child<Expr, N></computeroutput> is equivalent to 2212 <computeroutput><classname>proto::result_of::child_c</classname><Expr, N::value></computeroutput>. 2213 </para> 2214 </description> 2215 </struct> 2216 2217 <struct name="value"> 2218 <template> 2219 <template-type-parameter name="Expr"/> 2220 </template> 2221 <purpose>A metafunction that returns the type of the value of a terminal Proto expression. </purpose> 2222 <typedef name="value_type"> 2223 <description> 2224 <para> 2225 The raw type of the value as it is 2226 stored within <computeroutput>Expr</computeroutput>. This may be a value or a reference. 2227 </para> 2228 </description> 2229 <type>typename Expr::proto_child0</type> 2230 </typedef> 2231 <typedef name="type"> 2232 <description> 2233 <para> 2234 If <computeroutput>Expr</computeroutput> is not a reference type, <computeroutput>type</computeroutput> 2235 is computed as follows: 2236 <itemizedlist> 2237 <listitem> 2238 <para> 2239 <computeroutput>T const(&)[N]</computeroutput> becomes <computeroutput>T[N]</computeroutput> 2240 </para> 2241 </listitem> 2242 <listitem> 2243 <para> 2244 <computeroutput>T[N]</computeroutput> becomes <computeroutput>T[N]</computeroutput> 2245 </para> 2246 </listitem> 2247 <listitem> 2248 <para> 2249 <computeroutput>T(&)[N]</computeroutput> becomes <computeroutput>T[N]</computeroutput> 2250 </para> 2251 </listitem> 2252 <listitem> 2253 <para> 2254 <computeroutput>R(&)(A...)</computeroutput> becomes <computeroutput>R(&)(A...)</computeroutput> 2255 </para> 2256 </listitem> 2257 <listitem> 2258 <para> 2259 <computeroutput>T const &</computeroutput> becomes <computeroutput>T</computeroutput> 2260 </para> 2261 </listitem> 2262 <listitem> 2263 <para> 2264 <computeroutput>T &</computeroutput> becomes <computeroutput>T</computeroutput> 2265 </para> 2266 </listitem> 2267 <listitem> 2268 <para> 2269 <computeroutput>T</computeroutput> becomes <computeroutput>T</computeroutput> 2270 </para> 2271 </listitem> 2272 </itemizedlist> 2273 </para> 2274 <para> 2275 If <computeroutput>Expr</computeroutput> is a non-const reference type, <computeroutput>type</computeroutput> 2276 is computed as follows: 2277 <itemizedlist> 2278 <listitem> 2279 <para> 2280 <computeroutput>T const(&)[N]</computeroutput> becomes <computeroutput>T const(&)[N]</computeroutput> 2281 </para> 2282 </listitem> 2283 <listitem> 2284 <para> 2285 <computeroutput>T[N]</computeroutput> becomes <computeroutput>T(&)[N]</computeroutput> 2286 </para> 2287 </listitem> 2288 <listitem> 2289 <para> 2290 <computeroutput>T(&)[N]</computeroutput> becomes <computeroutput>T(&)[N]</computeroutput> 2291 </para> 2292 </listitem> 2293 <listitem> 2294 <para> 2295 <computeroutput>R(&)(A...)</computeroutput> becomes <computeroutput>R(&)(A...)</computeroutput> 2296 </para> 2297 </listitem> 2298 <listitem> 2299 <para> 2300 <computeroutput>T const &</computeroutput> becomes <computeroutput>T const &</computeroutput> 2301 </para> 2302 </listitem> 2303 <listitem> 2304 <para> 2305 <computeroutput>T &</computeroutput> becomes <computeroutput>T &</computeroutput> 2306 </para> 2307 </listitem> 2308 <listitem> 2309 <para> 2310 <computeroutput>T</computeroutput> becomes <computeroutput>T &</computeroutput> 2311 </para> 2312 </listitem> 2313 </itemizedlist> 2314 </para> 2315 <para> 2316 If <computeroutput>Expr</computeroutput> is a const reference type, <computeroutput>type</computeroutput> 2317 is computed as follows: 2318 <itemizedlist> 2319 <listitem> 2320 <para> 2321 <computeroutput>T const(&)[N]</computeroutput> becomes <computeroutput>T const(&)[N]</computeroutput> 2322 </para> 2323 </listitem> 2324 <listitem> 2325 <para> 2326 <computeroutput>T[N]</computeroutput> becomes <computeroutput>T const(&)[N]</computeroutput> 2327 </para> 2328 </listitem> 2329 <listitem> 2330 <para> 2331 <computeroutput>T(&)[N]</computeroutput> becomes <computeroutput>T(&)[N]</computeroutput> 2332 </para> 2333 </listitem> 2334 <listitem> 2335 <para> 2336 <computeroutput>R(&)(A...)</computeroutput> becomes <computeroutput>R(&)(A...)</computeroutput> 2337 </para> 2338 </listitem> 2339 <listitem> 2340 <para> 2341 <computeroutput>T const &</computeroutput> becomes <computeroutput>T const &</computeroutput> 2342 </para> 2343 </listitem> 2344 <listitem> 2345 <para> 2346 <computeroutput>T &</computeroutput> becomes <computeroutput>T &</computeroutput> 2347 </para> 2348 </listitem> 2349 <listitem> 2350 <para> 2351 <computeroutput>T</computeroutput> becomes <computeroutput>T const &</computeroutput> 2352 </para> 2353 </listitem> 2354 </itemizedlist> 2355 </para> 2356 </description> 2357 <type><replaceable>see-below</replaceable></type> 2358 </typedef> 2359 </struct> 2360 2361 <struct name="left"> 2362 <template> 2363 <template-type-parameter name="Expr"/> 2364 </template> 2365 <inherit>proto::result_of::child_c< Expr, 0 ></inherit> 2366 <purpose>A metafunction that returns the type of the left child of a binary Proto expression. </purpose> 2367 <description> 2368 <para> 2369 <computeroutput>proto::result_of::left<Expr></computeroutput> is equivalent to 2370 <computeroutput><classname>proto::result_of::child_c</classname><Expr, 0></computeroutput>. 2371 </para> 2372 </description> 2373 </struct> 2374 2375 <struct name="right"> 2376 <template> 2377 <template-type-parameter name="Expr"/> 2378 </template> 2379 <inherit>proto::result_of::child_c< Expr, 1 ></inherit> 2380 <purpose>A metafunction that returns the type of the right child of a binary Proto expression. </purpose> 2381 <description> 2382 <para> 2383 <computeroutput>proto::result_of::right<Expr></computeroutput> is equivalent to 2384 <computeroutput><classname>proto::result_of::child_c</classname><Expr, 1></computeroutput>. 2385 </para> 2386 </description> 2387 </struct> 2388 2389 <struct name="child_c"> 2390 <template> 2391 <template-type-parameter name="Expr"/> 2392 <template-nontype-parameter name="N"> 2393 <type>long</type> 2394 </template-nontype-parameter> 2395 </template> 2396 <purpose>A metafunction that returns the type of the <replaceable>N</replaceable><superscript>th</superscript> 2397 child of a Proto expression. </purpose> 2398 <description> 2399 <para> 2400 A metafunction that returns the type of the <replaceable>N</replaceable><superscript>th</superscript> 2401 child of a Proto expression. <computeroutput>N</computeroutput> must be 0 or less than 2402 <computeroutput>Expr::proto_arity::value</computeroutput>. 2403 </para> 2404 </description> 2405 <typedef name="value_type"> 2406 <description> 2407 <para> 2408 The raw type of the <replaceable>N</replaceable><superscript>th</superscript> child as it is stored 2409 within <computeroutput>Expr</computeroutput>. This may be a value or a reference. 2410 </para> 2411 </description> 2412 <type>typename Expr::proto_child0</type> 2413 </typedef> 2414 <typedef name="type"> 2415 <description> 2416 <para> 2417 If <computeroutput>Expr</computeroutput> is not a reference type, <computeroutput>type</computeroutput> 2418 is computed as follows: 2419 <itemizedlist> 2420 <listitem> 2421 <para> 2422 <computeroutput>T const &</computeroutput> becomes <computeroutput>T</computeroutput> 2423 </para> 2424 </listitem> 2425 <listitem> 2426 <para> 2427 <computeroutput>T &</computeroutput> becomes <computeroutput>T</computeroutput> 2428 </para> 2429 </listitem> 2430 <listitem> 2431 <para> 2432 <computeroutput>T</computeroutput> becomes <computeroutput>T</computeroutput> 2433 </para> 2434 </listitem> 2435 </itemizedlist> 2436 </para> 2437 <para> 2438 If <computeroutput>Expr</computeroutput> is a non-const reference type, <computeroutput>type</computeroutput> 2439 is computed as follows: 2440 <itemizedlist> 2441 <listitem> 2442 <para> 2443 <computeroutput>T const &</computeroutput> becomes <computeroutput>T const &</computeroutput> 2444 </para> 2445 </listitem> 2446 <listitem> 2447 <para> 2448 <computeroutput>T &</computeroutput> becomes <computeroutput>T &</computeroutput> 2449 </para> 2450 </listitem> 2451 <listitem> 2452 <para> 2453 <computeroutput>T</computeroutput> becomes <computeroutput>T &</computeroutput> 2454 </para> 2455 </listitem> 2456 </itemizedlist> 2457 </para> 2458 <para> 2459 If <computeroutput>Expr</computeroutput> is a const reference type, <computeroutput>type</computeroutput> 2460 is computed as follows: 2461 <itemizedlist> 2462 <listitem> 2463 <para> 2464 <computeroutput>T const &</computeroutput> becomes <computeroutput>T const &</computeroutput> 2465 </para> 2466 </listitem> 2467 <listitem> 2468 <para> 2469 <computeroutput>T &</computeroutput> becomes <computeroutput>T &</computeroutput> 2470 </para> 2471 </listitem> 2472 <listitem> 2473 <para> 2474 <computeroutput>T</computeroutput> becomes <computeroutput>T const &</computeroutput> 2475 </para> 2476 </listitem> 2477 </itemizedlist> 2478 </para> 2479 </description> 2480 <type><replaceable>see-below</replaceable></type> 2481 </typedef> 2482 </struct> 2483 2484 </namespace> 2485 2486 <overloaded-function name="as_expr"> 2487 <signature> 2488 <type>typename <classname>proto::result_of::as_expr</classname>< T >::type</type> 2489 <template> 2490 <template-type-parameter name="T"/> 2491 </template> 2492 <parameter name="t"> 2493 <paramtype>T &</paramtype> 2494 </parameter> 2495 </signature> 2496 <signature> 2497 <type>typename <classname>proto::result_of::as_expr</classname>< T const >::type</type> 2498 <template> 2499 <template-type-parameter name="T"/> 2500 </template> 2501 <parameter name="t"> 2502 <paramtype>T const &</paramtype> 2503 </parameter> 2504 </signature> 2505 <signature> 2506 <type>typename <classname>proto::result_of::as_expr</classname>< T, Domain >::type</type> 2507 <template> 2508 <template-type-parameter name="Domain"/> 2509 <template-type-parameter name="T"/> 2510 </template> 2511 <parameter name="t"> 2512 <paramtype>T &</paramtype> 2513 </parameter> 2514 </signature> 2515 <signature> 2516 <type>typename <classname>proto::result_of::as_expr</classname>< T const, Domain >::type</type> 2517 <template> 2518 <template-type-parameter name="Domain"/> 2519 <template-type-parameter name="T"/> 2520 </template> 2521 <parameter name="t"> 2522 <paramtype>T const &</paramtype> 2523 </parameter> 2524 </signature> 2525 <purpose>A function that wraps non-Proto expression types in Proto terminals and leaves Proto 2526 expression types alone.</purpose> 2527 <description> 2528 <para> 2529 The <computeroutput>proto::as_expr()</computeroutput> function returns Proto expression 2530 objects that are suitable for storage in a local variable. It turns non-Proto objects 2531 into Proto terminals. Its behavior is domain-specific. By default, 2532 non-Proto types are wrapped by value (if possible) in a new Proto terminal expression, 2533 and objects that are already Proto expressions are returned by value. 2534 </para> 2535 <para> 2536 If <computeroutput>Domain</computeroutput> is not explicitly specified, it is assumed to 2537 be <computeroutput><classname>proto::default_domain</classname></computeroutput>. 2538 </para> 2539 <para> 2540 See <computeroutput><classname>proto::domain::as_expr</classname><></computeroutput> 2541 for a complete description of this function's default behavior. 2542 </para> 2543 </description> 2544 <returns> 2545 <computeroutput>typename Domain::template as_expr< T >()(t)</computeroutput> 2546 </returns> 2547 </overloaded-function> 2548 2549 <overloaded-function name="as_child"> 2550 <signature> 2551 <type>typename <classname>proto::result_of::as_child</classname>< T >::type</type> 2552 <template> 2553 <template-type-parameter name="T"/> 2554 </template> 2555 <parameter name="t"> 2556 <paramtype>T &</paramtype> 2557 </parameter> 2558 </signature> 2559 <signature> 2560 <type>typename <classname>proto::result_of::as_child</classname>< T const >::type</type> 2561 <template> 2562 <template-type-parameter name="T"/> 2563 </template> 2564 <parameter name="t"> 2565 <paramtype>T const &</paramtype> 2566 </parameter> 2567 </signature> 2568 <signature> 2569 <type>typename <classname>proto::result_of::as_child</classname>< T, Domain >::type</type> 2570 <template> 2571 <template-type-parameter name="Domain"/> 2572 <template-type-parameter name="T"/> 2573 </template> 2574 <parameter name="t"> 2575 <paramtype>T &</paramtype> 2576 </parameter> 2577 </signature> 2578 <signature> 2579 <type>typename <classname>proto::result_of::as_child</classname>< T const, Domain >::type</type> 2580 <template> 2581 <template-type-parameter name="Domain"/> 2582 <template-type-parameter name="T"/> 2583 </template> 2584 <parameter name="t"> 2585 <paramtype>T const &</paramtype> 2586 </parameter> 2587 </signature> 2588 <purpose>A function that wraps non-Proto objects in Proto terminals (by reference) and leaves 2589 Proto expression types alone.</purpose> 2590 <description> 2591 <para> 2592 The <computeroutput>proto::as_child()</computeroutput> function returns Proto expression 2593 objects that are suitable for storage as child nodes in an expression tree. It turns 2594 non-Proto objects into Proto terminals. Its behavior is domain-specific. By default, 2595 non-Proto types are held wrapped by reference in a new Proto terminal expression, and 2596 objects that are already Proto expressions are simply returned by reference. 2597 </para> 2598 <para> 2599 If <computeroutput>Domain</computeroutput> is not explicitly specified, it is assumed to 2600 be <computeroutput><classname>proto::default_domain</classname></computeroutput>. 2601 </para> 2602 <para> 2603 See <computeroutput><classname>proto::domain::as_child</classname><></computeroutput> 2604 for a complete description of this function's default behavior. 2605 </para> 2606 </description> 2607 <returns> 2608 <computeroutput>typename Domain::template as_child< T >()(t)</computeroutput> 2609 </returns> 2610 </overloaded-function> 2611 2612 <overloaded-function name="child"> 2613 <signature> 2614 <type>typename <classname>proto::result_of::child</classname>< Expr &, N >::type</type> 2615 <template> 2616 <template-type-parameter name="N"/> 2617 <template-type-parameter name="Expr"/> 2618 </template> 2619 <parameter name="expr"> 2620 <paramtype>Expr &</paramtype> 2621 <description> 2622 <para>The Proto expression. </para> 2623 </description> 2624 </parameter> 2625 </signature> 2626 <signature> 2627 <type>typename <classname>proto::result_of::child</classname>< Expr const &, N >::type</type> 2628 <template> 2629 <template-type-parameter name="N"/> 2630 <template-type-parameter name="Expr"/> 2631 </template> 2632 <parameter name="expr"> 2633 <paramtype>Expr const &</paramtype> 2634 </parameter> 2635 </signature> 2636 <signature> 2637 <type>typename <classname>proto::result_of::child</classname>< Expr & >::type</type> 2638 <template> 2639 <template-type-parameter name="Expr"/> 2640 </template> 2641 <parameter name="expr"> 2642 <paramtype>Expr &</paramtype> 2643 </parameter> 2644 </signature> 2645 <signature> 2646 <type>typename <classname>proto::result_of::child</classname>< Expr const & >::type</type> 2647 <template> 2648 <template-type-parameter name="Expr"/> 2649 </template> 2650 <parameter name="expr"> 2651 <paramtype>Expr const &</paramtype> 2652 </parameter> 2653 </signature> 2654 <purpose>Return the <replaceable>N</replaceable><superscript>th</superscript> child of the specified Proto expression. </purpose> 2655 <description> 2656 <para> 2657 Return the <replaceable>N</replaceable><superscript>th</superscript> child of the specified Proto expression. 2658 If <computeroutput>N</computeroutput> is not specified, as in <computeroutput>proto::child(expr)</computeroutput>, 2659 then <computeroutput>N</computeroutput> is assumed to be <computeroutput>mpl::long_<0></computeroutput>. 2660 The child is returned by reference. 2661 </para> 2662 </description> 2663 <requires> 2664 <para> 2665 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 2666 <computeroutput>true</computeroutput>. 2667 </para> 2668 <para> 2669 <computeroutput>N</computeroutput> is an MPL Integral Constant. 2670 </para> 2671 <para> 2672 <computeroutput>N::value < Expr::proto_arity::value</computeroutput> 2673 </para> 2674 </requires> 2675 <returns> 2676 <para>A reference to the <replaceable>N</replaceable><superscript>th</superscript> child 2677 of <computeroutput>expr</computeroutput>.</para> 2678 </returns> 2679 <throws> 2680 <simpara>Will not throw.</simpara> 2681 </throws> 2682 </overloaded-function> 2683 2684 <overloaded-function name="child_c"> 2685 <signature> 2686 <type>typename <classname>proto::result_of::child_c</classname>< Expr &, N >::type</type> 2687 <template> 2688 <template-nontype-parameter name="N"> 2689 <type>long</type> 2690 </template-nontype-parameter> 2691 <template-type-parameter name="Expr"/> 2692 </template> 2693 <parameter name="expr"> 2694 <paramtype>Expr &</paramtype> 2695 </parameter> 2696 </signature> 2697 <signature> 2698 <type>typename <classname>proto::result_of::child_c</classname>< Expr const &, N >::type</type> 2699 <template> 2700 <template-nontype-parameter name="N"> 2701 <type>long</type> 2702 </template-nontype-parameter> 2703 <template-type-parameter name="Expr"/> 2704 </template> 2705 <parameter name="expr"> 2706 <paramtype>Expr const &</paramtype> 2707 </parameter> 2708 </signature> 2709 <purpose>Return the <replaceable>N</replaceable><superscript>th</superscript> child of the specified 2710 Proto expression. </purpose> 2711 <description> 2712 <para> 2713 Return the <replaceable>N</replaceable><superscript>th</superscript> child of the specified Proto 2714 expression. The child is returned by reference. 2715 </para> 2716 </description> 2717 <requires> 2718 <para> 2719 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 2720 <computeroutput>true</computeroutput>. 2721 </para> 2722 <para> 2723 <computeroutput>N < Expr::proto_arity::value</computeroutput> 2724 </para> 2725 </requires> 2726 <returns> 2727 <para>A reference to the <replaceable>N</replaceable><superscript>th</superscript> child 2728 of <computeroutput>expr</computeroutput>.</para> 2729 </returns> 2730 <throws> 2731 <simpara>Will not throw.</simpara> 2732 </throws> 2733 </overloaded-function> 2734 2735 <overloaded-function name="value"> 2736 <signature> 2737 <type>typename <classname>proto::result_of::value</classname>< Expr & >::type</type> 2738 <template> 2739 <template-type-parameter name="Expr"/> 2740 </template> 2741 <parameter name="expr"> 2742 <paramtype>Expr &</paramtype> 2743 </parameter> 2744 </signature> 2745 <signature> 2746 <type>typename <classname>proto::result_of::value</classname>< Expr const & >::type</type> 2747 <template> 2748 <template-type-parameter name="Expr"/> 2749 </template> 2750 <parameter name="expr"> 2751 <paramtype>Expr const &</paramtype> 2752 </parameter> 2753 </signature> 2754 <purpose>Return the value stored within the specified Proto terminal expression. </purpose> 2755 <description> 2756 <para> 2757 Return the the value stored within the specified Proto terminal expression. The value is 2758 returned by reference. 2759 </para> 2760 </description> 2761 <requires> 2762 <para> 2763 <computeroutput>0 == Expr::proto_arity::value</computeroutput> 2764 </para> 2765 </requires> 2766 <returns> 2767 <para>A reference to the terminal's value </para> 2768 </returns> 2769 <throws> 2770 <simpara>Will not throw.</simpara> 2771 </throws> 2772 </overloaded-function> 2773 2774 <overloaded-function name="left"> 2775 <signature> 2776 <type>typename <classname>proto::result_of::left</classname>< Expr & >::type</type> 2777 <template> 2778 <template-type-parameter name="Expr"/> 2779 </template> 2780 <parameter name="expr"> 2781 <paramtype>Expr &</paramtype> 2782 </parameter> 2783 </signature> 2784 <signature> 2785 <type>typename <classname>proto::result_of::left</classname>< Expr const & >::type</type> 2786 <template> 2787 <template-type-parameter name="Expr"/> 2788 </template> 2789 <parameter name="expr"> 2790 <paramtype>Expr const &</paramtype> 2791 </parameter> 2792 </signature> 2793 <purpose>Return the left child of the specified binary Proto expression. </purpose> 2794 <description> 2795 <para>Return the left child of the specified binary Proto expression. The child is returned by reference.</para> 2796 </description> 2797 <requires> 2798 <para> 2799 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 2800 <computeroutput>true</computeroutput>. 2801 </para> 2802 <para> 2803 <computeroutput>2 == Expr::proto_arity::value</computeroutput> 2804 </para> 2805 </requires> 2806 <returns> 2807 <para>A reference to the left child of <computeroutput>expr</computeroutput>. 2808 </para> 2809 </returns> 2810 <throws> 2811 <simpara>Will not throw.</simpara> 2812 </throws> 2813 </overloaded-function> 2814 2815 <overloaded-function name="right"> 2816 <signature> 2817 <type>typename <classname>proto::result_of::right</classname>< Expr & >::type</type> 2818 <template> 2819 <template-type-parameter name="Expr"/> 2820 </template> 2821 <parameter name="expr"> 2822 <paramtype>Expr &</paramtype> 2823 <description> 2824 <para>The Proto expression. </para> 2825 </description> 2826 </parameter> 2827 </signature> 2828 <signature> 2829 <type>typename <classname>proto::result_of::right</classname>< Expr const & >::type</type> 2830 <template> 2831 <template-type-parameter name="Expr"/> 2832 </template> 2833 <parameter name="expr"> 2834 <paramtype>Expr const &</paramtype> 2835 </parameter> 2836 </signature> 2837 <purpose>Return the right child of the specified binary Proto expression. </purpose> 2838 <description> 2839 <para>Return the right child of the specified binary Proto expression. The child is returned by reference.</para> 2840 </description> 2841 <requires> 2842 <para> 2843 <computeroutput><classname>proto::is_expr</classname><Expr>::value</computeroutput> is 2844 <computeroutput>true</computeroutput>. 2845 </para> 2846 <para> 2847 <computeroutput>2 == Expr::proto_arity::value</computeroutput> 2848 </para> 2849 </requires> 2850 <returns> 2851 <para> 2852 A reference to the right child of <computeroutput>expr</computeroutput>. 2853 </para> 2854 </returns> 2855 <throws> 2856 <simpara>Will not throw.</simpara> 2857 </throws> 2858 </overloaded-function> 2859 </namespace> 2860 </namespace> 2861</header> 2862