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/expr.hpp"> 10 <namespace name="boost"> 11 <namespace name="proto"> 12 13 <!-- boost::proto::basic_expr --> 14 15 <struct name="basic_expr"> 16 <template> 17 <template-type-parameter name="Tag"/> 18 <template-type-parameter name="Args"/> 19 <template-nontype-parameter name="Arity"> 20 <type>long</type> 21 <default>Args::arity</default> 22 </template-nontype-parameter> 23 </template> 24 25 <purpose>Simplified representation of a node in an expression tree.</purpose> 26 27 <description> 28 <para> 29 <computeroutput>proto::basic_expr<></computeroutput> is a node in an expression 30 template tree. It is a container for its child sub-trees. It also serves as the 31 terminal nodes of the tree. 32 </para> 33 <para> 34 <computeroutput>Tag</computeroutput> is type that represents the operation 35 encoded by this expression. It is typically one of the structs in the 36 <computeroutput>boost::proto::tag</computeroutput> namespace, but it doesn't 37 have to be. If <computeroutput>Arity</computeroutput> is 0 then this 38 <computeroutput>expr<></computeroutput> type represents a leaf in the 39 expression tree. 40 </para> 41 <para> 42 <computeroutput>Args</computeroutput> is a list of types representing 43 the children of this expression. It is an instantiation of one of 44 <computeroutput><classname alt="proto::listN">proto::list1<></classname></computeroutput>, 45 <computeroutput><classname alt="proto::listN">proto::list2<></classname></computeroutput>, 46 etc. The child types 47 must all themselves be either <computeroutput>proto::expr<></computeroutput> 48 or <computeroutput>proto::basic_expr<>&</computeroutput> (or extensions thereof via 49 <computeroutput><classname>proto::extends<></classname></computeroutput> or 50 <computeroutput><macroname>BOOST_PROTO_EXTENDS</macroname>()</computeroutput>), unless 51 <computeroutput>Arity</computeroutput> is 0, in which case 52 <computeroutput>Args</computeroutput> must be 53 <computeroutput>proto::term<T></computeroutput>, where 54 <computeroutput>T</computeroutput> can be any type. 55 </para> 56 <para> 57 <computeroutput>proto::basic_expr<></computeroutput> is a valid Fusion 58 random-access sequence, where the elements of the sequence are the child 59 expressions. 60 </para> 61 </description> 62 63 <!-- typedefs --> 64 65 <typedef name="proto_tag"> 66 <type>Tag</type> 67 </typedef> 68 69 <typedef name="proto_args"> 70 <type>Args</type> 71 </typedef> 72 73 <typedef name="proto_arity"> 74 <type>mpl::long_< Arity ></type> 75 </typedef> 76 77 <typedef name="proto_domain"> 78 <type><classname>proto::basic_default_domain</classname></type> 79 </typedef> 80 81 <typedef name="proto_grammar"> 82 <type>basic_expr</type> 83 </typedef> 84 85 <typedef name="proto_base_expr"> 86 <type>basic_expr</type> 87 </typedef> 88 89 <typedef name="proto_derived_expr"> 90 <type>basic_expr</type> 91 </typedef> 92 93 <typedef name="proto_childN"> 94 <type>typename Args::child<replaceable>N</replaceable></type> 95 <purpose>For each <replaceable>N</replaceable> in <replaceable>[0,max(Arity,1))</replaceable>.</purpose> 96 </typedef> 97 98 <method-group name="public static functions"> 99 100 <!-- make --> 101 <method name="make" specifiers="static"> 102 <type>basic_expr const</type> 103 <template> 104 <template-type-parameter name="A" pack="1"/> 105 </template> 106 <parameter name="a" pack="1"> 107 <paramtype>A const &</paramtype> 108 </parameter> 109 <requires> 110 <para> 111 The number of supplied arguments must be <computeroutput>max(Arity,1)</computeroutput>. 112 </para> 113 </requires> 114 <returns> 115 <para> 116 A new <computeroutput>basic_expr</computeroutput> object initialized with the specified arguments. 117 </para> 118 </returns> 119 </method> 120 121 </method-group> 122 123 <method-group name="public member functions"> 124 125 <method name="proto_base"> 126 <type>basic_expr &</type> 127 <returns> 128 <para> 129 <computeroutput>*this</computeroutput> 130 </para> 131 </returns> 132 </method> 133 134 <method name="proto_base" cv="const"> 135 <type>basic_expr const &</type> 136 <description> 137 <para> 138 This is an overloaded member function, provided for convenience. It differs from 139 the above function only in what argument(s) it accepts. 140 </para> 141 </description> 142 </method> 143 144 </method-group> 145 </struct> 146 147 <!-- boost::proto::expr --> 148 149 <struct name="expr"> 150 <template> 151 <template-type-parameter name="Tag"/> 152 <template-type-parameter name="Args"/> 153 <template-nontype-parameter name="Arity"> 154 <type>long</type> 155 <default>Args::arity</default> 156 </template-nontype-parameter> 157 </template> 158 159 <purpose>Representation of a node in an expression tree.</purpose> 160 161 <description> 162 <para> 163 <computeroutput>proto::expr<></computeroutput> is a node in an expression 164 template tree. It is a container for its child sub-trees. It also serves as the 165 terminal nodes of the tree. 166 </para> 167 <para> 168 <computeroutput>Tag</computeroutput> is type that represents the operation 169 encoded by this expression. It is typically one of the structs in the 170 <computeroutput>boost::proto::tag</computeroutput> namespace, but it doesn't 171 have to be. If <computeroutput>Arity</computeroutput> is 0 then this 172 <computeroutput>expr<></computeroutput> type represents a leaf in the 173 expression tree. 174 </para> 175 <para> 176 <computeroutput>Args</computeroutput> is a list of types representing 177 the children of this expression. It is an instantiation of one of 178 <computeroutput><classname alt="proto::listN">proto::list1<></classname></computeroutput>, 179 <computeroutput><classname alt="proto::listN">proto::list2<></classname></computeroutput>, 180 etc. The child types 181 must all themselves be either <computeroutput>proto::expr<></computeroutput> 182 or <computeroutput>proto::basic_expr<>&</computeroutput> (or extensions thereof via 183 <computeroutput><classname>proto::extends<></classname></computeroutput> or 184 <computeroutput><macroname>BOOST_PROTO_EXTENDS</macroname>()</computeroutput>), unless 185 <computeroutput>Arity</computeroutput> is 0, in which case 186 <computeroutput>Args</computeroutput> must be 187 <computeroutput>proto::term<T></computeroutput>, where 188 <computeroutput>T</computeroutput> can be any type. 189 </para> 190 <para> 191 <computeroutput>proto::expr<></computeroutput> is a valid Fusion 192 random-access sequence, where the elements of the sequence are the child 193 expressions. 194 </para> 195 </description> 196 197 <!-- typedefs --> 198 199 <typedef name="proto_tag"> 200 <type>Tag</type> 201 </typedef> 202 203 <typedef name="proto_args"> 204 <type>Args</type> 205 </typedef> 206 207 <typedef name="proto_arity"> 208 <type>mpl::long_< Arity ></type> 209 </typedef> 210 211 <typedef name="proto_domain"> 212 <type><classname>proto::default_domain</classname></type> 213 </typedef> 214 215 <typedef name="proto_grammar"> 216 <type><classname>proto::basic_expr</classname>< Tag, Args, Arity ></type> 217 </typedef> 218 219 <typedef name="proto_base_expr"> 220 <type>expr</type> 221 </typedef> 222 223 <typedef name="proto_derived_expr"> 224 <type>expr</type> 225 </typedef> 226 227 <typedef name="proto_childN"> 228 <type>typename Args::child<replaceable>N</replaceable></type> 229 <purpose>For each <replaceable>N</replaceable> in <replaceable>[0,max(Arity,1))</replaceable>.</purpose> 230 </typedef> 231 232 <struct name="result"> 233 <template> 234 <template-type-parameter name="Signature"/> 235 </template> 236 <description> 237 <para> 238 Encodes the return type of <computeroutput><classname>proto::expr<></classname>::operator()</computeroutput>. 239 Makes <computeroutput><classname>proto::expr<></classname></computeroutput> a TR1-style function object type 240 usable with <computeroutput>boost::result_of<></computeroutput> 241 </para> 242 </description> 243 <typedef name="type"> 244 <type><replaceable>unspecified</replaceable></type> 245 </typedef> 246 </struct> 247 248 <method-group name="public static functions"> 249 250 <!-- make --> 251 <method name="make" specifiers="static"> 252 <type>expr const</type> 253 <template> 254 <template-type-parameter name="A" pack="1"/> 255 </template> 256 <parameter name="a" pack="1"> 257 <paramtype>A const &</paramtype> 258 </parameter> 259 <requires> 260 <para> 261 The number of supplied arguments must be <computeroutput>max(Arity,1)</computeroutput>. 262 </para> 263 </requires> 264 <returns> 265 <para> 266 A new <computeroutput>expr</computeroutput> object initialized with the specified arguments. 267 </para> 268 </returns> 269 </method> 270 271 </method-group> 272 273 <method-group name="public member functions"> 274 275 <method name="proto_base"> 276 <type>expr &</type> 277 <returns><para><computeroutput>*this</computeroutput></para></returns> 278 </method> 279 280 <method name="proto_base" cv="const"> 281 <type>expr const &</type> 282 <description> 283 <para>This is an overloaded member function, provided for convenience. It differs from 284 the above function only in what argument(s) it accepts.</para> 285 </description> 286 </method> 287 288 <!-- operator= --> 289 <method name="operator="> 290 <type><replaceable>unspecified</replaceable></type> 291 <template> 292 <template-type-parameter name="A"/> 293 </template> 294 <parameter name="a"> 295 <paramtype>A &</paramtype> 296 </parameter> 297 <description> 298 <para>Lazy assignment expression</para> 299 </description> 300 <returns> 301 <para>A new expression node representing the assignment operation.</para> 302 </returns> 303 </method> 304 305 <method name="operator="> 306 <type><replaceable>unspecified</replaceable></type> 307 <template> 308 <template-type-parameter name="A"/> 309 </template> 310 <parameter name="a"> 311 <paramtype>A const &</paramtype> 312 </parameter> 313 <description> 314 <para> 315 This is an overloaded member function, provided for convenience. It differs from 316 the above function only in what argument(s) it accepts. 317 </para> 318 </description> 319 </method> 320 321 <method name="operator=" cv="const"> 322 <type><replaceable>unspecified</replaceable></type> 323 <template> 324 <template-type-parameter name="A"/> 325 </template> 326 <parameter name="a"> 327 <paramtype>A &</paramtype> 328 </parameter> 329 <description> 330 <para> 331 This is an overloaded member function, provided for convenience. It differs from 332 the above function only in what argument(s) it accepts. 333 </para> 334 </description> 335 </method> 336 337 <method name="operator=" cv="const"> 338 <type><replaceable>unspecified</replaceable></type> 339 <template> 340 <template-type-parameter name="A"/> 341 </template> 342 <parameter name="a"> 343 <paramtype>A const &</paramtype> 344 </parameter> 345 <description> 346 <para> 347 This is an overloaded member function, provided for convenience. It differs from 348 the above function only in what argument(s) it accepts. 349 </para> 350 </description> 351 </method> 352 353 <!-- operator[] --> 354 <method name="operator[]"> 355 <type><replaceable>unspecified</replaceable></type> 356 <template> 357 <template-type-parameter name="A"/> 358 </template> 359 <parameter name="a"> 360 <paramtype>A &</paramtype> 361 </parameter> 362 <description> 363 <para>Lazy subscript expression</para> 364 </description> 365 <returns> 366 <para>A new expression node representing the subscript operation.</para> 367 </returns> 368 </method> 369 370 <method name="operator[]"> 371 <type><replaceable>unspecified</replaceable></type> 372 <template> 373 <template-type-parameter name="A"/> 374 </template> 375 <parameter name="a"> 376 <paramtype>A const &</paramtype> 377 </parameter> 378 <description> 379 <para> 380 This is an overloaded member function, provided for convenience. It differs from 381 the above function only in what argument(s) it accepts. 382 </para> 383 </description> 384 </method> 385 386 <method name="operator[]" cv="const"> 387 <type><replaceable>unspecified</replaceable></type> 388 <template> 389 <template-type-parameter name="A"/> 390 </template> 391 <parameter name="a"> 392 <paramtype>A &</paramtype> 393 </parameter> 394 <description> 395 <para> 396 This is an overloaded member function, provided for convenience. It differs from 397 the above function only in what argument(s) it accepts. 398 </para> 399 </description> 400 </method> 401 402 <method name="operator[]" cv="const"> 403 <type><replaceable>unspecified</replaceable></type> 404 <template> 405 <template-type-parameter name="A"/> 406 </template> 407 <parameter name="a"> 408 <paramtype>A const &</paramtype> 409 </parameter> 410 <description> 411 <para> 412 This is an overloaded member function, provided for convenience. It differs from 413 the above function only in what argument(s) it accepts. 414 </para> 415 </description> 416 </method> 417 418 <!-- operator() --> 419 <method name="operator()"> 420 <type><replaceable>unspecified</replaceable></type> 421 <template> 422 <template-type-parameter name="A" pack="1"/> 423 </template> 424 <parameter name="a" pack="1"> 425 <paramtype>A const &</paramtype> 426 </parameter> 427 <description> 428 <para>Lazy function call</para> 429 </description> 430 <returns> 431 <para>A new expression node representing the function call operation.</para> 432 </returns> 433 </method> 434 435 <method name="operator()" cv="const"> 436 <type><replaceable>unspecified</replaceable></type> 437 <template> 438 <template-type-parameter name="A" pack="1"/> 439 </template> 440 <parameter name="a" pack="1"> 441 <paramtype>A const &</paramtype> 442 </parameter> 443 <description> 444 <para> 445 This is an overloaded member function, provided for convenience. It differs from 446 the above function only in what argument(s) it accepts. 447 </para> 448 </description> 449 </method> 450 451 </method-group> 452 453 <data-member name="childN"> 454 <type>proto_child<replaceable>N</replaceable></type> 455 <purpose>For each <replaceable>N</replaceable> in <replaceable>[0,max(Arity,1))</replaceable>.</purpose> 456 </data-member> 457 458 <data-member name="proto_arity_c" specifiers="static"> 459 <type>const long</type> 460 <purpose> 461 <computeroutput>= Arity;</computeroutput> 462 </purpose> 463 </data-member> 464 465 </struct> 466 467 <!-- proto::unexpr --> 468 <struct name="unexpr"> 469 <template> 470 <template-type-parameter name="Expr"/> 471 </template> 472 <purpose>Lets you inherit the interface of an expression while hiding from Proto the fact that 473 the type is a Proto expression.</purpose> 474 <inherit><type>Expr</type></inherit> 475 <method-group name="public member functions"/> 476 <constructor> 477 <parameter name="expr"> 478 <paramtype>Expr const &</paramtype> 479 </parameter> 480 </constructor> 481 <description> 482 <para> 483 For an expression type <computeroutput>E</computeroutput>, 484 <computeroutput> 485 <classname>proto::is_expr</classname><E>::value 486 </computeroutput> is <computeroutput>true</computeroutput>, but 487 <computeroutput> 488 <classname>proto::is_expr</classname><proto::unexpr<E> >::value 489 </computeroutput> is <computeroutput>false</computeroutput>. 490 </para> 491 </description> 492 </struct> 493 494 </namespace> 495 </namespace> 496</header> 497