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/transform/env.hpp"> 10 <namespace name="boost"> 11 <namespace name="proto"> 12 13 <struct name="key_not_found"> 14 <purpose> 15 The type of objects returned when a key-based lookup fails in a 16 transform environment. 17 </purpose> 18 </struct> 19 20 <!-- empty_env --> 21 <struct name="empty_env"> 22 <purpose> 23 The type of an object that represents a transform environment 24 with no key/value pairs in it. 25 </purpose> 26 27 <method-group name="public member functions"> 28 <method name="operator[]" cv="const"> 29 <type><classname>proto::key_not_found</classname></type> 30 <parameter name=""> 31 <paramtype><replaceable>unspecified</replaceable></paramtype> 32 </parameter> 33 <description> 34 <para>The type of the argument to this function has a 35 user-defined implicit conversion from any type.</para> 36 </description> 37 </method> 38 </method-group> 39 </struct> 40 41 <!-- env --> 42 <struct name="env"> 43 <template> 44 <template-type-parameter name="Key"/> 45 <template-type-parameter name="Value"/> 46 <template-type-parameter name="Env"> 47 <default><classname>proto::empty_env</classname></default> 48 </template-type-parameter> 49 </template> 50 51 <constructor specifiers="explicit"> 52 <parameter name="value"> 53 <paramtype>Value const &</paramtype> 54 <description> 55 <para> 56 The value to be associated with the <code>Key</code>. 57 </para> 58 </description> 59 </parameter> 60 <parameter name="other"> 61 <paramtype>Env const &</paramtype> 62 <default>Env()</default> 63 <description> 64 <para> 65 Another key/value store. 66 </para> 67 </description> 68 </parameter> 69 </constructor> 70 71 <method-group name="public member functions"> 72 <method name="operator[]" cv="const"> 73 <type><replaceable>see-below</replaceable></type> 74 <parameter name=""> 75 <paramtype><replaceable>see-below</replaceable></paramtype> 76 </parameter> 77 <description> 78 <para> 79 If called with an object that is implicitly convertible to type <code>Key</code>, 80 this function returns the <code>Value</code> passed to the constructor. Otherwise, it returns 81 the result of calling <code>operator[]</code> on the <code>Env</code> passed to 82 the constructor. 83 </para> 84 </description> 85 </method> 86 </method-group> 87 </struct> 88 89 <!-- is_env --> 90 <struct name="is_env"> 91 <template> 92 <template-type-parameter name="T"/> 93 </template> 94 <inherit><type>mpl::bool_<<replaceable>true-or-false</replaceable>></type></inherit> 95 <purpose> 96 <para>A Boolean metafuntion for determining whether or not a type is a Proto 97 transform environment.</para> 98 </purpose> 99 <description> 100 <para><code>is_env<T></code> inherits from <code>mpl::true_</code> under the following 101 conditions: 102 <itemizedlist> 103 <listitem>If <code>T</code> is <classname>proto::empty_env</classname>.</listitem> 104 <listitem>If <code>T</code> is a specialization of <classname>proto::env<></classname>.</listitem> 105 <listitem>If <code>T</code> is derived from any of the above.</listitem> 106 <listitem>If <code>T</code> is a cv-qualified variant of any of the above.</listitem> 107 <listitem>If <code>T</code> is a reference to any of the above.</listitem> 108 </itemizedlist> 109 </para> 110 <para>Otherwise, <code>is_env<T></code> inherits from <code>mpl::false_</code>. 111 </para> 112 </description> 113 </struct> 114 115 <struct name="data_type"> 116 <purpose> 117 The type of <code><globalname>proto::data</globalname></code>, a key for use when creating 118 a transform environment that associates a piece of data with this type. 119 </purpose> 120 <description> 121 <para> 122 The <code>proto::data_type</code> type, along with the <code><globalname>proto::data</globalname></code> 123 global, are declared using the <code><macroname>BOOST_PROTO_DEFINE_ENV_VAR</macroname>()</code> macro. 124 </para> 125 </description> 126 <method-group name="public member functions"> 127 <overloaded-method name="operator="> 128 <signature cv="const"> 129 <template> 130 <template-type-parameter name="Value"/> 131 </template> 132 <type><classname>env</classname><data_type, <replaceable>see-below</replaceable>></type> 133 <parameter name="value"> 134 <paramtype>Value &</paramtype> 135 </parameter> 136 </signature> 137 <signature cv="const"> 138 <template> 139 <template-type-parameter name="Value"/> 140 </template> 141 <type><classname>env</classname><data_type, <replaceable>see-below</replaceable>></type> 142 <parameter name="value"> 143 <paramtype>Value const &</paramtype> 144 </parameter> 145 </signature> 146 <description> 147 <para> 148 If <code>Value</code> is a specialization <code>boost::reference_wrapper<T></code>, 149 this function returns <code><classname>env</classname><data_type, T &>(value.get())</code>. 150 </para> 151 <para> 152 Else, if the type <code>Value</code> is non-copyable (i.e., a function, an array, abstract, or an ostream), 153 this function returns <code><classname>env</classname><data_type, Value <replaceable>cv</replaceable> &>(value)</code>, 154 where <code><replaceable>cv</replaceable></code> is <code>const</code> for the second overload, and empty 155 for the first. 156 </para> 157 <para> 158 Otherwise, this function returns <code><classname>env</classname><data_type, Value>(value)</code>. 159 </para> 160 </description> 161 </overloaded-method> 162 </method-group> 163 </struct> 164 165 <data-member name="data"> 166 <description> 167 <para>A key used for creating a transform environment.</para> 168 </description> 169 <type><classname>proto::data_type</classname> const</type> 170 </data-member> 171 172 <namespace name="functional"> 173 174 <!-- functional::as_env --> 175 <struct name="as_env"> 176 <inherit><classname>proto::callable</classname></inherit> 177 <purpose> 178 A unary <conceptname>PolymorphicFunctionObject</conceptname> for ensuring that an object 179 is a transform environment. If it isn't already, it is turned into one such that the 180 object is associated with the <classname>proto::data_type</classname> key. 181 </purpose> 182 <struct name="result"> 183 <template> 184 <template-type-parameter name="Sig"/> 185 </template> 186 <typedef name="type"> 187 <type><replaceable>see-below</replaceable></type> 188 <description> 189 <para>See <code><methodname>proto::functional::as_env::operator()</methodname></code>.</para> 190 </description> 191 </typedef> 192 <description> 193 <para> 194 Encodes the return type of <code><methodname>proto::functional::as_env::operator()</methodname></code>. 195 The presence of this member template makes <code><classname>proto::functional::as_env</classname></code> 196 a valid TR1-style function object type usable with <code>boost::result_of<></code>. 197 </para> 198 </description> 199 </struct> 200 <method-group name="public member functions"> 201 <overloaded-method name="operator()"> 202 <signature cv="const"> 203 <template> 204 <template-type-parameter name="T"/> 205 </template> 206 <type><replaceable>see-below</replaceable></type> 207 <parameter name="t"> 208 <paramtype>T &</paramtype> 209 </parameter> 210 </signature> 211 <signature cv="const"> 212 <template> 213 <template-type-parameter name="T"/> 214 </template> 215 <type><replaceable>see-below</replaceable></type> 216 <parameter name="t"> 217 <paramtype>T const &</paramtype> 218 </parameter> 219 </signature> 220 <description> 221 <para> 222 If <code><classname>proto::is_env</classname><T>::value</code> is <code>false</code>, 223 this function returns the result of <code>(<globalname>proto::data</globalname> = t)</code>. 224 See <code><methodname>proto::data_type::operator=</methodname></code> for details. 225 </para> 226 <para> 227 Otherwise, this function returns <code>t</code> by reference. 228 </para> 229 </description> 230 </overloaded-method> 231 </method-group> 232 </struct> 233 234 <!-- functional::has_env_var --> 235 <struct name="has_env_var"> 236 <inherit><classname>proto::callable</classname></inherit> 237 <template> 238 <template-type-parameter name="Key"/> 239 </template> 240 <purpose> 241 A unary boolean <conceptname>PolymorphicFunctionObject</conceptname> used for determining whether a particular 242 transform environment has a value associated with a particular key. 243 </purpose> 244 <struct name="result"> 245 <template> 246 <template-type-parameter name="Sig"/> 247 </template> 248 <typedef name="type"> 249 <type><replaceable>see-below</replaceable></type> 250 <description> 251 <para>See <code><methodname>proto::functional::has_env_var::operator()</methodname></code>.</para> 252 </description> 253 </typedef> 254 <description> 255 <para> 256 Encodes the return type of <code><methodname>proto::functional::has_env_var::operator()</methodname></code>. 257 The presence of this member template makes <code><classname>proto::functional::has_env_var</classname></code> 258 a valid TR1-style function object type usable with <code>boost::result_of<></code>. 259 </para> 260 </description> 261 </struct> 262 <method-group name="public member functions"> 263 <method name="operator()" cv="const"> 264 <template> 265 <template-type-parameter name="Env"/> 266 </template> 267 <type><replaceable>see-below</replaceable></type> 268 <parameter name="e"> 269 <paramtype>Env const &</paramtype> 270 </parameter> 271 <description> 272 <para> 273 This function behaves as follows: 274 <itemizedlist> 275 <listitem> 276 If <code><classname>proto::is_env</classname><Env>::value</code> is <code>true</code>: 277 <itemizedlist> 278 <listitem> 279 If <code>e[Key()]</code> returns an instance of 280 <code><classname>proto::key_not_found</classname></code>, return 281 <code>mpl::false_</code>. See <code><methodname>proto::env::operator[]</methodname></code> 282 for more information. 283 </listitem> 284 <listitem> 285 Otherwise, return <code>mpl::true_</code>. 286 </listitem> 287 </itemizedlist> 288 </listitem> 289 <listitem> 290 Otherwise: 291 <itemizedlist> 292 <listitem> 293 If <code>Key</code> is <code><classname>proto::data_type</classname></code>, 294 return <code>mpl::true_</code>. 295 </listitem> 296 <listitem> 297 Otherwise, return <code>mpl::false_</code>. 298 </listitem> 299 </itemizedlist> 300 </listitem> 301 </itemizedlist> 302 </para> 303 </description> 304 </method> 305 </method-group> 306 </struct> 307 308 <!-- functional::env_var --> 309 <struct name="env_var"> 310 <inherit><classname>proto::callable</classname></inherit> 311 <template> 312 <template-type-parameter name="Key"/> 313 </template> 314 <purpose> 315 A unary <conceptname>PolymorphicFunctionObject</conceptname> used for fetching the value 316 associated with a particular key in a transform environment. 317 </purpose> 318 <struct name="result"> 319 <template> 320 <template-type-parameter name="Sig"/> 321 </template> 322 <typedef name="type"> 323 <type><replaceable>see-below</replaceable></type> 324 <description> 325 <para>See <code><methodname>proto::functional::env_var::operator()</methodname></code>.</para> 326 </description> 327 </typedef> 328 <description> 329 <para> 330 Encodes the return type of <code><methodname>proto::functional::env_var::operator()</methodname></code>. 331 The presence of this member template makes <code><classname>proto::functional::env_var</classname></code> 332 a valid TR1-style function object type usable with <code>boost::result_of<></code>. 333 </para> 334 </description> 335 </struct> 336 <method-group name="public member functions"> 337 <method name="operator()" cv="const"> 338 <template> 339 <template-type-parameter name="Env"/> 340 </template> 341 <type><replaceable>see-below</replaceable></type> 342 <parameter name="e"> 343 <paramtype>Env const &</paramtype> 344 </parameter> 345 <description> 346 <para> 347 This function behaves as follows: 348 <itemizedlist> 349 <listitem> 350 If <code>Key</code> is <code><classname>proto::data_type</classname></code>: 351 <itemizedlist> 352 <listitem> 353 If <code><classname>proto::is_env</classname><Env>::value</code> is <code>true</code>, 354 return <code>e[<globalname>proto::data</globalname>]</code>. 355 </listitem> 356 <listitem> 357 Otherwise, return <code>e</code>. 358 </listitem> 359 </itemizedlist> 360 </listitem> 361 <listitem> 362 Otherwise, return <code>e[Key()]</code>. 363 </listitem> 364 </itemizedlist> 365 </para> 366 <para> 367 See <code><methodname>proto::env::operator[]</methodname></code> for additional information. 368 </para> 369 </description> 370 </method> 371 </method-group> 372 </struct> 373 374 </namespace> 375 376 <namespace name="result_of"> 377 <struct name="as_env"> 378 <template> 379 <template-type-parameter name="T"/> 380 </template> 381 <inherit><type>boost::result_of<<classname>proto::functional::as_env</classname>(T)></type></inherit> 382 <purpose> 383 Metafunction for computing the return type of <code><functionname>proto::as_env()</functionname></code>. 384 </purpose> 385 </struct> 386 <struct name="has_env_var"> 387 <template> 388 <template-type-parameter name="Env"/> 389 <template-type-parameter name="Key"/> 390 </template> 391 <inherit><type>boost::result_of<<classname>proto::functional::has_env_var</classname><Key>(Env)>::type</type></inherit> 392 <purpose> 393 Metafunction for computing the return type of <code><functionname>proto::has_env_var()</functionname></code>. 394 </purpose> 395 </struct> 396 <struct name="env_var"> 397 <template> 398 <template-type-parameter name="Env"/> 399 <template-type-parameter name="Key"/> 400 </template> 401 <inherit><type>boost::result_of<<classname>proto::functional::env_var</classname><Key>(Env)></type></inherit> 402 <purpose> 403 Metafunction for computing the return type of <code><functionname>proto::env_var()</functionname></code>. 404 </purpose> 405 </struct> 406 </namespace> 407 408 <!-- proto::as_env --> 409 <overloaded-function name="as_env"> 410 <signature> 411 <template> 412 <template-type-parameter name="T"/> 413 </template> 414 <type>typename <classname>proto::result_of::as_env</classname><T &>::type</type> 415 <parameter name="t"> 416 <paramtype>T &</paramtype> 417 </parameter> 418 </signature> 419 <signature> 420 <template> 421 <template-type-parameter name="T"/> 422 </template> 423 <type>typename <classname>proto::result_of::as_env</classname><T const &>::type</type> 424 <parameter name="t"> 425 <paramtype>T const &</paramtype> 426 </parameter> 427 </signature> 428 <purpose> 429 For ensuring that the given argument is a transform environment. If it is not already, 430 it is made one as if by <code>(<globalname>proto::data</globalname> = t)</code>. 431 </purpose> 432 <description> 433 <para> 434 See also: 435 <itemizedlist> 436 <listitem> 437 <code><methodname>proto::data_type::operator=</methodname></code> 438 </listitem> 439 <listitem> 440 <code><methodname>proto::functional::as_env::operator()</methodname></code> 441 </listitem> 442 </itemizedlist> 443 </para> 444 </description> 445 <returns><code><classname>proto::functional::as_env</classname>()(t)</code></returns> 446 </overloaded-function> 447 448 <!-- proto::has_env_var --> 449 <overloaded-function name="has_env_var"> 450 <signature> 451 <template> 452 <template-type-parameter name="Key"/> 453 <template-type-parameter name="Env"/> 454 </template> 455 <type>typename <classname>proto::result_of::has_env_var</classname><Env &, Key>::type</type> 456 <parameter name="e"> 457 <paramtype>Env &</paramtype> 458 </parameter> 459 </signature> 460 <signature> 461 <template> 462 <template-type-parameter name="Key"/> 463 <template-type-parameter name="Env"/> 464 </template> 465 <type>typename <classname>proto::result_of::has_env_var</classname><Env const &, Key>::type</type> 466 <parameter name="e"> 467 <paramtype>Env const &</paramtype> 468 </parameter> 469 </signature> 470 <purpose> 471 For testing to see whether a value exists in a transform environment corresponding to the 472 specified <code>Key</code>. 473 </purpose> 474 <description> 475 <para> 476 See also: 477 <itemizedlist> 478 <listitem> 479 <code><methodname>proto::functional::has_env_var::operator()</methodname></code> 480 </listitem> 481 </itemizedlist> 482 </para> 483 </description> 484 <returns><code><classname>proto::functional::has_env_var<Key></classname>()(e)</code></returns> 485 </overloaded-function> 486 487 <!-- proto::env_var --> 488 <overloaded-function name="env_var"> 489 <signature> 490 <template> 491 <template-type-parameter name="Key"/> 492 <template-type-parameter name="Env"/> 493 </template> 494 <type>typename <classname>proto::result_of::env_var</classname><Env &, Key>::type</type> 495 <parameter name="e"> 496 <paramtype>Env &</paramtype> 497 </parameter> 498 </signature> 499 <signature> 500 <template> 501 <template-type-parameter name="Key"/> 502 <template-type-parameter name="Env"/> 503 </template> 504 <type>typename <classname>proto::result_of::env_var</classname><Env const &, Key>::type</type> 505 <parameter name="e"> 506 <paramtype>Env const &</paramtype> 507 </parameter> 508 </signature> 509 <purpose> 510 For fetching the value from a transform environment corresponding to the 511 specified <code>Key</code>. 512 </purpose> 513 <description> 514 <para> 515 See also: 516 <itemizedlist> 517 <listitem> 518 <code><methodname>proto::functional::env_var::operator()</methodname></code> 519 </listitem> 520 </itemizedlist> 521 </para> 522 </description> 523 <returns><code><classname>proto::functional::env_var<Key></classname>()(e)</code></returns> 524 </overloaded-function> 525 526 <!-- proto::operator, --> 527 <overloaded-function name="operator,"> 528 <signature> 529 <template> 530 <template-type-parameter name="Env"/> 531 <template-type-parameter name="Key"/> 532 <template-type-parameter name="Value"/> 533 </template> 534 <type><classname>proto::env</classname><Key, Value, <replaceable>UNCVREF</replaceable>(typename <classname>proto::result_of::as_env</classname><Env &>::type)></type> 535 <parameter name="other"> 536 <paramtype>Env &</paramtype> 537 </parameter> 538 <parameter name="head"> 539 <paramtype><classname>proto::env</classname><Key, Value> const &</paramtype> 540 </parameter> 541 </signature> 542 <signature> 543 <template> 544 <template-type-parameter name="Env"/> 545 <template-type-parameter name="Key"/> 546 <template-type-parameter name="Value"/> 547 </template> 548 <type><classname>proto::env</classname><Key, Value, <replaceable>UNCVREF</replaceable>(typename <classname>proto::result_of::as_env</classname><Env const &>::type)></type> 549 <parameter name="other"> 550 <paramtype>Env const &</paramtype> 551 </parameter> 552 <parameter name="head"> 553 <paramtype><classname>proto::env</classname><Key, Value> const &</paramtype> 554 </parameter> 555 </signature> 556 <purpose> 557 For composing a larger transform environment from two smaller ones. 558 </purpose> 559 <description> 560 <para> 561 The effect of this function is to take two transform environments and compose them into 562 a larger environment that contains the key/values pairs of the two. The first argument 563 is allowed to not be a transform environment, in which case it is turned into one with 564 the <functionname>proto::as_env()</functionname> function before composition with the 565 second argument. The second argument is required to be a transform environment with exactly 566 one key/value pair. 567 </para> 568 <para> 569 <emphasis role="bold">Example:</emphasis> 570 </para> 571 <para> 572 Given user-defined keys <code>key0</code> and <code>key1</code> of types <code>key0_type</code> 573 and <code>key1_type</code>, the following code demonstrates how the chained use of <code>operator,</code> 574 can build a composite transform environment containing a number of key/value pairs: 575 <programlisting><classname>proto::env</classname>< 576 key1_type 577 , int 578 , <classname>proto::env</classname>< 579 key0_type 580 , char const (&)[6] 581 , <classname>proto::env</classname><<classname>proto::data_type</classname>, int> 582 > 583> myenv = (<globalname>proto::data</globalname> = 1, key0 = "hello", key1 = 42); 584// NOTE: operator, here --^ and here --^ 585 586// Check the results: 587assert(1 == myenv[proto::data]); 588assert(0 == std::strcmp(myenv[key0], "hello")); 589assert(42 == myenv[key1]);</programlisting> 590 </para> 591 <para> 592 <emphasis role="bold">Note:</emphasis> In the return type and the "Returns" clause, <code><replaceable>UNCVREF</replaceable>(X)</code> is 593 the type <code>X</code> stripped of top-level reference and cv-qualifiers. 594 </para> 595 <para> 596 <emphasis role="bold">Note:</emphasis> In the "Returns" clause, <code><replaceable>cv</replaceable></code> is replaced with <code>const</code> 597 for the second overload, and nothing for the first. 598 </para> 599 <para> 600 <emphasis role="bold">See also:</emphasis> 601 <itemizedlist> 602 <listitem> 603 <code><methodname>proto::env::operator[]</methodname></code> 604 </listitem> 605 </itemizedlist> 606 </para> 607 </description> 608 <returns><code><classname>proto::env</classname><Key, Value, <replaceable>UNCVREF</replaceable>(typename <classname>proto::result_of::as_env</classname><Env <replaceable>cv</replaceable> &>::type)>(head[Key()], <functionname>proto::as_env</functionname>(other))</code></returns> 609 </overloaded-function> 610 611 <!-- struct _env_var --> 612 <struct name="_env_var"> 613 <template> 614 <template-type-parameter name="Key"/> 615 </template> 616 <purpose> 617 A primitive transform that returns the value associated with a particular <code>Key</code> 618 in the current transform environment. 619 </purpose> 620 <inherit> 621 <type><classname>proto::transform</classname><_env_var<Key> ></type> 622 </inherit> 623 <struct name="impl"> 624 <template> 625 <template-type-name name="Expr"/> 626 <template-type-name name="State"/> 627 <template-type-name name="Data"/> 628 </template> 629 <inherit> 630 <type><classname>proto::transform_impl</classname><Expr, State, Data> ></type> 631 </inherit> 632 <typedef name="result_type"> 633 <type>typename <classname>proto::result_of::env_var</classname><Data, Key>::type</type> 634 </typedef> 635 <method-group name="public member functions"> 636 <method name="operator()" cv="const"> 637 <type>result_type</type> 638 <parameter name=""> 639 <paramtype>typename impl::expr_param</paramtype> 640 </parameter> 641 <parameter name=""> 642 <paramtype>typename impl::state_param</paramtype> 643 </parameter> 644 <parameter name="data"> 645 <paramtype>typename impl::data_param</paramtype> 646 <description> 647 <para>The current transform environment</para> 648 </description> 649 </parameter> 650 <description> 651 <para> 652 Fetches the value associated with <code>Key</code> from the transform environment 653 passed in the data (third) parameter. 654 </para> 655 </description> 656 <requires> 657 <para> 658 <code><classname>proto::is_env</classname><Data>::value</code> 659 is <code>true</code>. 660 </para> 661 </requires> 662 <returns> 663 <para> 664 <code><functionname>proto::env_var</functionname>(data)</code> 665 </para> 666 </returns> 667 </method> 668 </method-group> 669 </struct> 670 <description> 671 <para> 672 See <code><classname>proto::_env_var::impl</classname></code> for the full details. 673 </para> 674 </description> 675 </struct> 676 677 <!-- struct _env --> 678 <struct name="_env"> 679 <purpose> 680 A primitive transform that returns the current transform environment unmodified. 681 </purpose> 682 <inherit> 683 <type><classname>proto::transform</classname><_env></type> 684 </inherit> 685 <struct name="impl"> 686 <template> 687 <template-type-name name="Expr"/> 688 <template-type-name name="State"/> 689 <template-type-name name="Data"/> 690 </template> 691 <inherit> 692 <type><classname>proto::transform_impl</classname><Expr, State, Data></type> 693 </inherit> 694 <typedef name="result_type"> 695 <type>Data</type> 696 </typedef> 697 <method-group name="public member functions"> 698 <method name="operator()" cv="const"> 699 <type>result_type</type> 700 <parameter name=""> 701 <paramtype>typename impl::expr_param</paramtype> 702 </parameter> 703 <parameter name=""> 704 <paramtype>typename impl::state_param</paramtype> 705 </parameter> 706 <parameter name="data"> 707 <paramtype>typename impl::data_param</paramtype> 708 <description> 709 <para>The current transform environment </para> 710 </description> 711 </parameter> 712 <description> 713 <para> 714 Returns the current transform environment 715 passed in the data (third) parameter. 716 </para> 717 </description> 718 <returns> 719 <para> 720 <code>data</code> 721 </para> 722 </returns> 723 </method> 724 </method-group> 725 </struct> 726 <description> 727 <para> 728 See <code><classname>proto::_env::impl</classname></code> for the full details. 729 </para> 730 </description> 731 </struct> 732 </namespace> 733 </namespace> 734 735 <!-- BOOST_PROTO_DEFINE_ENV_VAR() --> 736 <macro name="BOOST_PROTO_DEFINE_ENV_VAR" kind="functionlike"> 737 <macro-parameter name="Type"/> 738 <macro-parameter name="Name"/> 739 <purpose> 740 Define a type and a global variable of that type that can be used 741 to initialize a slot in a Proto transform environment. 742 </purpose> 743 <description> 744 <para> 745 Proto primitive transforms can optionally accept an environment in 746 their third parameter which is a key/value store of environment 747 variables. Use the <code>BOOST_PROTO_DEFINE_ENV_VAR()</code> macro 748 to define the keys. 749 </para> 750 <para> 751 See the description for <code><classname alt="boost::proto::data_type">proto::data_type</classname></code> 752 for an example of the class interface created by this macro. 753 </para> 754 <para> 755 <emphasis role="bold">Example:</emphasis> 756 </para> 757 <para> 758 <programlisting>BOOST_PROTO_DEFINE_ENV_VAR(mykey_type, mykey); 759 760struct FetchMyKey 761 : <classname alt="boost::proto::when">proto::when</classname>< <classname alt="boost::proto::_">_</classname>, <classname alt="boost::proto::_env_var">proto::_env_var</classname><mykey_type> > 762{}; 763 764int main() 765{ 766 <classname alt="boost::proto::terminal">proto::terminal</classname><int>::type i = {42}; 767 char const * sz = FetchMyKey()(i, 0, (mykey = "hello!")); 768 assert(0 == std::strcmp(sz, "hello!"); 769}</programlisting> 770 </para> 771 </description> 772 773 </macro> 774 775</header> 776