diff options
Diffstat (limited to 'libs/phoenix/doc/html/phoenix')
67 files changed, 10999 insertions, 0 deletions
diff --git a/libs/phoenix/doc/html/phoenix/acknowledgments.html b/libs/phoenix/doc/html/phoenix/acknowledgments.html new file mode 100644 index 0000000000..0eafc3213c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/acknowledgments.html @@ -0,0 +1,94 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Acknowledgments</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="wrap_up.html" title="Wrap Up"> +<link rel="next" href="references.html" title="References"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="wrap_up.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="references.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.acknowledgments"></a><a class="link" href="acknowledgments.html" title="Acknowledgments">Acknowledgments</a> +</h2></div></div></div> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + Hartmut Kaiser implemented the original lazy casts and constructors based + on his original work on Spirit SE "semantic expressions" (the + precursor to Phoenix), and guided Phoenix from the initial review of V2 + to the release of V3. + </li> +<li class="listitem"> + Eric Niebler did a 2.0 pre-release review and wrote some range related + code that Phoenix stole and used in the algorithms. Additionally he played + the leading role in inventing the extension mechanism as well as providing + early prototypes and helping with Boost.Proto code. DA Proto MAN! + </li> +<li class="listitem"> + Angus Leeming implemented the container functions on Phoenix-1 which I + then ported to Phoenix-2. + </li> +<li class="listitem"> + Daniel Wallin helped with the scope module, local variables, let and lambda + and the algorithms. I frequently discuss design issues with Daniel on Yahoo + Messenger. + </li> +<li class="listitem"> + Jaakko Jarvi. DA Lambda MAN! + </li> +<li class="listitem"> + Dave Abrahams, for his constant presence, wherever, whenever. + </li> +<li class="listitem"> + Aleksey Gurtovoy, DA MPL MAN! + </li> +<li class="listitem"> + Doug Gregor, always a source of inspiration. + </li> +<li class="listitem"> + Dan Marsden, did almost all the work in bringing Phoenix-2 out the door. + </li> +<li class="listitem"> + Thorsten Ottosen; Eric's range_ex code began life as "container_algo" + in the old boost sandbox, by Thorsten in 2002-2003. + </li> +<li class="listitem"> + Jeremy Siek, even prior to Thorsten, in 2001, started the "container_algo". + </li> +<li class="listitem"> + Vladimir Prus wrote the mutating algorithms code from the Boost Wiki. + </li> +<li class="listitem"> + Daryle Walker did a 2.0 pre-release review. + </li> +</ol></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="wrap_up.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="references.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/actor.html b/libs/phoenix/doc/html/phoenix/actor.html new file mode 100644 index 0000000000..eae7239c6c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/actor.html @@ -0,0 +1,90 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Actor</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="organization.html" title="Organization"> +<link rel="next" href="modules.html" title="Modules"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="organization.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="modules.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.actor"></a><a class="link" href="actor.html" title="Actor">Actor</a> +</h2></div></div></div> +<p> + The <code class="computeroutput"><span class="identifier">Actor</span></code> is the main concept + behind the library. Actors are function objects. An actor can accept 0 to + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> arguments. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + You can set <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code>, + the predefined maximum arity an actor can take. By default, <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> is set to 10. + </p></td></tr> +</table></div> +<p> + Phoenix supplies an <code class="computeroutput"><span class="identifier">actor</span></code> class + template whose specializations model the <code class="computeroutput"><span class="identifier">Actor</span></code> + concept. <code class="computeroutput"><span class="identifier">actor</span></code> has one template + parameter, <code class="computeroutput"><span class="identifier">Expr</span></code>, that supplies + the underlying expression to evaluate. + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">actor</span> +<span class="special">{</span> + <span class="identifier">return_type</span> + <span class="keyword">operator</span><span class="special">()()</span> <span class="keyword">const</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">></span> + <span class="identifier">return_type</span> + <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T0</span><span class="special">&</span> <span class="identifier">_0</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">></span> + <span class="identifier">return_type</span> + <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T0</span><span class="special">&</span> <span class="identifier">_0</span><span class="special">,</span> <span class="identifier">T1</span><span class="special">&</span> <span class="identifier">_1</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> + + <span class="comment">//...</span> +<span class="special">};</span> +</pre> +<p> + The actor class accepts the arguments through a set of function call operators + for 0 to <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> + arities (Don't worry about the details, for now. Note, for example, that we + skimp over the details regarding <code class="computeroutput"><span class="identifier">return_type</span></code>). + The arguments are passed through to the evaluation mechanism. For more information + see <a class="link" href="inside/actor.html" title="Actors in Detail">Inside Actors</a>. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="organization.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="modules.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/basics.html b/libs/phoenix/doc/html/phoenix/basics.html new file mode 100644 index 0000000000..ed7a403faa --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/basics.html @@ -0,0 +1,273 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Basics</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="starter_kit/more.html" title="More"> +<link rel="next" href="organization.html" title="Organization"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="starter_kit/more.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="organization.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.basics"></a><a class="link" href="basics.html" title="Basics">Basics</a> +</h2></div></div></div> +<p> + Almost everything is a function in the Phoenix library that can be evaluated + as <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span><span class="identifier">a1</span><span class="special">,</span> <span class="identifier">a2</span><span class="special">,</span> <span class="special">...,</span> a/n/<span class="special">)</span></code>, where <span class="emphasis"><em>n</em></span> is the function's + arity, or number of arguments that the function expects. Operators are also + functions. For example, <code class="computeroutput"><span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span></code> is just + a function with arity == 2 (or binary). <code class="computeroutput"><span class="identifier">a</span> + <span class="special">+</span> <span class="identifier">b</span></code> + is the same as <code class="computeroutput"><span class="identifier">add</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span></code>, <code class="computeroutput"><span class="identifier">a</span> + <span class="special">+</span> <span class="identifier">b</span> <span class="special">+</span> <span class="identifier">c</span></code> is the + same as <code class="computeroutput"><span class="identifier">add</span><span class="special">(</span><span class="identifier">add</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">),</span> + <span class="identifier">c</span><span class="special">)</span></code>. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + Amusingly, functions may even return functions. We shall see what this means + in a short while. + </p></td></tr> +</table></div> +<h4> +<a name="phoenix.basics.h0"></a> + <span><a name="phoenix.basics.partial_function_application"></a></span><a class="link" href="basics.html#phoenix.basics.partial_function_application">Partial + Function Application</a> + </h4> +<p> + Think of a function as a black box. You pass arguments and it returns something + back. The figure below depicts the typical scenario. + </p> +<p> + <span class="inlinemediaobject"><img src="../images/fbox.png" alt="fbox"></span> + </p> +<p> + A fully evaluated function is one in which all the arguments are given. All + functions in plain C++ are fully evaluated. When you call the <code class="computeroutput"><span class="identifier">sin</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> function, you have to pass a number x. The + function will return a result in return: the sin of x. When you call the <code class="computeroutput"><span class="identifier">add</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">)</span></code> + function, you have to pass two numbers x and y. The function will return the + sum of the two numbers. The figure below is a fully evaluated <code class="computeroutput"><span class="identifier">add</span></code> function. + </p> +<p> + <span class="inlinemediaobject"><img src="../images/adder.png" alt="adder"></span> + </p> +<p> + A partially applied function, on the other hand, is one in which not all the + arguments are supplied. If we are able to partially apply the function <code class="computeroutput"><span class="identifier">add</span></code> above, we may pass only the first argument. + In doing so, the function does not have all the required information it needs + to perform its task to compute and return a result. What it returns instead + is another function, a lambda function. Unlike the original <code class="computeroutput"><span class="identifier">add</span></code> + function which has an arity of 2, the resulting lambda function has an arity + of 1. Why? because we already supplied part of the input: <code class="computeroutput"><span class="number">2</span></code> + </p> +<p> + <span class="inlinemediaobject"><img src="../images/add2.png" alt="add2"></span> + </p> +<p> + Now, when we shove in a number into our lambda function, it will return 2 plus + whatever we pass in. The lambda function essentially remembers 1) the original + function, <code class="computeroutput"><span class="identifier">add</span></code>, and 2) the partial + input, 2. The figure below illustrates a case where we pass 3 to our lambda + function, which then returns 5: + </p> +<p> + <span class="inlinemediaobject"><img src="../images/add2_call.png" alt="add2_call"></span> + </p> +<p> + Obviously, partially applying the <code class="computeroutput"><span class="identifier">add</span></code> + function, as we see above, cannot be done directly in C++ where we are expected + to supply all the arguments that a function expects. That's where the Phoenix + library comes in. The library provides the facilities to do partial function + application. And even more, with Phoenix, these resulting functions won't be + black boxes anymore. + </p> +<h4> +<a name="phoenix.basics.h1"></a> + <span><a name="phoenix.basics.stl_and_higher_order_functions"></a></span><a class="link" href="basics.html#phoenix.basics.stl_and_higher_order_functions">STL + and higher order functions</a> + </h4> +<p> + So, what's all the fuss? What makes partial function application so useful? + Recall our original example in the <a class="link" href="starter_kit/lazy_operators.html" title="Lazy Operators">previous + section</a>: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> +</pre> +<p> + The expression <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">%</span> + <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> evaluates to a lambda function. <code class="computeroutput"><span class="identifier">arg1</span></code> is a placeholder for an argument to + be supplied later. Hence, since there's only one unsupplied argument, the lambda + function has an arity 1. It just so happens that <code class="computeroutput"><span class="identifier">find_if</span></code> + supplies the unsupplied argument as it loops from <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span></code> + to <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code>. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + Higher order functions are functions which can take other functions as arguments, + and may also return functions as results. Higher order functions are functions + that are treated like any other objects and can be used as arguments and + return values from functions. + </p></td></tr> +</table></div> +<h4> +<a name="phoenix.basics.h2"></a> + <span><a name="phoenix.basics.lazy_evaluation"></a></span><a class="link" href="basics.html#phoenix.basics.lazy_evaluation">Lazy + Evaluation</a> + </h4> +<p> + In Phoenix, to put it more accurately, function evaluation has two stages: + </p> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + Partial application + </li> +<li class="listitem"> + Final evaluation + </li> +</ol></div> +<p> + The first stage is handled by a set of generator functions. These are your + front ends (in the client's perspective). These generators create (through + partial function application), higher order functions that can be passed on + just like any other function pointer or function object. The second stage, + the actual function call, can be invoked or executed anytime in the future, + or not at all; hence <span class="emphasis"><em>"lazy"</em></span>. + </p> +<p> + If we look more closely, the first step involves partial function application: + </p> +<pre class="programlisting"><span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span> +</pre> +<p> + The second step is the actual function invocation (done inside the <code class="computeroutput"><span class="identifier">find_if</span></code> function. These are the back-ends + (often, the final invocation is never actually seen by the client). In our + example, the <code class="computeroutput"><span class="identifier">find_if</span></code>, if we + take a look inside, we'll see something like: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Predicate</span><span class="special">></span> +<span class="identifier">InputIterator</span> +<span class="identifier">find_if</span><span class="special">(</span><span class="identifier">InputIterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIterator</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Predicate</span> <span class="identifier">pred</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">while</span> <span class="special">(</span><span class="identifier">first</span> <span class="special">!=</span> <span class="identifier">last</span> <span class="special">&&</span> <span class="special">!</span><span class="identifier">pred</span><span class="special">(*</span><span class="identifier">first</span><span class="special">))</span> <span class="comment">// <--- The lambda function is called here</span> + <span class="special">++</span><span class="identifier">first</span><span class="special">;</span> <span class="comment">// passing in *first</span> + <span class="keyword">return</span> <span class="identifier">first</span><span class="special">;</span> +<span class="special">}</span> +</pre> +<p> + Again, typically, we, as clients, see only the first step. However, in this + document and in the examples and tests provided, don't be surprised to see + the first and second steps juxtaposed in order to illustrate the complete semantics + of Phoenix expressions. Examples: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> +<span class="keyword">int</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span> + +<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints 1 or true</span> +<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)(</span><span class="identifier">y</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints 0 or false</span> +</pre> +<h4> +<a name="phoenix.basics.h3"></a> + <span><a name="phoenix.basics.forwarding_function_problem"></a></span><a class="link" href="basics.html#phoenix.basics.forwarding_function_problem">Forwarding + Function Problem</a> + </h4> +<p> + Usually, we, as clients, write the call-back functions while libraries (such + as STL) provide the callee (e.g. <code class="computeroutput"><span class="identifier">find_if</span></code>). + In case the role is reversed, e.g. if you have to write an STL algorithm that + takes in a predicate, or develop a GUI library that accepts event handlers, + you have to be aware of a little known problem in C++ called the "<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_top">Forwarding + Function Problem</a>". + </p> +<p> + Look again at the code above: + </p> +<pre class="programlisting"><span class="special">(</span><span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)(</span><span class="identifier">x</span><span class="special">)</span> +</pre> +<p> + Notice that, in the second-stage (the final evaluation), we used a variable + <code class="computeroutput"><span class="identifier">x</span></code>. + </p> +<p> + In Phoenix we emulated perfect forwarding through preprocessor macros generating + code to allow const and non-const references. + </p> +<p> + We generate these second-stage overloads for Phoenix expression up to <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_PERFECT_FORWARD_LIMIT</span></code> + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + You can set <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_PERFECT_FORWARD_LIMIT</span></code>, + the predefined maximum perfect forward arguments an actor can take. By default, + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_PERFECT_FORWARDLIMIT</span></code> + is set to 3. + </p></td></tr> +</table></div> +<h4> +<a name="phoenix.basics.h4"></a> + <span><a name="phoenix.basics.polymorphic_functions"></a></span><a class="link" href="basics.html#phoenix.basics.polymorphic_functions">Polymorphic + Functions</a> + </h4> +<p> + Unless otherwise noted, Phoenix generated functions are fully polymorphic. + For instance, the <code class="computeroutput"><span class="identifier">add</span></code> example + above can apply to integers, floating points, user defined complex numbers + or even strings. Example: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">h</span><span class="special">(</span><span class="string">"Hello"</span><span class="special">);</span> +<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">w</span> <span class="special">=</span> <span class="string">" World"</span><span class="special">;</span> +<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)(</span><span class="identifier">h</span><span class="special">,</span> <span class="identifier">w</span><span class="special">);</span> +</pre> +<p> + evaluates to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="string">"Hello + World"</span><span class="special">)</span></code>. The observant + reader might notice that this function call in fact takes in heterogeneous + arguments where <code class="computeroutput"><span class="identifier">arg1</span></code> is of + type <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> and <code class="computeroutput"><span class="identifier">arg2</span></code> + is of type <code class="computeroutput"><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span></code>. <code class="computeroutput"><span class="identifier">add</span></code> + still works because the C++ standard library allows the expression <code class="computeroutput"><span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span></code> + where <code class="computeroutput"><span class="identifier">a</span></code> is a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> + and <code class="computeroutput"><span class="identifier">b</span></code> is a <code class="computeroutput"><span class="keyword">char</span> + <span class="keyword">const</span><span class="special">*</span></code>. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="starter_kit/more.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="organization.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/examples.html b/libs/phoenix/doc/html/phoenix/examples.html new file mode 100644 index 0000000000..191cbf394c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/examples.html @@ -0,0 +1,49 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Advanced Examples</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="inside/placeholder_unification.html" title="Placeholder Unification"> +<link rel="next" href="examples/extending_actors.html" title="Extending Actors"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="inside/placeholder_unification.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="examples/extending_actors.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.examples"></a><a class="link" href="examples.html" title="Advanced Examples">Advanced Examples</a> +</h2></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="examples/extending_actors.html">Extending Actors</a></span></dt> +<dt><span class="section"><a href="examples/adding_an_expression.html">Adding an expression</a></span></dt> +<dt><span class="section"><a href="examples/transforming_the_expression_tree.html">Transforming + the Expression Tree</a></span></dt> +</dl></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="inside/placeholder_unification.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="examples/extending_actors.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/examples/adding_an_expression.html b/libs/phoenix/doc/html/phoenix/examples/adding_an_expression.html new file mode 100644 index 0000000000..ecebf363e9 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/examples/adding_an_expression.html @@ -0,0 +1,158 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Adding an expression</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../examples.html" title="Advanced Examples"> +<link rel="prev" href="extending_actors.html" title="Extending Actors"> +<link rel="next" href="transforming_the_expression_tree.html" title="Transforming the Expression Tree"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="extending_actors.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="transforming_the_expression_tree.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.examples.adding_an_expression"></a><a class="link" href="adding_an_expression.html" title="Adding an expression">Adding an expression</a> +</h3></div></div></div> +<p> + This is not a toy example. This is actually part of the library. Remember + the <a class="link" href="../modules/statement/while__statement.html" title="while_ Statement"><code class="computeroutput"><span class="keyword">while</span></code></a> lazy statement? Putting together + everything we've learned so far, we eill present it here in its entirety + (verbatim): + </p> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span><span class="special">(</span> + <span class="special">(</span><span class="identifier">boost</span><span class="special">)(</span><span class="identifier">phoenix</span><span class="special">)(</span><span class="identifier">while_</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Cond</span> + <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Do</span> +<span class="special">)</span> + +<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">phoenix</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">while_eval</span> + <span class="special">{</span> + <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="identifier">result_type</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Cond</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Do</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">></span> + <span class="identifier">result_type</span> + <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Cond</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">,</span> <span class="identifier">Do</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">do_</span><span class="special">,</span> <span class="identifier">Context</span> <span class="special">&</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">while</span><span class="special">(</span><span class="identifier">eval</span><span class="special">(</span><span class="identifier">cond</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">))</span> + <span class="special">{</span> + <span class="identifier">eval</span><span class="special">(</span><span class="identifier">do_</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">);</span> + <span class="special">}</span> + <span class="special">}</span> + <span class="special">};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Dummy</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">default_actions</span><span class="special">::</span><span class="identifier">when</span><span class="special"><</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">while_</span><span class="special">,</span> <span class="identifier">Dummy</span><span class="special">></span> + <span class="special">:</span> <span class="identifier">call</span><span class="special"><</span><span class="identifier">while_eval</span><span class="special">,</span> <span class="identifier">Dummy</span><span class="special">></span> + <span class="special">{};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Cond</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">while_gen</span> + <span class="special">{</span> + <span class="identifier">while_gen</span><span class="special">(</span><span class="identifier">Cond</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">cond</span><span class="special">(</span><span class="identifier">cond</span><span class="special">)</span> <span class="special">{}</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Do</span><span class="special">></span> + <span class="keyword">typename</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> <span class="identifier">Do</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> + <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">Do</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">do_</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> <span class="identifier">Do</span><span class="special">>::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">cond</span><span class="special">,</span> <span class="identifier">do_</span><span class="special">);</span> + <span class="special">}</span> + + <span class="identifier">Cond</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">;</span> + <span class="special">};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Cond</span><span class="special">></span> + <span class="identifier">while_gen</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">></span> <span class="keyword">const</span> + <span class="identifier">while_</span><span class="special">(</span><span class="identifier">Cond</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">cond</span><span class="special">)</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">while_gen</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">>(</span><span class="identifier">cond</span><span class="special">);</span> + <span class="special">}</span> +<span class="special">}}</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">while_eval</span></code> is an example + of how to evaluate an expression. It gets called in the <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="keyword">while</span></code> action. + <code class="computeroutput"><span class="identifier">while_gen</span></code> and <code class="computeroutput"><span class="identifier">while_</span></code> are the expression template front + ends. Let's break this apart to undestand what's happening. Let's start at + the bottom. It's easier that way. + </p> +<p> + When you write: + </p> +<pre class="programlisting"><span class="identifier">while_</span><span class="special">(</span><span class="identifier">cond</span><span class="special">)</span> +</pre> +<p> + we generate an instance of <code class="computeroutput"><span class="identifier">while_gen</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">></span></code>, where <code class="computeroutput"><span class="identifier">Cond</span></code> + is the type of <code class="computeroutput"><span class="identifier">cond</span></code>. <code class="computeroutput"><span class="identifier">cond</span></code> can be an arbitrarily complex actor + expression. The <code class="computeroutput"><span class="identifier">while_gen</span></code> + template class has an <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code> accepting another expression. If we write: + </p> +<pre class="programlisting"><span class="identifier">while_</span><span class="special">(</span><span class="identifier">cond</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">do_</span> +<span class="special">]</span> +</pre> +<p> + it will generate a proper composite with the type: + </p> +<pre class="programlisting"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> <span class="identifier">Do</span><span class="special">>::</span><span class="identifier">type</span> +</pre> +<p> + where <code class="computeroutput"><span class="identifier">Cond</span></code> is the type of + <code class="computeroutput"><span class="identifier">cond</span></code> and <code class="computeroutput"><span class="identifier">Do</span></code> + is the type of <code class="computeroutput"><span class="identifier">do_</span></code>. Notice + how we are using Phoenix's <a class="link" href="../inside/expression.html" title="Phoenix Expressions">Expression</a> + mechanism here + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Do</span><span class="special">></span> +<span class="keyword">typename</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> <span class="identifier">Do</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> +<span class="keyword">operator</span><span class="special">[](</span><span class="identifier">Do</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">do_</span><span class="special">)</span> <span class="keyword">const</span> +<span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> <span class="identifier">Do</span><span class="special">>::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">cond</span><span class="special">,</span> <span class="identifier">do_</span><span class="special">);</span> +<span class="special">}</span> +</pre> +<p> + Finally, the <code class="computeroutput"><span class="identifier">while_eval</span></code> does + its thing: + </p> +<pre class="programlisting"><span class="keyword">while</span><span class="special">(</span><span class="identifier">eval</span><span class="special">(</span><span class="identifier">cond</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">))</span> +<span class="special">{</span> + <span class="identifier">eval</span><span class="special">(</span><span class="identifier">do_</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">);</span> +<span class="special">}</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">cond</span></code> and <code class="computeroutput"><span class="identifier">do_</span></code>, + at this point, are instances of <a class="link" href="../inside/actor.html" title="Actors in Detail">Actor</a>. + <code class="computeroutput"><span class="identifier">cond</span></code> and <code class="computeroutput"><span class="identifier">do_</span></code> + are the <a class="link" href="../inside/actor.html" title="Actors in Detail">Actors</a> passed as parameters + by <code class="computeroutput"><span class="identifier">call</span></code>, ctx is the <a class="link" href="../inside/actor.html" title="Actors in Detail">Context</a> + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="extending_actors.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="transforming_the_expression_tree.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/examples/extending_actors.html b/libs/phoenix/doc/html/phoenix/examples/extending_actors.html new file mode 100644 index 0000000000..835e6b5fbe --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/examples/extending_actors.html @@ -0,0 +1,320 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Extending Actors</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../examples.html" title="Advanced Examples"> +<link rel="prev" href="../examples.html" title="Advanced Examples"> +<link rel="next" href="adding_an_expression.html" title="Adding an expression"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../examples.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="adding_an_expression.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.examples.extending_actors"></a><a class="link" href="extending_actors.html" title="Extending Actors">Extending Actors</a> +</h3></div></div></div> +<p> + <a class="link" href="../inside/actor.html" title="Actors in Detail">Actors</a> are one of the main parts + of the library, and one of the many customization points. The default actor + implementation provides several operator() overloads which deal with the + evaluation of expressions. + </p> +<p> + For some use cases this might not be enough. For convenience it is thinkable + to provide custom member functions which generate new expressions. An example + is the <a class="link" href="../modules/statement/___if_else_____statement.html" title="if_else_ Statement">if_else_ +Statement</a> + which provides an additional else member for generating a lazy if-else expression. + With this the actual Phoenix expression becomes more expressive. + </p> +<p> + Another scenario is to give actors the semantics of a certain well known + interface or concept. This tutorial like section will provide information + on how to implement a custom actor which is usable as if it were a <a href="http://www.sgi.com/tech/stl/Container.html" target="_top">STL Container</a>. + </p> +<h5> +<a name="phoenix.examples.extending_actors.h0"></a> + <span><a name="phoenix.examples.extending_actors.requirements"></a></span><a class="link" href="extending_actors.html#phoenix.examples.extending_actors.requirements">Requirements</a> + </h5> +<p> + Let's repeat what we want to have: + </p> +<div class="informaltable"><table class="table"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Expression + </p> + </th> +<th> + <p> + Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span></code> + </p> + </td> +<td> + <p> + Returns an iterator pointing to the first element in the container. + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code> + </p> + </td> +<td> + <p> + Returns an iterator pointing one past the last element in the container. + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code> + </p> + </td> +<td> + <p> + Returns the size of the container, that is, its number of elements. + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code> + </p> + </td> +<td> + <p> + Returns the largest size that this container can ever have. + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code> + </p> + </td> +<td> + <p> + Equivalent to a.size() == 0. (But possibly faster.) + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">b</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + Equivalent to swap(a,b) + </p> + </td> +</tr> +</tbody> +</table></div> +<p> + Additionally, we want all the operator() overloads of the regular actor. + </p> +<h5> +<a name="phoenix.examples.extending_actors.h1"></a> + <span><a name="phoenix.examples.extending_actors.defining_the_actor"></a></span><a class="link" href="extending_actors.html#phoenix.examples.extending_actors.defining_the_actor">Defining the + actor</a> + </h5> +<p> + The first version of our <code class="computeroutput"><span class="identifier">container_actor</span></code> + interface will show the general principle. This will be continually extended. + For the sake of simplicity, every member function generator will return + <a class="link" href="../modules/core/nothing.html" title="Nothing"><code class="computeroutput"><span class="identifier">nothing</span></code></a> + at first. + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">container_actor</span> + <span class="special">:</span> <span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> +<span class="special">{</span> + <span class="keyword">typedef</span> <span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> <span class="identifier">base_type</span><span class="special">;</span> + <span class="keyword">typedef</span> <span class="identifier">container_actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> <span class="identifier">that_type</span><span class="special">;</span> + + <span class="identifier">container_actor</span><span class="special">(</span> <span class="identifier">base_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">base</span> <span class="special">)</span> + <span class="special">:</span> <span class="identifier">base_type</span><span class="special">(</span> <span class="identifier">base</span> <span class="special">)</span> <span class="special">{}</span> + + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">nothing</span><span class="special">;</span> <span class="special">}</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">nothing</span><span class="special">;</span> <span class="special">}</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">nothing</span><span class="special">;</span> <span class="special">}</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">nothing</span><span class="special">;</span> <span class="special">}</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">nothing</span><span class="special">;</span> <span class="special">}</span> + + <span class="comment">// Note that swap is the only function needing another container.</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">swap</span><span class="special">(</span> <span class="identifier">actor</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">nothing</span><span class="special">;</span> <span class="special">}</span> +<span class="special">};</span> +</pre> +<h5> +<a name="phoenix.examples.extending_actors.h2"></a> + <span><a name="phoenix.examples.extending_actors.using_the_actor"></a></span><a class="link" href="extending_actors.html#phoenix.examples.extending_actors.using_the_actor">Using + the actor</a> + </h5> +<p> + Although the member functions do nothing right now, we want to test if we + can use our new actor. + </p> +<p> + First, lets create a generator which wraps the <code class="computeroutput"><span class="identifier">container_actor</span></code> + around any other expression: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">></span> +<span class="identifier">container_actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> <span class="keyword">const</span> +<span class="identifier">container</span><span class="special">(</span> <span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">expr</span> <span class="special">)</span> +<span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">expr</span><span class="special">;</span> +<span class="special">}</span> +</pre> +<p> + Now let's test this: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">;</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> + +<span class="special">(</span><span class="identifier">container</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">).</span><span class="identifier">size</span><span class="special">())(</span><span class="identifier">v</span><span class="special">);</span> +</pre> +<p> + Granted, this is not really elegant and not very practical (we could have + just used phoenix::begin(v) from the <a class="link" href="../modules/stl/algorithm.html" title="Algorithm">Phoenix + algorithm module</a>, but we can do better. + </p> +<p> + Let's have an <a class="link" href="../modules/core/arguments.html" title="Arguments">argument placeholder</a> + which is usable as if it was a STL container: + </p> +<pre class="programlisting"><span class="identifier">container_actor</span><span class="special"><</span><span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">1</span><span class="special">>::</span><span class="identifier">type</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">con1</span><span class="special">;</span> +<span class="comment">// and so on ...</span> +</pre> +<p> + The above example can be rewritten as: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">;</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> +<span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> + +<span class="special">(</span><span class="identifier">con1</span><span class="special">.</span><span class="identifier">size</span><span class="special">())(</span><span class="identifier">v</span><span class="special">);</span> +</pre> +<p> + Wow, that was easy! + </p> +<h5> +<a name="phoenix.examples.extending_actors.h3"></a> + <span><a name="phoenix.examples.extending_actors.adding_life_to_the_actor"></a></span><a class="link" href="extending_actors.html#phoenix.examples.extending_actors.adding_life_to_the_actor">Adding + life to the actor</a> + </h5> +<p> + This one will be even easier! + </p> +<p> + First, we define a <a class="link" href="../modules/function.html" title="Function">lazy function</a> + which evaluates the expression we want to implement. Following is the implementation + of the size function: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">size_impl</span> +<span class="special">{</span> + <span class="comment">// result_of protocol:</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">Container</span><span class="special">)></span> + <span class="special">{</span> + <span class="comment">// Note, remove reference here, because Container can be anything</span> + <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">Container</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">container_type</span><span class="special">;</span> + + <span class="comment">// The result will be size_type</span> + <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">container_type</span><span class="special">::</span><span class="identifier">size_type</span> <span class="identifier">type</span><span class="special">;</span> + <span class="special">};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> + <span class="keyword">typename</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">size_impl</span><span class="special">(</span><span class="identifier">Container</span> <span class="keyword">const</span><span class="special">&)>::</span><span class="identifier">type</span> + <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Container</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">container</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">container</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> + <span class="special">}</span> +<span class="special">};</span> +</pre> +<p> + Good, this was the first part. The second part will be to implement the size + member function of <code class="computeroutput"><span class="identifier">container_actor</span></code>: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">container_actor</span> + <span class="special">:</span> <span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> +<span class="special">{</span> + <span class="keyword">typedef</span> <span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> <span class="identifier">base_type</span><span class="special">;</span> + <span class="keyword">typedef</span> <span class="identifier">container_actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">></span> <span class="identifier">that_type</span><span class="special">;</span> + + <span class="identifier">container_actor</span><span class="special">(</span> <span class="identifier">base_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">base</span> <span class="special">)</span> + <span class="special">:</span> <span class="identifier">base_type</span><span class="special">(</span> <span class="identifier">base</span> <span class="special">)</span> <span class="special">{}</span> + + <span class="keyword">typename</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">size_impl</span><span class="special">,</span> <span class="identifier">that_type</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> + <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="identifier">function</span><span class="special"><</span><span class="identifier">size_impl</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">f</span> <span class="special">=</span> <span class="identifier">size_impl</span><span class="special">();</span> + <span class="keyword">return</span> <span class="identifier">f</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span> + <span class="special">}</span> + + <span class="comment">// the rest ...</span> +<span class="special">};</span> +</pre> +<p> + It is left as an exercise to the user to implement the missing parts by reusing + functions from the <a class="link" href="../modules/stl/algorithm.html" title="Algorithm">Phoenix + Algorithm Module</a> (the impatient take a look here: <a href="../../../../example/container_actor.cpp" target="_top">container_actor.cpp</a>). + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../examples.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="adding_an_expression.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/examples/transforming_the_expression_tree.html b/libs/phoenix/doc/html/phoenix/examples/transforming_the_expression_tree.html new file mode 100644 index 0000000000..ca9aeee4a5 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/examples/transforming_the_expression_tree.html @@ -0,0 +1,198 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Transforming the Expression Tree</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../examples.html" title="Advanced Examples"> +<link rel="prev" href="adding_an_expression.html" title="Adding an expression"> +<link rel="next" href="../wrap_up.html" title="Wrap Up"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="adding_an_expression.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../wrap_up.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.examples.transforming_the_expression_tree"></a><a class="link" href="transforming_the_expression_tree.html" title="Transforming the Expression Tree">Transforming + the Expression Tree</a> +</h3></div></div></div> +<p> + This example will show how to write <a class="link" href="../inside/actions.html" title="More on Actions">Actions</a> + that transform the Phoenix AST. + </p> +<div class="blockquote"><blockquote class="blockquote"> +<p> + "<span class="emphasis"><em>Lisp macros transform the program structure itself, with + the full language available to express such transformations.</em></span>" + </p> +<p> + <a href="http://en.wikipedia.org/wiki/Lisp_macro#Lisp_macros" target="_top">Wikipedia</a> + </p> +</blockquote></div> +<p> + What we want to do is to invert some arithmetic operators, i.e. plus will + be transformed to minus, minus to plus, multiplication to division and division + to multiplication. + </p> +<p> + Let's start with defining our default action: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">invert_actions</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Rule</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">when</span> + <span class="special">:</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span> <span class="comment">// the default is proto::_</span> + <span class="special">{};</span> +<span class="special">};</span> +</pre> +<p> + By default, we don't want to do anything, well, not exactly nothing, but + just return the expression. This is done by <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/_.html" target="_top">proto::_</a> + which, used as a transform, just passes the current expression along. Making + this action an identity transform. + </p> +<p> + So, after the basics are set up, we can start by writing the transformations + we want to have on our tree: + </p> +<pre class="programlisting"><span class="comment">// Transform plus to minus</span> +<span class="keyword">template</span> <span class="special"><></span> +<span class="keyword">struct</span> <span class="identifier">invert_actions</span><span class="special">::</span><span class="identifier">when</span><span class="special"><</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">plus</span><span class="special">></span> + <span class="special">:</span> <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/call.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">call</span></code></a><span class="special"><</span> + <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/functional/make_expr.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">functional</span><span class="special">::</span><span class="identifier">make_expr</span></code></a><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">minus</span><span class="special">>(</span> + <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_left</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_right</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">)</span> + <span class="special">></span> +<span class="special">{};</span> +</pre> +<p> + Wow, this looks complicated! Granted you need to know a little bit about + <a href="http://www.boost.org/doc/libs/release/libs/proto/index.html" target="_top">Boost.Proto</a> + (For a good introduction read through the <a href="http://cpp-next.com/archive/2010/08/expressive-c-introduction/" target="_top">Expressive + C++</a> series). + </p> +<p> + What is done is the following: + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + The left expression is passed to evaluator (with the current context, + that contains our invert_actions) + </li> +<li class="listitem"> + The right expression is passed to evaluator (with the current context, + that contains our invert_actions) + </li> +<li class="listitem"> + The result of these two <a href="http://www.boost.org/doc/libs/release/doc/html/Transform.html" target="_top">Proto + Transforms</a> is passed to <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/functional/make_expr.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">functional</span><span class="special">::</span><span class="identifier">make_expr</span></code></a> which returns the + freshly created expression + </li> +</ul></div> +<p> + After you know what is going on, maybe the rest doesn't look so scary anymore: + </p> +<pre class="programlisting"><span class="comment">// Transform minus to plus</span> +<span class="keyword">template</span> <span class="special"><></span> +<span class="keyword">struct</span> <span class="identifier">invert_actions</span><span class="special">::</span><span class="identifier">when</span><span class="special"><</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">minus</span><span class="special">></span> + <span class="special">:</span> <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/call.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">call</span></code></a><span class="special"><</span> + <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/functional/make_expr.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">functional</span><span class="special">::</span><span class="identifier">make_expr</span></code></a><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">plus</span><span class="special">>(</span> + <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_left</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_right</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">)</span> + <span class="special">></span> +<span class="special">{};</span> + +<span class="comment">// Transform multiplies to divides</span> +<span class="keyword">template</span> <span class="special"><></span> +<span class="keyword">struct</span> <span class="identifier">invert_actions</span><span class="special">::</span><span class="identifier">when</span><span class="special"><</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">multiplies</span><span class="special">></span> + <span class="special">:</span> <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/call.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">call</span></code></a><span class="special"><</span> + <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/functional/make_expr.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">functional</span><span class="special">::</span><span class="identifier">make_expr</span></code></a><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">divides</span><span class="special">>(</span> + <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_left</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_right</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">)</span> + <span class="special">></span> +<span class="special">{};</span> + +<span class="comment">// Transform divides to multiplies</span> +<span class="keyword">template</span> <span class="special"><></span> +<span class="keyword">struct</span> <span class="identifier">invert_actions</span><span class="special">::</span><span class="identifier">when</span><span class="special"><</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">divides</span><span class="special">></span> + <span class="special">:</span> <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/call.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">call</span></code></a><span class="special"><</span> + <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/functional/make_expr.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">functional</span><span class="special">::</span><span class="identifier">make_expr</span></code></a><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">multiplies</span><span class="special">>(</span> + <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_left</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_right</span><span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">_context</span><span class="special">)</span> + <span class="special">)</span> + <span class="special">></span> +<span class="special">{};</span> +</pre> +<p> + That's it! Now that we have our actions defined, we want to evaluate some + of our expressions with them: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">></span> +<span class="comment">// Calculate the result type: our transformed AST</span> +<span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span> + <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">evaluator</span><span class="special">(</span> + <span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&</span> + <span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">context</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">invert_actions</span><span class="special">>::</span><span class="identifier">type</span> + <span class="special">)</span> +<span class="special">>::</span><span class="identifier">type</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">Expr</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">expr</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">return</span> + <span class="comment">// Evaluate it with our actions</span> + <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">eval</span><span class="special">(</span> + <span class="identifier">expr</span> + <span class="special">,</span> <span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">context</span><span class="special">(</span> + <span class="keyword">int</span><span class="special">()</span> + <span class="special">,</span> <span class="identifier">invert_actions</span><span class="special">()</span> + <span class="special">)</span> + <span class="special">);</span> +<span class="special">}</span> +</pre> +<p> + Run some tests to see if it is working: + </p> +<pre class="programlisting"><span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span><span class="special">);</span> <span class="comment">// --> _1</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">+</span> <span class="identifier">_2</span><span class="special">);</span> <span class="comment">// --> _1 - _2</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">+</span> <span class="identifier">_2</span> <span class="special">-</span> <span class="identifier">_3</span><span class="special">);</span> <span class="comment">// --> _1 - _2 + _3</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">_2</span><span class="special">);</span> <span class="comment">// --> _1 / _2</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">_2</span> <span class="special">/</span> <span class="identifier">_3</span><span class="special">);</span> <span class="comment">// --> _1 / _2 * _3</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">_2</span> <span class="special">+</span> <span class="identifier">_3</span><span class="special">);</span> <span class="comment">// --> _1 / _2 - _3</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">_2</span> <span class="special">-</span> <span class="identifier">_3</span><span class="special">);</span> <span class="comment">// --> _1 / _2 + _2</span> +<span class="identifier">invert</span><span class="special">(</span><span class="identifier">if_</span><span class="special">(</span><span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">_4</span><span class="special">)[</span><span class="identifier">_2</span> <span class="special">-</span> <span class="identifier">_3</span><span class="special">]);</span> <span class="comment">// --> if_(_1 / _4)[_2 + _3]</span> +<span class="identifier">_1</span> <span class="special">*</span> <span class="identifier">invert</span><span class="special">(</span><span class="identifier">_2</span> <span class="special">-</span> <span class="identifier">_3</span><span class="special">));</span> <span class="comment">// --> _1 * _2 + _3</span> +</pre> +<p> + <span class="inlinemediaobject"><img src="../../images/note.png" alt="note"></span> The complete example can be found here: <a href="../../../../example/invert.cpp" target="_top">example/invert.cpp</a> + </p> +<p> + <span class="emphasis"><em>Pretty simple ...</em></span> + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="adding_an_expression.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../wrap_up.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside.html b/libs/phoenix/doc/html/phoenix/inside.html new file mode 100644 index 0000000000..f8d315b4b6 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside.html @@ -0,0 +1,59 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Inside Phoenix</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="modules/stl/algorithm.html" title="Algorithm"> +<link rel="next" href="inside/actor.html" title="Actors in Detail"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="modules/stl/algorithm.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="inside/actor.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.inside"></a><a class="link" href="inside.html" title="Inside Phoenix">Inside Phoenix</a> +</h2></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="inside/actor.html">Actors in Detail</a></span></dt> +<dt><span class="section"><a href="inside/expression.html">Phoenix Expressions</a></span></dt> +<dd><dl><dt><span class="section"><a href="inside/expression/boilerplate_macros.html">Boilerplate + Macros</a></span></dt></dl></dd> +<dt><span class="section"><a href="inside/actions.html">More on Actions</a></span></dt> +<dt><span class="section"><a href="inside/rules.html">Predefined Expressions and Rules</a></span></dt> +<dt><span class="section"><a href="inside/custom_terminals.html">Custom Terminals</a></span></dt> +<dt><span class="section"><a href="inside/placeholder_unification.html">Placeholder Unification</a></span></dt> +</dl></div> +<p> + This chapter explains in more detail how the library operates. The information + henceforth should not be necessary to those who are interested in just using + the library. However, a microscopic view might prove to be beneficial to advanced + programmers who wish to extend the library. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="modules/stl/algorithm.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="inside/actor.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/actions.html b/libs/phoenix/doc/html/phoenix/inside/actions.html new file mode 100644 index 0000000000..4e2412211d --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/actions.html @@ -0,0 +1,209 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>More on Actions</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../inside.html" title="Inside Phoenix"> +<link rel="prev" href="expression/boilerplate_macros.html" title="Boilerplate Macros"> +<link rel="next" href="rules.html" title="Predefined Expressions and Rules"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="expression/boilerplate_macros.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rules.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.inside.actions"></a><a class="link" href="actions.html" title="More on Actions">More on Actions</a> +</h3></div></div></div> +<p> + As you know from the <a class="link" href="actor.html" title="Actors in Detail">Actors in Detail</a> + section, Actions are what brings life to a Phoenix expression tree. + </p> +<p> + When dealing with a Phoenix expression tree, it gets evaluated top-down. + Example: + </p> +<pre class="programlisting"><span class="identifier">_1</span> <span class="special">+</span> <span class="number">3</span> <span class="special">*</span> <span class="identifier">_2</span> +</pre> +<p> + Can be visualized as an AST in the following way: + </p> +<p> + <span class="inlinemediaobject"><img src="../../images/simple_ast.png" alt="simple_ast"></span> + </p> +<p> + In terms of actions this means: + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">plus</span></code> is matched + </li> +<li class="listitem"> + evaluate left: + <div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"> + <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">placeholder</span></code> is matched + </li></ul></div> + </li> +<li class="listitem"> + evaluate right: + <div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"> + <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">multiplies</span></code> is matched + <div class="itemizedlist"><ul class="itemizedlist" type="square"> +<li class="listitem"> + evaluate left: + <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> + <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">value</span></code> + is matched + </li></ul></div> + </li> +<li class="listitem"> + evaluate right: + <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> + <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">placeholder</span></code> + is matched + </li></ul></div> + </li> +</ul></div> + </li></ul></div> + </li> +</ul></div> +<p> + Every time a rule is matched, an action will be called. The action determines + how the Phoenix AST will be traversed. + </p> +<h5> +<a name="phoenix.inside.actions.h0"></a> + <span><a name="phoenix.inside.actions.writing_an_action"></a></span><a class="link" href="actions.html#phoenix.inside.actions.writing_an_action">Writing + an Action</a> + </h5> +<p> + As mentioned in <a class="link" href="actor.html" title="Actors in Detail">Actors in Detail</a> + actions are <a href="http://www.boost.org/doc/libs/release/doc/html/PrimitiveTransform.html" target="_top">Proto + Primitive Transforms</a> for convenience Phoenix provides an abstraction + to this: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Fun</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">call</span><span class="special">;</span> +</pre> +<p> + This is similar to <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/call.html" target="_top"><code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">call</span></code></a> but does more. It calls the + <code class="computeroutput"><span class="identifier">Fun</span></code> function object passed + as template parameter with the <code class="computeroutput"><span class="identifier">Context</span></code> + and the children of the expression associated with the rule. + </p> +<p> + Lets have an (simplified) example on how to write an evaluation action for + <code class="computeroutput"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">plus</span></code>: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">plus_eval</span> +<span class="special">{</span> + <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">result_type</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">></span> + <span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Lhs</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">Rhs</span> <span class="keyword">const</span> <span class="special">&</span><span class="identifier">rhs</span><span class="special">,</span> <span class="identifier">Context</span> <span class="special">&</span> <span class="identifier">ctx</span><span class="special">)</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">eval</span><span class="special">(</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">eval</span><span class="special">(</span><span class="identifier">rhs</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">);</span> + <span class="special">}</span> +<span class="special">};</span> + +<span class="keyword">template</span> <span class="special"><></span> +<span class="keyword">struct</span> <span class="identifier">default_actions</span><span class="special">::</span><span class="identifier">when</span><span class="special"><</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">plus</span><span class="special">></span> + <span class="special">:</span> <span class="identifier">call</span><span class="special"><</span><span class="identifier">plus_eval</span><span class="special">></span> +<span class="special">{};</span> +</pre> +<p> + That's it. When evaluating a <code class="computeroutput"><span class="identifier">plus</span></code> + expression, the <code class="computeroutput"><span class="identifier">plus_eval</span></code> + callable gets called with the left hand side and right hand side expression + and the associated Context. + </p> +<p> + <span class="bold"><strong>But there is more:</strong></span> As Actions <span class="emphasis"><em>can</em></span> + be full fletched <a href="http://www.boost.org/doc/libs/release/doc/html/Transform.html" target="_top">Proto + Transforms</a>, you can in fact use any proto expression you can imagine + as the action. Phoenix predifines a set of callables and transform to deal + with the Context information passed along and of course every Phoenix expression + can be used as a Phoenix grammar or <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/pass_through.html" target="_top">Proto + Pass Through Transform</a>. + </p> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term"><code class="computeroutput"><span class="identifier">functional</span><span class="special">::</span><span class="identifier">context</span><span class="special">(</span><span class="identifier">Env</span><span class="special">,</span> <span class="identifier">Actions</span><span class="special">)</span></code></span></dt> +<dd><p> + A <a href="http://www.boost.org/doc/libs/release/doc/html/Callable.html" target="_top">Proto + Callable Transform</a> that creates a new context out of the <code class="computeroutput"><span class="identifier">Env</span></code> and <code class="computeroutput"><span class="identifier">Actions</span></code> + parameter + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">functional</span><span class="special">::</span><span class="identifier">env</span><span class="special">(</span><span class="identifier">Context</span><span class="special">)</span></code></span></dt> +<dd><p> + A <a href="http://www.boost.org/doc/libs/release/doc/html/Callable.html" target="_top">Proto + Callable Transform</a> that returns the environment out of the + <code class="computeroutput"><span class="identifier">Context</span></code> parameter + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">functional</span><span class="special">::</span><span class="identifier">actions</span><span class="special">(</span><span class="identifier">Context</span><span class="special">)</span></code></span></dt> +<dd><p> + A <a href="http://www.boost.org/doc/libs/release/doc/html/Callable.html" target="_top">Proto + Callable Transform</a> that returns the actions out of the <code class="computeroutput"><span class="identifier">Context</span></code> parameter + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">_context</span></code></span></dt> +<dd><p> + A <a href="http://www.boost.org/doc/libs/release/doc/html/PrimitiveTransform.html" target="_top">Proto + Primitive Transform</a> that returns the current context + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">_env</span></code></span></dt> +<dd><p> + A <a href="http://www.boost.org/doc/libs/release/doc/html/PrimitiveTransform.html" target="_top">Proto + Primitive Transform</a> that returns the current environment + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">_actions</span></code></span></dt> +<dd><p> + A <a href="http://www.boost.org/doc/libs/release/doc/html/PrimitiveTransform.html" target="_top">Proto + Primitive Transform</a> that returns the current actions + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">context</span><span class="special">(</span><span class="identifier">env</span><span class="special">,</span> <span class="identifier">actions</span><span class="special">)</span></code></span></dt> +<dd><p> + A regular function that creates a context + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">env</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code></span></dt> +<dd><p> + A regular function that returns the environment from the given context + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">actions</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code></span></dt> +<dd><p> + A regular function that returns the actions from the given context + </p></dd> +</dl> +</div> +<p> + Phoenix is equipped with a predefined set of expressions, rules and actions + to make all the stuff work you learned in the <a class="link" href="../starter_kit.html" title="Starter Kit">Starter + Kit</a> and <a class="link" href="../modules.html" title="Modules">Modules</a> sections. See + the <a class="link" href="rules.html" title="Predefined Expressions and Rules">next section</a> for more details! + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="expression/boilerplate_macros.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="rules.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/actor.html b/libs/phoenix/doc/html/phoenix/inside/actor.html new file mode 100644 index 0000000000..c37270c8f4 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/actor.html @@ -0,0 +1,411 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Actors in Detail</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../inside.html" title="Inside Phoenix"> +<link rel="prev" href="../inside.html" title="Inside Phoenix"> +<link rel="next" href="expression.html" title="Phoenix Expressions"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../inside.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="expression.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.inside.actor"></a><a class="link" href="actor.html" title="Actors in Detail">Actors in Detail</a> +</h3></div></div></div> +<h5> +<a name="phoenix.inside.actor.h0"></a> + <span><a name="phoenix.inside.actor.actor"></a></span><a class="link" href="actor.html#phoenix.inside.actor.actor">Actor</a> + </h5> +<p> + The main concept is the <code class="computeroutput"><span class="identifier">Actor</span></code>. + An <code class="computeroutput"><span class="identifier">Actor</span></code> is a model of the + <a href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/functional/concepts/poly.html" target="_top">Polymorphic + Function Object</a> concept (that can accept 0 to N arguments (where + N is a predefined maximum). + </p> +<p> + An <code class="computeroutput"><span class="identifier">Actor</span></code> contains a valid + Phoenix Expression, a call to one of the function call operator overloads, + starts the evaluation process. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + You can set <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code>, + the predefined maximum arity an actor can take. By default, <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> is set to 10. + </p></td></tr> +</table></div> +<p> + The <code class="computeroutput"><span class="identifier">actor</span></code> template class + models the <code class="computeroutput"><span class="identifier">Actor</span></code> concept: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">actor</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span> + + <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">>::</span><span class="identifier">type</span> + <span class="keyword">operator</span><span class="special">()()</span> <span class="keyword">const</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">></span> + <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">,</span> <span class="identifier">T0</span> <span class="special">&>::</span><span class="identifier">type</span> + <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T0</span><span class="special">&</span> <span class="identifier">_0</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">></span> + <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">,</span> <span class="identifier">T0</span> <span class="keyword">const</span> <span class="special">&>::</span><span class="identifier">type</span> + <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">_0</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> + + <span class="comment">//...</span> +<span class="special">};</span> +</pre> +<div class="table"> +<a name="phoenix.inside.actor.t0"></a><p class="title"><b>Table 1.9. Actor Concept Requirements</b></p> +<div class="table-contents"><table class="table" summary="Actor Concept Requirements"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Expression + </p> + </th> +<th> + <p> + Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">actor</span><span class="special">(</span><span class="identifier">arg0</span><span class="special">,</span> + <span class="identifier">arg1</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">argN</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + Function call operators to start the evaluation + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">Actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">>(</span><span class="identifier">Arg0</span><span class="special">,</span> + <span class="identifier">Arg1</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">ArgN</span><span class="special">)>::</span><span class="identifier">type</span></code> + </p> + </td> +<td> + <p> + Result of the evaluation + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">,</span> + <span class="identifier">Arg0</span><span class="special">,</span> + <span class="identifier">Arg1</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">ArgN</span><span class="special">>::</span><span class="identifier">type</span></code> + </p> + </td> +<td> + <p> + Result of the evaluation + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><h5> +<a name="phoenix.inside.actor.h1"></a> + <span><a name="phoenix.inside.actor.function_call_operators"></a></span><a class="link" href="actor.html#phoenix.inside.actor.function_call_operators">Function + Call Operators</a> + </h5> +<p> + There are 2*N function call operators for 0 to N arguments (N == <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code>). The actor class accepts + the arguments and forwards the arguments to the default evaluation action. + </p> +<p> + Additionally, there exist function call operators accepting permutations + of const and non-const references. These operators are created for all N + <= <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_PERFECT_FORWARD_LIMIT</span></code> + (which defaults to 3). + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"> +<p> + <span class="bold"><strong>Forwarding Function Problem</strong></span> + </p> +<p> + There is a known issue with current C++ called the "<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_top">Forwarding + Function Problem</a>". The problem is that given an arbitrary + function <code class="computeroutput"><span class="identifier">F</span></code>, using current + C++ language rules, one cannot create a forwarding function <code class="computeroutput"><span class="identifier">FF</span></code> that transparently assumes the arguments + of <code class="computeroutput"><span class="identifier">F</span></code>. + </p> +</td></tr> +</table></div> +<h5> +<a name="phoenix.inside.actor.h2"></a> + <span><a name="phoenix.inside.actor.context"></a></span><a class="link" href="actor.html#phoenix.inside.actor.context">Context</a> + </h5> +<p> + On an actor function call, before calling the evaluation function, the actor + created a <span class="bold"><strong>context</strong></span>. This context consists + of an <code class="computeroutput"><span class="identifier">Environment</span></code> and an + <code class="computeroutput"><span class="identifier">Action</span></code> part. These contain + all information necessary to evaluate the given expression. + </p> +<div class="table"> +<a name="phoenix.inside.actor.t1"></a><p class="title"><b>Table 1.10. Context Concept Requirements</b></p> +<div class="table-contents"><table class="table" summary="Context Concept Requirements"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Expression + </p> + </th> +<th> + <p> + Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">context</span><span class="special"><</span><span class="identifier">Env</span><span class="special">,</span> + <span class="identifier">Actions</span><span class="special">>::</span><span class="identifier">type</span></code> + </p> + </td> +<td> + <p> + Type of a Context + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">context</span><span class="special">(</span><span class="identifier">e</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + A Context containing environment <code class="computeroutput"><span class="identifier">e</span></code> + and actions <code class="computeroutput"><span class="identifier">a</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">env</span><span class="special"><</span><span class="identifier">Context</span><span class="special">>::</span><span class="identifier">type</span></code> + </p> + </td> +<td> + <p> + Type of the contained Environment + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">env</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + The environment + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actions</span><span class="special"><</span><span class="identifier">Context</span><span class="special">>::</span><span class="identifier">type</span></code> + </p> + </td> +<td> + <p> + Type of the contained Actions + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">actions</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + The actions + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><h5> +<a name="phoenix.inside.actor.h3"></a> + <span><a name="phoenix.inside.actor.environment"></a></span><a class="link" href="actor.html#phoenix.inside.actor.environment">Environment</a> + </h5> +<p> + The Environment is a model of <a href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/sequence/concepts/random_access_sequence.html" target="_top">Random + Access Sequence</a>. + </p> +<p> + The arguments passed to the actor's function call operator are collected + inside the Environment: + </p> +<p> + <span class="inlinemediaobject"><img src="../../images/funnel_in.png" alt="funnel_in"></span> + </p> +<p> + Other parts of the library (e.g. the scope module) extends the <code class="computeroutput"><span class="identifier">Environment</span></code> concept to hold other information + such as local variables, etc. + </p> +<h5> +<a name="phoenix.inside.actor.h4"></a> + <span><a name="phoenix.inside.actor.actions"></a></span><a class="link" href="actor.html#phoenix.inside.actor.actions">Actions</a> + </h5> +<p> + Actions is the part of Phoenix which are responsible for giving the actual + expressions a specific behaviour. During the traversal of the Phoenix Expression + Tree these actions are called whenever a specified rule in the grammar matches. + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">actions</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Rule</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">when</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + The nested <code class="computeroutput"><span class="identifier">when</span></code> template + is required to be <a href="http://www.boost.org/doc/libs/release/doc/html/PrimitiveTransform.html" target="_top">Proto + Primitive Transform</a>. No worries, you don't have to learn <a href="http://www.boost.org/doc/libs/release/libs/proto/index.html" target="_top">Boost.Proto</a> + just yet! Phoenix provides some wrappers to let you define simple actions + without the need to dive deep into proto. + </p> +<p> + Phoenix ships with a predefined <code class="computeroutput"><span class="identifier">default_actions</span></code> + class that evaluates the expressions with C++ semantics: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">default_actions</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Rule</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Dummy</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">when</span> + <span class="special">:</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">_default</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> + <span class="special">{};</span> +<span class="special">};</span> +</pre> +<p> + For more information on how to use the default_actions class and how to attach + custom actions to the evaluation process, see <a class="link" href="actions.html" title="More on Actions">more + on actions</a>. + </p> +<h5> +<a name="phoenix.inside.actor.h5"></a> + <span><a name="phoenix.inside.actor.evaluation"></a></span><a class="link" href="actor.html#phoenix.inside.actor.evaluation">Evaluation</a> + </h5> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">evaluator</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">></span> + <span class="emphasis"><em>unspecified</em></span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Expr</span> <span class="special">&,</span> <span class="identifier">Context</span> <span class="special">&);</span> +<span class="special">};</span> + +<span class="identifier">evaluator</span> <span class="keyword">const</span> <span class="identifier">eval</span> <span class="special">=</span> <span class="special">{};</span> +</pre> +<p> + The evaluation of a Phoenix expression is started by a call to the function + call operator of <code class="computeroutput"><span class="identifier">evaluator</span></code>. + </p> +<p> + The evaluator is called by the <code class="computeroutput"><span class="identifier">actor</span></code> + function operator overloads after the context is built up. For reference, + here is a typical <code class="computeroutput"><span class="identifier">actor</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> + that accepts two arguments: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">></span> +<span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actor</span><span class="special"><</span><span class="identifier">Expr</span><span class="special">,</span> <span class="identifier">T0</span> <span class="special">&,</span> <span class="identifier">T1</span> <span class="special">&>::</span><span class="identifier">type</span> +<span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T0</span> <span class="special">&</span><span class="identifier">t0</span><span class="special">,</span> <span class="identifier">T1</span> <span class="special">&</span><span class="identifier">t1</span><span class="special">)</span> <span class="keyword">const</span> +<span class="special">{</span> + <span class="identifier">fusion</span><span class="special">::</span><span class="identifier">vector2</span><span class="special"><</span><span class="identifier">T0</span> <span class="special">&,</span> <span class="identifier">T1</span> <span class="special">&></span> <span class="identifier">env</span><span class="special">(</span><span class="identifier">t0</span><span class="special">,</span> <span class="identifier">t1</span><span class="special">);</span> + + <span class="keyword">return</span> <span class="identifier">eval</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">context</span><span class="special">(</span><span class="identifier">env</span><span class="special">,</span> <span class="identifier">default_actions</span><span class="special">()));</span> +<span class="special">}</span> +</pre> +<h5> +<a name="phoenix.inside.actor.h6"></a> + <span><a name="phoenix.inside.actor.result_of__actor"></a></span><a class="link" href="actor.html#phoenix.inside.actor.result_of__actor">result_of::actor</a> + </h5> +<p> + For reasons of symmetry to the family of <code class="computeroutput"><span class="identifier">actor</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> there is a special metafunction usable + for actor result type calculation named <code class="computeroutput"><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">actor</span></code>. + This metafunction allows us to directly specify the types of the parameters + to be passed to the <code class="computeroutput"><span class="identifier">actor</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> function. Here's a typical <code class="computeroutput"><span class="identifier">actor_result</span></code> that accepts two arguments: + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">result_of</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">actor</span> + <span class="special">{</span> + <span class="keyword">typedef</span> <span class="identifier">fusion</span><span class="special">::</span><span class="identifier">vector2</span><span class="special"><</span><span class="identifier">T0</span><span class="special">,</span> <span class="identifier">T1</span><span class="special">></span> <span class="identifier">env_tpe</span><span class="special">;</span> + <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">result_of</span><span class="special">::</span><span class="identifier">context</span><span class="special"><</span><span class="identifier">env_type</span><span class="special">,</span> <span class="identifier">default_actions</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">ctx_type</span> + <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">result_of</span><span class="special"><</span><span class="identifier">evaluator</span><span class="special">(</span><span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">ctx_type</span><span class="special">)>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span> + <span class="special">};</span> +<span class="special">}</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../inside.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="expression.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/custom_terminals.html b/libs/phoenix/doc/html/phoenix/inside/custom_terminals.html new file mode 100644 index 0000000000..6ac7a2486c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/custom_terminals.html @@ -0,0 +1,80 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Custom Terminals</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../inside.html" title="Inside Phoenix"> +<link rel="prev" href="rules.html" title="Predefined Expressions and Rules"> +<link rel="next" href="placeholder_unification.html" title="Placeholder Unification"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="rules.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="placeholder_unification.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.inside.custom_terminals"></a><a class="link" href="custom_terminals.html" title="Custom Terminals">Custom Terminals</a> +</h3></div></div></div> +<p> + Custom Terminals are used in Phoenix to handle special values transparently. + For example, as Phoenix captures everything by value, we needed to use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">reference_wrapper</span></code> to bring reference semantics + into Phoenix. + </p> +<p> + Custom terminals could be any wrapper class: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">is_custom_terminal</span><span class="special">;</span> +</pre> +<p> + needs to be specialized in order for Phoenix to recognize this wrapper type. + <code class="computeroutput"><span class="identifier">default_action</span></code> calls <code class="computeroutput"><span class="identifier">custom_terminal</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>. + </p> +<p> + Example: + </p> +<pre class="programlisting"><span class="comment">// Call out boost::reference_wrapper for special handling</span> +<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">is_custom_terminal</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">reference_wrapper</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> + <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> +<span class="special">{};</span> + +<span class="comment">// Special handling for boost::reference_wrapper</span> +<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">custom_terminal</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">reference_wrapper</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span> +<span class="special">{</span> + <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="special">&</span><span class="identifier">result_type</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">></span> + <span class="identifier">T</span> <span class="special">&</span><span class="keyword">operator</span><span class="special">()(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">reference_wrapper</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">r</span><span class="special">,</span> <span class="identifier">Context</span> <span class="special">&)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">r</span><span class="special">;</span> + <span class="special">}</span> +<span class="special">};</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="rules.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="placeholder_unification.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/expression.html b/libs/phoenix/doc/html/phoenix/inside/expression.html new file mode 100644 index 0000000000..c69d3efb42 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/expression.html @@ -0,0 +1,273 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Phoenix Expressions</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../inside.html" title="Inside Phoenix"> +<link rel="prev" href="actor.html" title="Actors in Detail"> +<link rel="next" href="expression/boilerplate_macros.html" title="Boilerplate Macros"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="actor.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="expression/boilerplate_macros.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.inside.expression"></a><a class="link" href="expression.html" title="Phoenix Expressions">Phoenix Expressions</a> +</h3></div></div></div> +<div class="toc"><dl><dt><span class="section"><a href="expression/boilerplate_macros.html">Boilerplate + Macros</a></span></dt></dl></div> +<p> + A Phoenix Expression is a model of the <a href="http://www.boost.org/doc/libs/release/doc/html/Expr.html" target="_top">Proto + Expression</a> Concept. These expressions are wrapped inside an <a class="link" href="actor.html" title="Actors in Detail">Actor</a> template. The <code class="computeroutput"><span class="identifier">actor</span></code> + provides the function call operator which evaluates the expressions. The + <code class="computeroutput"><span class="identifier">actor</span></code> is the domain specific + wrapper around Phoenix expressions. + </p> +<p> + By design, Phoenix Expressions do not carry any information on how they will + be evaluated later on. They are the data structure on which the <code class="computeroutput"><span class="identifier">Actions</span></code> will work. + </p> +<p> + The library provides a convenience template to define expressions: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span><span class="special">></span> <span class="identifier">Actor</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Tag</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">expr_ext</span> + <span class="special">:</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">transform</span><span class="special"><</span><span class="identifier">expr_ext</span><span class="special"><</span><span class="identifier">Actor</span><span class="special">,</span> <span class="identifier">Tag</span><span class="special">,</span> <span class="identifier">A0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">A1</span><span class="special">></span> <span class="special">></span> +<span class="special">{</span> + <span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">base_expr</span><span class="special">;</span> + <span class="keyword">typedef</span> <span class="identifier">Actor</span><span class="special"><</span><span class="identifier">base_expr</span><span class="special">></span> <span class="identifier">type</span><span class="special">;</span> + + <span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">proto_grammar</span><span class="special">;</span> + + <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">make</span><span class="special">(</span><span class="identifier">A0</span> <span class="identifier">a0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">A1</span> <span class="identifier">a1</span><span class="special">);</span> +<span class="special">};</span> + +<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Tag</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">expr</span> <span class="special">:</span> <span class="identifier">expr_ext</span><span class="special"><</span><span class="identifier">actor</span><span class="special">,</span> <span class="identifier">Tag</span><span class="special">,</span> <span class="identifier">A0</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">A1</span><span class="special">></span> <span class="special">{};</span> +</pre> +<p> + <span class="bold"><strong>Notation</strong></span> + </p> +<div class="variablelist"> +<p class="title"><b></b></p> +<dl> +<dt><span class="term"><code class="computeroutput"><span class="identifier">A0</span><span class="special">...</span><span class="identifier">AN</span></code></span></dt> +<dd><p> + Child node types + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">a0</span><span class="special">...</span><span class="identifier">aN</span></code></span></dt> +<dd><p> + Child node objects + </p></dd> +<dt><span class="term"><code class="computeroutput"><span class="identifier">G0</span><span class="special">...</span><span class="identifier">GN</span></code></span></dt> +<dd><p> + <a href="http://www.boost.org/doc/libs/release/libs/proto/index.html" target="_top">Boost.Proto</a> + grammar types + </p></dd> +</dl> +</div> +<p> + <span class="bold"><strong>Expression Semantics</strong></span> + </p> +<div class="informaltable"><table class="table"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Expression + </p> + </th> +<th> + <p> + Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expr</span><span class="special"><</span><span class="identifier">Tag</span><span class="special">,</span> + <span class="identifier">A0</span><span class="special">...</span><span class="identifier">AN</span><span class="special">>::</span><span class="identifier">type</span></code> + </p> + </td> +<td> + <p> + The type of Expression having tag <code class="computeroutput"><span class="identifier">Tag</span></code> + and <code class="computeroutput"><span class="identifier">A0</span><span class="special">...</span><span class="identifier">AN</span></code> children + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expr</span><span class="special"><</span><span class="identifier">Tag</span><span class="special">,</span> + <span class="identifier">G0</span><span class="special">...</span><span class="identifier">GN</span><span class="special">></span></code> + </p> + </td> +<td> + <p> + A <a href="http://www.boost.org/doc/libs/release/libs/proto/index.html" target="_top">Boost.Proto</a> + grammar and <a href="http://www.boost.org/doc/libs/release/doc/html/boost/proto/pass_through.html" target="_top">Proto + Pass Through Transform</a> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expr</span><span class="special"><</span><span class="identifier">Tag</span><span class="special">,</span> + <span class="identifier">A0</span><span class="special">...</span><span class="identifier">AN</span><span class="special">>::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">a0</span><span class="special">...</span><span class="identifier">aN</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + Returns a Phoenix Expression + </p> + </td> +</tr> +</tbody> +</table></div> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + You might have noticed the template template argument <code class="computeroutput"><span class="identifier">Actor</span></code> + used in <code class="computeroutput"><span class="identifier">expr_ext</span></code>. This + can be a user supplied custom Actor adding other member functions or objects + than the default <code class="computeroutput"><span class="identifier">actor</span></code> + template. See <a class="link" href="../examples/extending_actors.html" title="Extending Actors">Extending + Actors</a> for more details. + </p></td></tr> +</table></div> +<h5> +<a name="phoenix.inside.expression.h0"></a> + <span><a name="phoenix.inside.expression.meta_grammar"></a></span><a class="link" href="expression.html#phoenix.inside.expression.meta_grammar">meta_grammar</a> + </h5> +<p> + Defining expressions is only part of the game to make it a valid Phoenix + Expression. In order to use the expressions in the Phoenix domain, we need + to "register" them to our grammar. + </p> +<p> + The <code class="computeroutput"><span class="identifier">meta_grammar</span></code> is a struct + for exactly that purpose. It is an openly extendable <a href="http://www.boost.org/doc/libs/release/libs/proto/index.html" target="_top">Boost.Proto</a> + Grammar: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">meta_grammar</span> + <span class="special">:</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">switch_</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Tag</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Dummy</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">case_</span> + <span class="special">:</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">not_</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> + <span class="special">{};</span> +<span class="special">};</span> +</pre> +<p> + As you can see, by default the <code class="computeroutput"><span class="identifier">meta_grammar</span></code> + matches nothing. With every <a class="link" href="../modules.html" title="Modules">Module</a> + you include this grammar gets extended by various expressions. + </p> +<h5> +<a name="phoenix.inside.expression.h1"></a> + <span><a name="phoenix.inside.expression.example"></a></span><a class="link" href="expression.html#phoenix.inside.expression.example">Example</a> + </h5> +<p> + Define an expression: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">plus</span> + <span class="special">:</span> <span class="identifier">expr</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">plus</span><span class="special">,</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">></span> +<span class="special">{};</span> +</pre> +<p> + And add it to the grammar: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><></span> +<span class="keyword">struct</span> <span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">plus</span><span class="special">></span> + <span class="special">:</span> <span class="identifier">enable_rule</span><span class="special"><</span> + <span class="identifier">plus</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">></span> + <span class="special">></span> +<span class="special">{};</span> +</pre> +<p> + Define a generator function to make the life of our potential users easier: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">></span> +<span class="keyword">typename</span> <span class="identifier">plus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">>::</span><span class="identifier">type</span> +<span class="identifier">plus</span><span class="special">(</span><span class="identifier">Lhs</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">Rhs</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">>::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">rhs</span><span class="special">);</span> +<span class="special">}</span> +</pre> +<p> + Look if it really works: + </p> +<pre class="programlisting"><span class="identifier">plus</span><span class="special">(</span><span class="number">6</span><span class="special">,</span> <span class="number">5</span><span class="special">)();</span> +</pre> +<p> + returns 11! + </p> +<pre class="programlisting"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">display_expr</span><span class="special">(</span><span class="identifier">plus</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">));</span> +</pre> +<p> + prints: + </p> +<pre class="programlisting"><span class="identifier">plus</span><span class="special">(</span> + <span class="identifier">terminal</span><span class="special">(</span><span class="number">6</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">terminal</span><span class="special">(</span><span class="number">5</span><span class="special">)</span> +<span class="special">)</span> +</pre> +<p> + See <a href="../../../../example/define_expression.cpp" target="_top">define_expression.cpp</a> + for the full example. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + The example shown here only works because <code class="computeroutput"><span class="identifier">default_actions</span></code> + knows how to handle an expression having the <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">plus</span></code> + and two children. This is because <code class="computeroutput"><span class="identifier">default_actions</span></code> + uses the <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_default</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span></code> + transform to evaluate operators and functions. Learn more about actions + <a class="link" href="actions.html" title="More on Actions">here</a>. + </p></td></tr> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="actor.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="expression/boilerplate_macros.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/expression/boilerplate_macros.html b/libs/phoenix/doc/html/phoenix/inside/expression/boilerplate_macros.html new file mode 100644 index 0000000000..e64f1f9f56 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/expression/boilerplate_macros.html @@ -0,0 +1,515 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Boilerplate Macros</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../expression.html" title="Phoenix Expressions"> +<link rel="prev" href="../expression.html" title="Phoenix Expressions"> +<link rel="next" href="../actions.html" title="More on Actions"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../expression.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../expression.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../actions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.inside.expression.boilerplate_macros"></a><a class="link" href="boilerplate_macros.html" title="Boilerplate Macros">Boilerplate + Macros</a> +</h4></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression">BOOST_PHOENIX_DEFINE_EXPRESSION</a></span></dt> +<dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</a></span></dt> +<dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</a></span></dt> +<dt><span class="section"><a href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</a></span></dt> +</dl></div> +<p> + When having more and more expressions, you start to realize that this is + a very repetetive task. Phoenix provides boilerplate macros that make defining + Phoenix Expressions as you have seen in the <a class="link" href="../expression.html" title="Phoenix Expressions">previous + section</a> look like a piece of cake. + </p> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression" title="BOOST_PHOENIX_DEFINE_EXPRESSION">BOOST_PHOENIX_DEFINE_EXPRESSION</a> +</h5></div></div></div> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.h0"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.description"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span></code> + is a macro that can be used to generate all the necessary boilerplate + to create Phoenix Expressions + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.h1"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.synopsis"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span><span class="special">(</span> + <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span> + <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span> + <span class="special">...</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.h2"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.semantics"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.semantics">Semantics</a> + </h6> +<p> + The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>. + The sequence of <code class="computeroutput"><span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span></code> declares how many children the expression + will have and what <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">grammar</span></code> + they match. + </p> +<p> + The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code> + shall be the sequence of namespaces under which the following symbols + will be defined: + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">expression</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special"><</span> + <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span> + <span class="special">,</span> <span class="identifier">A0</span> + <span class="special">,</span> <span class="identifier">A1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">AN</span> + <span class="special">></span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">rule</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special"><</span> + <span class="identifier">child_grammar0</span> + <span class="special">,</span> <span class="identifier">child_grammar1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">child_grammarN</span> + <span class="special">></span> + <span class="special">{};</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">functional</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">result_of</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node</span> +<span class="special">}</span> + +<span class="comment">// convenience polymorphic function to create an expression node</span> +<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special"><</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">an</span><span class="special">);</span> +</pre> +<p> + This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special"><</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">></span></code> to enable the rule for further use + in actions. + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.h3"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.header"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.h4"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.example"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression.example">Example</a> + </h6> +<p> + The example from the previous section can be rewritten as: + </p> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION</span><span class="special">(</span> + <span class="special">(</span><span class="identifier">plus</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Lhs</span> + <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Rhs</span> +<span class="special">)</span> + +<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Lhs</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Rhs</span><span class="special">></span> +<span class="keyword">typename</span> <span class="identifier">plus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">>::</span><span class="identifier">type</span> +<span class="identifier">plus</span><span class="special">(</span><span class="identifier">Lhs</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">Rhs</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">rhs</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> <span class="identifier">Rhs</span><span class="special">>::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">rhs</span><span class="special">);</span> +<span class="special">}</span> +</pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg" title="BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</a> +</h5></div></div></div> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.h0"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.description"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</span></code> + is a macro that can be used to generate all the necessary boilerplate + to create Phoenix Expressions + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.h1"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.synopsis"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</span><span class="special">(</span> + <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span> + <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span> + <span class="special">...</span> + <span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">N</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.h2"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.semantics"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.semantics">Semantics</a> + </h6> +<p> + The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>. + <code class="computeroutput"><span class="identifier">N</span></code> is the maximum number + of variable children. All but the last elements in the grammar sequence + are required children of the expression, and the last denotes a variable + number of children. The number of children an expression of this kind + can hold is therefor <code class="computeroutput"><span class="identifier">N</span><span class="special">-</span><span class="number">1</span></code> plus + the size of the sequence + </p> +<p> + The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code> + shall be the sequence of namespaces under which the following symbols + will be defined: + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">expression</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special"><</span> + <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span> + <span class="special">,</span> <span class="identifier">A0</span> + <span class="special">,</span> <span class="identifier">A1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">AN</span> + <span class="special">></span> + <span class="special">{};</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">rule</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">name</span><span class="special"><</span> + <span class="identifier">child_grammar0</span> + <span class="special">,</span> <span class="identifier">child_grammar1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">vararg</span><span class="special"><</span><span class="identifier">child_grammarN</span><span class="special">></span> + <span class="special">></span> + <span class="special">{};</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">functional</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">result_of</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node</span> +<span class="special">}</span> + +<span class="comment">// convenience polymorphic function to create an expression node</span> +<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special"><</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">an</span><span class="special">);</span> +</pre> +<p> + This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special"><</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">></span></code> to enable the rule for further use + in actions. + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.h3"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.header"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.h4"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.example"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_vararg.example">Example</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG</span><span class="special">(</span> + <span class="special">(</span><span class="identifier">boost</span><span class="special">)(</span><span class="identifier">phoenix</span><span class="special">)(</span><span class="identifier">mem_fun_ptr</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Pointer to Object</span> + <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Member pointer</span> + <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Variable number of arguments</span> + <span class="special">,</span> <span class="identifier">BOOST_PHOENIX_LIMIT</span> +<span class="special">)</span> +</pre> +<p> + This defines the member function pointer operator expression as described + in <a class="link" href="../../modules/operator.html" title="Operator">operators</a>. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext" title="BOOST_PHOENIX_DEFINE_EXPRESSION_EXT">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</a> +</h5></div></div></div> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.h0"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.description"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</span></code> + is a macro that can be used to generate all the necessary boilerplate + to create Phoenix Expressions + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.h1"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.synopsis"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</span><span class="special">(</span> + <span class="identifier">actor</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span> + <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span> + <span class="special">...</span> + <span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">N</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.h2"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.semantics"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.semantics">Semantics</a> + </h6> +<p> + The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>. + The sequence of <code class="computeroutput"><span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span></code> declares how many children the expression + will have and what <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">grammar</span></code> + they match. + </p> +<p> + The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code> + shall be the sequence of namespaces under which the following symbols + will be defined: + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">expression</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr_ext</span><span class="special"><</span> + <span class="identifier">actor</span> + <span class="special">,</span> <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span> + <span class="special">,</span> <span class="identifier">A0</span> + <span class="special">,</span> <span class="identifier">A1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">AN</span> + <span class="special">></span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">rule</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr</span><span class="special"><</span> + <span class="identifier">child_grammar0</span> + <span class="special">,</span> <span class="identifier">child_grammar1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">child_grammarN</span> + <span class="special">></span> + <span class="special">{};</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">functional</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">result_of</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node</span> +<span class="special">}</span> + +<span class="comment">// convenience polymorphic function to create an expression node</span> +<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special"><</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">an</span><span class="special">);</span> +</pre> +<p> + This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special"><</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">></span></code> to enable the rule for further use + in actions. + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.h3"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.header"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.h4"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.example"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext.example">Example</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT</span><span class="special">(</span> + <span class="identifier">if_actor</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">)(</span><span class="identifier">phoenix</span><span class="special">)(</span><span class="identifier">if_</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Cond</span> + <span class="special">(</span><span class="identifier">meta_grammar</span><span class="special">)</span> <span class="comment">// Then</span> +<span class="special">)</span> +</pre> +<p> + This defines the if_ expression. The custom actor defines <code class="computeroutput"><span class="identifier">else_</span></code> as a member. + </p> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg"></a><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg" title="BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</a> +</h5></div></div></div> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.h0"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.description"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</span></code> + is a macro that can be used to generate all the necessary boilerplate + to create Phoenix Expressions + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.h1"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.synopsis"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG</span><span class="special">(</span> + <span class="identifier">actor</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">namespace_seq</span><span class="special">)(</span><span class="identifier">name</span><span class="special">)</span> + <span class="special">,</span> <span class="special">(</span><span class="identifier">child_grammar0</span><span class="special">)</span> + <span class="special">(</span><span class="identifier">child_grammar1</span><span class="special">)</span> + <span class="special">...</span> + <span class="special">(</span><span class="identifier">child_grammarN</span><span class="special">)</span> + <span class="special">,</span> <span class="identifier">N</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.h2"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.semantics"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.semantics">Semantics</a> + </h6> +<p> + The above macro generates the necessary code for an expression <code class="computeroutput"><span class="identifier">name</span></code> in namespace <code class="computeroutput"><span class="identifier">namespace_seq</span></code>. + <code class="computeroutput"><span class="identifier">N</span></code> is the maximum number + of variable children. All but the last elements in the grammar sequence + are required children of the expression, and the last denotes a variable + number of children. The number of children an expression of this kind + can hold is therefor <code class="computeroutput"><span class="identifier">N</span><span class="special">-</span><span class="number">1</span></code> plus + the size of the sequence + </p> +<p> + The macro should be used at global scope. <code class="computeroutput"><span class="identifier">namespace_seq</span></code> + shall be the sequence of namespaces under which the following symbols + will be defined: + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">tag</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span><span class="special">;</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">expression</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">expr_ext</span><span class="special"><</span> + <span class="identifier">actor</span> + <span class="special">,</span> <span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span> + <span class="special">,</span> <span class="identifier">A0</span> + <span class="special">,</span> <span class="identifier">A1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">AN</span> + <span class="special">></span> + <span class="special">{};</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">rule</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">name</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">name</span><span class="special"><</span> + <span class="identifier">child_grammar0</span> + <span class="special">,</span> <span class="identifier">child_grammar1</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">vararg</span><span class="special"><</span><span class="identifier">child_grammarN</span><span class="special">></span> + <span class="special">></span> + <span class="special">{};</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">functional</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// A polymorphic function object that can be called to create the expression node</span> +<span class="special">}</span> + +<span class="keyword">namespace</span> <span class="identifier">result_of</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">make_name</span><span class="special">;</span> <span class="comment">// The result type of the expression node</span> +<span class="special">}</span> + +<span class="comment">// convenience polymorphic function to create an expression node</span> +<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="keyword">typename</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_name</span><span class="special"><</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="special">...</span> <span class="identifier">AN</span><span class="special">></span> +<span class="identifier">make_name</span><span class="special">(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a1</span> <span class="special">...</span> <span class="identifier">AN</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">an</span><span class="special">);</span> +</pre> +<p> + This macros also adds a specialization for <code class="computeroutput"><span class="identifier">meta_grammar</span><span class="special">::</span><span class="identifier">case_</span><span class="special"><</span><span class="identifier">tag</span><span class="special">::</span><span class="identifier">name</span><span class="special">></span></code> to enable the rule for further use + in actions. + </p> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.h3"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.header"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">expression</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.h4"></a> + <span><a name="phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.example"></a></span><a class="link" href="boilerplate_macros.html#phoenix.inside.expression.boilerplate_macros.boost_phoenix_define_expression_ext_vararg.example">Example</a> + </h6> +<p> + TBD + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../expression.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../expression.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../actions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/placeholder_unification.html b/libs/phoenix/doc/html/phoenix/inside/placeholder_unification.html new file mode 100644 index 0000000000..ca86b8cf3d --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/placeholder_unification.html @@ -0,0 +1,56 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Placeholder Unification</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../inside.html" title="Inside Phoenix"> +<link rel="prev" href="custom_terminals.html" title="Custom Terminals"> +<link rel="next" href="../examples.html" title="Advanced Examples"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="custom_terminals.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../examples.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.inside.placeholder_unification"></a><a class="link" href="placeholder_unification.html" title="Placeholder Unification">Placeholder Unification</a> +</h3></div></div></div> +<p> + Phoenix uses <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_placeholder</span></code> for recognizing placeholders: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> +<span class="keyword">struct</span> <span class="identifier">is_placeholder</span> +<span class="special">{</span> + <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + To adapt your own placeholder, the nested value needs to be greater than + 0 for your types. This is done by specializing this trait. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="custom_terminals.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../examples.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/inside/rules.html b/libs/phoenix/doc/html/phoenix/inside/rules.html new file mode 100644 index 0000000000..72517718d9 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/inside/rules.html @@ -0,0 +1,1314 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Predefined Expressions and Rules</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../inside.html" title="Inside Phoenix"> +<link rel="prev" href="actions.html" title="More on Actions"> +<link rel="next" href="custom_terminals.html" title="Custom Terminals"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="actions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="custom_terminals.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.inside.rules"></a><a class="link" href="rules.html" title="Predefined Expressions and Rules">Predefined Expressions and Rules</a> +</h3></div></div></div> +<p> + This section is the "behind the scenes" counter part of the <a class="link" href="../modules.html" title="Modules">Modules</a> section. A listing of all the predefined + expressions and rules: + </p> +<div class="informaltable"><table class="table"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Expression + </p> + </th> +<th> + <p> + Rule + </p> + </th> +<th> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">value</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">custom_terminal</span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="identifier">N</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">argument</span></pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">custom_terminal</span></pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">F</span><span class="special">,</span> + <span class="identifier">A0</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">AN</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">function</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="identifier">vararg</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">negate</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">negate</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">negate</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">unary_plus</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">negate</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">unary_plus</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">pre_inc</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">negate</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">pre_inc</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">pre_dec</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">negate</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">pre_dec</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">post_inc</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">negate</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">post_inc</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">post_dec</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">negate</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">post_dec</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">plus_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">minus_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">minus_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">minus_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">multiplies_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">multiplies_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">multiplies_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">divides_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">divides_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">divides_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">modules_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">modules_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">modules_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">plus</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">plus</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">minus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">minus</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">minus</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">multiplies</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">multiplies</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">multiplies</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">divides</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">divides</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">divides</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">modulus</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">modulus</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">modulus</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">complement</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">complement</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">complement</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_and_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">bitwise_and_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_and_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_or_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">bitwise_or_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_or_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_xor_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">bitwise_xor_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_xor_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_left_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">shift_left_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_left_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_right_assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">shift_right_assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_right_assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_and</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">bitwise_and</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_and</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_or</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">bitwise_or</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_or</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_xor</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">bitwise_xor</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">bitwise_xor</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_left</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">shift_left</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_left</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_right</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">shift_right</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">shift_right</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">equal_to</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">not_equal_to</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">not_equal_to</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">not_equal_to</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">less_equal_to</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">less_equal_to</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">less_equal_to</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">greater_equal</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">greater_equal</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">greater_equal</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">less</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">greater</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">greater</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">greater</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">if_else_operator</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Then</span><span class="special">,</span> + <span class="identifier">Else</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">if_else</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">if_else</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">logical_not</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">logical_not</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">logical_not</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">logical_and</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">logical_and</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">logical_and</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">logical_or</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">logical_or</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">logical_or</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">mem_fun_ptr</span><span class="special"><</span><span class="identifier">Object</span><span class="special">,</span> + <span class="identifier">MemPtr</span><span class="special">,</span> + <span class="identifier">A0</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">AN</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">mem_fun_ptr</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">mem_fun_ptr</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">vararg</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">address_of</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">address_of</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">address_of</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">dereference</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">dereference</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">dereference</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">assign</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">assign</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">assign</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">subscript</span><span class="special"><</span><span class="identifier">Lhs</span><span class="special">,</span> + <span class="identifier">Rhs</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">subscript</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">subscript</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">A0</span><span class="special">,</span> + <span class="identifier">A1</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">sequence</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">sequence</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">if_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Then</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">if_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">if_</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">if_else_statement</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Then</span><span class="special">,</span> + <span class="identifier">Else</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">if_else_statement</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">if_else_statement</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">switch_case</span><span class="special"><</span><span class="identifier">Label</span><span class="special">,</span> + <span class="identifier">Statement</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">switch_case</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">switch_case</span><span class="special"><</span> <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span><span class="special"><</span><span class="identifier">N</span><span class="special">></span> <span class="special">>,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">switch_default_case</span><span class="special"><</span><span class="identifier">Statement</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">switch_default_case</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">switch_default_case</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">switch_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Cases</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">switch_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">switch_</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">switch_grammar</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Do</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">while_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">while_</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">do_while</span><span class="special"><</span><span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Do</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">do_while</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">do_while</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">for_</span><span class="special"><</span><span class="identifier">Init</span><span class="special">,</span> + <span class="identifier">Cond</span><span class="special">,</span> + <span class="identifier">Step</span><span class="special">,</span> + <span class="identifier">Do</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">for_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">for_</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">Exception</span><span class="special">,</span> + <span class="identifier">Statement</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">catch_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">catch_</span><span class="special"><</span> + <span class="identifier">catch_exception</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> + <span class="special">,</span> <span class="identifier">meta_grammar</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">catch_all</span><span class="special"><</span><span class="identifier">Statement</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">catch_all</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">try_catch</span><span class="special"><</span><span class="identifier">Try</span><span class="special">,</span> + <span class="identifier">Catch0</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">CatchN</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">try_catch</span> + <span class="special">:</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">or_</span><span class="special"><</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">try_catch</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">vararg</span><span class="special"><</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">catch_</span><span class="special">></span> + <span class="special">></span> + <span class="special">,</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">try_catch</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">vararg</span><span class="special"><</span><span class="identifier">rule</span><span class="special">::</span><span class="identifier">catch_</span><span class="special">></span> + <span class="special">,</span> <span class="identifier">rule</span><span class="special">::</span><span class="identifier">catch_all</span> + <span class="special">></span> + <span class="special">,</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">try_catch</span><span class="special"><</span> + <span class="identifier">meta_grammar</span> + <span class="special">,</span> <span class="identifier">catch_all</span> + <span class="special">></span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">throw_</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">throw_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">throw_</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">construct</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> + <span class="identifier">A0</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">AN</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">construct</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">construct</span><span class="special"><</span> + <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">target</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span> + <span class="special">,</span> <span class="identifier">A0</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">AN</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">new_</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> + <span class="identifier">A0</span><span class="special">,</span> + <span class="special">...,</span> <span class="identifier">AN</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">new_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">new_</span><span class="special"><</span> + <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">target</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span> + <span class="special">,</span> <span class="identifier">A0</span> + <span class="special">...</span> + <span class="special">,</span> <span class="identifier">AN</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">delete_</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">delete_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">delete_</span><span class="special"><</span><span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">static_cast_</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> + <span class="identifier">A</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">static_cast_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">static_cast_</span><span class="special"><</span> + <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">target</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span> + <span class="special">,</span> <span class="identifier">A</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">dynamic_cast_</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> + <span class="identifier">A</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">dynamic_cast_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">dynamic_cast_</span><span class="special"><</span> + <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">target</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span> + <span class="special">,</span> <span class="identifier">A</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">reinterpret_cast_</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> + <span class="identifier">A</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">reinterpret_cast_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">reinterpret_cast_</span><span class="special"><</span> + <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">target</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span> + <span class="special">,</span> <span class="identifier">A</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">const_cast_</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> + <span class="identifier">A</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">const_cast_</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">const_cast_</span><span class="special"><</span> + <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">target</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span> + <span class="special">,</span> <span class="identifier">A</span> + <span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">local_variable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">></span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">custom_terminal</span></pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">let</span><span class="special"><</span><span class="identifier">Locals</span><span class="special">,</span> + <span class="identifier">Statement</span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">let</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">let</span><span class="special"><</span><span class="identifier">terminal</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">>,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">lambda</span><span class="special"><</span><span class="identifier">OuterEnv</span><span class="special">,</span> + <span class="identifier">Locals</span><span class="special">,</span> + <span class="identifier">Statement</span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">lambda</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">lambda</span><span class="special"><</span><span class="identifier">terminal</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">>,</span> <span class="identifier">terminal</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">>,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">lambda_actor</span><span class="special"><</span><span class="identifier">Locals</span><span class="special">,</span> + <span class="identifier">Statement</span></code> + </p> + </td> +<td> + <p> +</p> +<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">rule</span><span class="special">::</span><span class="identifier">lambda_actor</span> + <span class="special">:</span> <span class="identifier">expression</span><span class="special">::</span><span class="identifier">lambda_actor</span><span class="special"><</span><span class="identifier">terminal</span><span class="special"><</span><span class="identifier">proto</span><span class="special">::</span><span class="identifier">_</span><span class="special">>,</span> <span class="identifier">meta_grammar</span><span class="special">></span> +</pre> +<p> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="actions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../inside.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="custom_terminals.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/introduction.html b/libs/phoenix/doc/html/phoenix/introduction.html new file mode 100644 index 0000000000..94cfc15cf3 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/introduction.html @@ -0,0 +1,70 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Introduction</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="what_s_new/phoenix_3_0.html" title="Phoenix 3.0"> +<link rel="next" href="starter_kit.html" title="Starter Kit"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="what_s_new/phoenix_3_0.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="starter_kit.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.introduction"></a><a class="link" href="introduction.html" title="Introduction">Introduction</a> +</h2></div></div></div> +<p> + <span class="inlinemediaobject"><img src="../images/banner.png" alt="banner"></span> + </p> +<p> + The Phoenix library enables FP techniques such as higher order functions, + <span class="emphasis"><em>lambda</em></span> (unnamed functions), <span class="emphasis"><em>currying</em></span> + (partial function application) and lazy evaluation in C++. The focus is more + on usefulness and practicality than purity, elegance and strict adherence to + FP principles. + </p> +<p> + FP is a programming discipline that is not at all tied to a specific language. + FP as a programming discipline can, in fact, be applied to many programming + languages. In the realm of C++ for instance, we are seeing more FP techniques + being applied. C++ is sufficiently rich to support at least some of the most + important facets of FP. C++ is a multiparadigm programming language. It is + not only procedural. It is not only object oriented. Beneath the core of the + standard C++ library, a closer look into STL gives us a glimpse of FP already + in place. It is obvious that the authors of STL know and practice FP. In the + near future, we shall surely see more FP trickle down into the mainstream. + </p> +<p> + The truth is, most of the FP techniques can coexist quite well with the standard + object oriented and imperative programming paradigms. When we are using STL + algorithms and functors (function objects) for example, we are already doing + FP. Phoenix is an evolutionary next step. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="what_s_new/phoenix_3_0.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="starter_kit.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules.html b/libs/phoenix/doc/html/phoenix/modules.html new file mode 100644 index 0000000000..433689e34f --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules.html @@ -0,0 +1,101 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Modules</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="actor.html" title="Actor"> +<link rel="next" href="modules/core.html" title="Core"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="actor.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="modules/core.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.modules"></a><a class="link" href="modules.html" title="Modules">Modules</a> +</h2></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="modules/core.html">Core</a></span></dt> +<dd><dl> +<dt><span class="section"><a href="modules/core/values.html">Values</a></span></dt> +<dt><span class="section"><a href="modules/core/references.html">References</a></span></dt> +<dt><span class="section"><a href="modules/core/arguments.html">Arguments</a></span></dt> +<dt><span class="section"><a href="modules/core/nothing.html">Nothing</a></span></dt> +</dl></dd> +<dt><span class="section"><a href="modules/function.html">Function</a></span></dt> +<dd><dl><dt><span class="section"><a href="modules/function/adapting_functions.html">Adapting + Functions</a></span></dt></dl></dd> +<dt><span class="section"><a href="modules/operator.html">Operator</a></span></dt> +<dt><span class="section"><a href="modules/statement.html">Statement</a></span></dt> +<dd><dl> +<dt><span class="section"><a href="modules/statement/block_statement.html">Block Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/if__statement.html">if_ Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/___if_else_____statement.html">if_else_ Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/switch__statement.html">switch_ + Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/while__statement.html">while_ + Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/___do_while_____statement.html">do_while_ Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/for_statement.html">for_ Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/try__catch__statement.html">try_ + catch_ Statement</a></span></dt> +<dt><span class="section"><a href="modules/statement/throw_.html">throw_</a></span></dt> +</dl></dd> +<dt><span class="section"><a href="modules/object.html">Object</a></span></dt> +<dd><dl> +<dt><span class="section"><a href="modules/object/construction.html">Construction</a></span></dt> +<dt><span class="section"><a href="modules/object/new.html">New</a></span></dt> +<dt><span class="section"><a href="modules/object/delete.html">Delete</a></span></dt> +<dt><span class="section"><a href="modules/object/casts.html">Casts</a></span></dt> +</dl></dd> +<dt><span class="section"><a href="modules/scope.html">Scope</a></span></dt> +<dd><dl> +<dt><span class="section"><a href="modules/scope/local_variables.html">Local Variables</a></span></dt> +<dt><span class="section"><a href="modules/scope/let.html">let</a></span></dt> +<dt><span class="section"><a href="modules/scope/lambda.html">lambda</a></span></dt> +</dl></dd> +<dt><span class="section"><a href="modules/bind.html">Bind</a></span></dt> +<dd><dl> +<dt><span class="section"><a href="modules/bind/binding_function_objects.html">Binding + Function Objects</a></span></dt> +<dt><span class="section"><a href="modules/bind/binding_functions.html">Binding Functions</a></span></dt> +<dt><span class="section"><a href="modules/bind/binding_member_functions.html">Binding + Member Functions</a></span></dt> +<dt><span class="section"><a href="modules/bind/binding_member_variables.html">Binding + Member Variables</a></span></dt> +<dt><span class="section"><a href="modules/bind/compatibility_with_boost_bind.html">Compatibility + with Boost.Bind</a></span></dt> +</dl></dd> +<dt><span class="section"><a href="modules/stl.html">STL</a></span></dt> +<dd><dl> +<dt><span class="section"><a href="modules/stl/container.html">Container</a></span></dt> +<dt><span class="section"><a href="modules/stl/algorithm.html">Algorithm</a></span></dt> +</dl></dd> +</dl></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="actor.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="modules/core.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/bind.html b/libs/phoenix/doc/html/phoenix/modules/bind.html new file mode 100644 index 0000000000..5ae628a60c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/bind.html @@ -0,0 +1,80 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Bind</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="scope/lambda.html" title="lambda"> +<link rel="next" href="bind/binding_function_objects.html" title="Binding Function Objects"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="scope/lambda.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="bind/binding_function_objects.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.bind"></a><a class="link" href="bind.html" title="Bind">Bind</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="bind/binding_function_objects.html">Binding + Function Objects</a></span></dt> +<dt><span class="section"><a href="bind/binding_functions.html">Binding Functions</a></span></dt> +<dt><span class="section"><a href="bind/binding_member_functions.html">Binding + Member Functions</a></span></dt> +<dt><span class="section"><a href="bind/binding_member_variables.html">Binding + Member Variables</a></span></dt> +<dt><span class="section"><a href="bind/compatibility_with_boost_bind.html">Compatibility + with Boost.Bind</a></span></dt> +</dl></div> +<p> + <span class="emphasis"><em>Binding</em></span> is the act of tying together a function to some + arguments for deferred (lazy) evaluation. Named <a class="link" href="function.html" title="Function">lazy + functions</a> require a bit of typing. Unlike (unnamed) lambda expressions, + we need to write a functor somewhere offline, detached from the call site. + If you wish to transform a plain function, member function or member variable + to a lambda expression, <code class="computeroutput"><span class="identifier">bind</span></code> + is your friend. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + Take note that binding functions, member functions or member variables + is monomorphic. Rather than binding functions, the preferred way is to + write true generic and polymorphic <a class="link" href="function.html" title="Function">lazy + functions</a>. + </p></td></tr> +</table></div> +<p> + There is a set of overloaded <code class="computeroutput"><span class="identifier">bind</span></code> + template functions. Each <code class="computeroutput"><span class="identifier">bind</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> + function generates a suitable binder object. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="scope/lambda.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="bind/binding_function_objects.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/bind/binding_function_objects.html b/libs/phoenix/doc/html/phoenix/modules/bind/binding_function_objects.html new file mode 100644 index 0000000000..99e9b5ece0 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/bind/binding_function_objects.html @@ -0,0 +1,56 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Binding Function Objects</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../bind.html" title="Bind"> +<link rel="prev" href="../bind.html" title="Bind"> +<link rel="next" href="binding_functions.html" title="Binding Functions"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../bind.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.bind.binding_function_objects"></a><a class="link" href="binding_function_objects.html" title="Binding Function Objects">Binding + Function Objects</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind_function_object</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Binding function objects serves two purposes: * Partial function application + * Quick adaption of already existing function objects + </p> +<p> + In order to deduce the return type of the function object, it has to implement + the <a href="http://www.boost.org/doc/libs/release/libs/utility/utility.htm#result_of" target="_top">Boost.Result + Of</a> protocol. If the bound function object is polymorphic, the resulting + binding object is polymorphic. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../bind.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/bind/binding_functions.html b/libs/phoenix/doc/html/phoenix/modules/bind/binding_functions.html new file mode 100644 index 0000000000..3242198701 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/bind/binding_functions.html @@ -0,0 +1,69 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Binding Functions</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../bind.html" title="Bind"> +<link rel="prev" href="binding_function_objects.html" title="Binding Function Objects"> +<link rel="next" href="binding_member_functions.html" title="Binding Member Functions"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_function_objects.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_member_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.bind.binding_functions"></a><a class="link" href="binding_functions.html" title="Binding Functions">Binding Functions</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Example, given a function <code class="computeroutput"><span class="identifier">foo</span></code>: + </p> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">)</span> +<span class="special">{</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">n</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> +<span class="special">}</span> +</pre> +<p> + Here's how the function <code class="computeroutput"><span class="identifier">foo</span></code> + may be bound: + </p> +<pre class="programlisting"><span class="identifier">bind</span><span class="special">(&</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">)</span> +</pre> +<p> + This is now a full-fledged expression that can finally be evaluated by + another function call invocation. A second function call will invoke the + actual <code class="computeroutput"><span class="identifier">foo</span></code> function. Example: + </p> +<pre class="programlisting"><span class="identifier">bind</span><span class="special">(&</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">)(</span><span class="number">4</span><span class="special">);</span> +</pre> +<p> + will print out "4". + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_function_objects.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_member_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_functions.html b/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_functions.html new file mode 100644 index 0000000000..3eb567d41c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_functions.html @@ -0,0 +1,72 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Binding Member Functions</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../bind.html" title="Bind"> +<link rel="prev" href="binding_functions.html" title="Binding Functions"> +<link rel="next" href="binding_member_variables.html" title="Binding Member Variables"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_functions.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_member_variables.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.bind.binding_member_functions"></a><a class="link" href="binding_member_functions.html" title="Binding Member Functions">Binding + Member Functions</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind_member_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Binding member functions can be done similarly. A bound member function + takes in a pointer or reference to an object as the first argument. For + instance, given: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">xyz</span> +<span class="special">{</span> + <span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">xyz</span></code>'s <code class="computeroutput"><span class="identifier">foo</span></code> + member function can be bound as: + </p> +<pre class="programlisting"><span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// obj is an xyz object</span> +</pre> +<p> + Take note that a lazy-member functions expects the first argument to be + a pointer or reference to an object. Both the object (reference or pointer) + and the arguments can be lazily bound. Examples: + </p> +<pre class="programlisting"><span class="identifier">xyz</span> <span class="identifier">obj</span><span class="special">;</span> +<span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="comment">// arg1.foo(arg2)</span> +<span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// obj.foo(arg1)</span> +<span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">,</span> <span class="number">100</span><span class="special">)</span> <span class="comment">// obj.foo(100)</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_functions.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="binding_member_variables.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_variables.html b/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_variables.html new file mode 100644 index 0000000000..295fecc874 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_variables.html @@ -0,0 +1,74 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Binding Member Variables</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../bind.html" title="Bind"> +<link rel="prev" href="binding_member_functions.html" title="Binding Member Functions"> +<link rel="next" href="compatibility_with_boost_bind.html" title="Compatibility with Boost.Bind"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_member_functions.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="compatibility_with_boost_bind.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.bind.binding_member_variables"></a><a class="link" href="binding_member_variables.html" title="Binding Member Variables">Binding + Member Variables</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">bind</span><span class="special">/</span><span class="identifier">bind_member_variable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Member variables can also be bound much like member functions. Member variables + are not functions. Yet, like the <a class="link" href="../core/references.html" title="References"><code class="computeroutput"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code></a> + that acts like a nullary function returning a reference to the data, member + variables, when bound, act like a unary function, taking in a pointer or + reference to an object as its argument and returning a reference to the + bound member variable. For instance, given: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">xyz</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">v</span><span class="special">;</span> +<span class="special">};</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">v</span></code> can be bound as: + </p> +<pre class="programlisting"><span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">)</span> <span class="comment">// obj is an xyz object</span> +</pre> +<p> + As noted, just like the bound member function, a bound member variable + also expects the first (and only) argument to be a pointer or reference + to an object. The object (reference or pointer) can be lazily bound. Examples: + </p> +<pre class="programlisting"><span class="identifier">xyz</span> <span class="identifier">obj</span><span class="special">;</span> +<span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// arg1.v</span> +<span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">obj</span><span class="special">)</span> <span class="comment">// obj.v</span> +<span class="identifier">bind</span><span class="special">(&</span><span class="identifier">xyz</span><span class="special">::</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">arg1</span><span class="special">)(</span><span class="identifier">obj</span><span class="special">)</span> <span class="special">=</span> <span class="number">4</span> <span class="comment">// obj.v = 4</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_member_functions.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="compatibility_with_boost_bind.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/bind/compatibility_with_boost_bind.html b/libs/phoenix/doc/html/phoenix/modules/bind/compatibility_with_boost_bind.html new file mode 100644 index 0000000000..706047fa4f --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/bind/compatibility_with_boost_bind.html @@ -0,0 +1,52 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Compatibility with Boost.Bind</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../bind.html" title="Bind"> +<link rel="prev" href="binding_member_variables.html" title="Binding Member Variables"> +<link rel="next" href="../stl.html" title="STL"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_member_variables.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../stl.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.bind.compatibility_with_boost_bind"></a><a class="link" href="compatibility_with_boost_bind.html" title="Compatibility with Boost.Bind">Compatibility + with Boost.Bind</a> +</h4></div></div></div> +<p> + <code class="computeroutput"><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">bind</span></code> passes all testcases of the Boost.Bind + library. It is therefore completely compatible and interchangeable. + </p> +<p> + Given the compatibility with Boost.Bind, we also assume compatibility with + std::tr1::bind and std::bind from the upcoming C++0x standard. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="binding_member_variables.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../bind.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../stl.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/core.html b/libs/phoenix/doc/html/phoenix/modules/core.html new file mode 100644 index 0000000000..aa41232536 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/core.html @@ -0,0 +1,59 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Core</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="../modules.html" title="Modules"> +<link rel="next" href="core/values.html" title="Values"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../modules.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="core/values.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.core"></a><a class="link" href="core.html" title="Core">Core</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="core/values.html">Values</a></span></dt> +<dt><span class="section"><a href="core/references.html">References</a></span></dt> +<dt><span class="section"><a href="core/arguments.html">Arguments</a></span></dt> +<dt><span class="section"><a href="core/nothing.html">Nothing</a></span></dt> +</dl></div> +<p> + Actors are composed to create more complex actors in a tree-like hierarchy. + The primitives are atomic entities that are like the leaves in the tree. + Phoenix is extensible. New primitives can be added anytime. Right out of + the box, there are only a few primitives, these are all defined in the Core + module. + </p> +<p> + This section shall deal with these preset primitives. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../modules.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="core/values.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/core/arguments.html b/libs/phoenix/doc/html/phoenix/modules/core/arguments.html new file mode 100644 index 0000000000..991dd926a7 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/core/arguments.html @@ -0,0 +1,194 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Arguments</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../core.html" title="Core"> +<link rel="prev" href="references.html" title="References"> +<link rel="next" href="nothing.html" title="Nothing"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="references.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="nothing.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.core.arguments"></a><a class="link" href="arguments.html" title="Arguments">Arguments</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">argument</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + We use an instance of: + </p> +<pre class="programlisting"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="identifier">N</span><span class="special">>::</span><span class="identifier">type</span> +</pre> +<p> + to represent the Nth function argument. The argument placeholder acts as + an imaginary data-bin where a function argument will be placed. + </p> +<h6> +<a name="phoenix.modules.core.arguments.h0"></a> + <span><a name="phoenix.modules.core.arguments.predefined_arguments"></a></span><a class="link" href="arguments.html#phoenix.modules.core.arguments.predefined_arguments">Predefined + Arguments</a> + </h6> +<p> + There are a few predefined instances of <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="identifier">N</span><span class="special">>::</span><span class="identifier">type</span></code> + named <code class="computeroutput"><span class="identifier">arg1</span></code>..<code class="computeroutput"><span class="identifier">argN</span></code>, and its <a href="http://www.boost.org/libs/lambda/doc/index.html" target="_top">BLL</a> + counterpart <code class="computeroutput"><span class="identifier">_1</span></code>..<code class="computeroutput"><span class="identifier">_N</span></code>. (where N is a predefined maximum). + </p> +<p> + Here are some sample preset definitions of <code class="computeroutput"><span class="identifier">arg1</span></code>..<code class="computeroutput"><span class="identifier">argN</span></code> + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">placeholders</span> +<span class="special">{</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">arg1</span> <span class="special">=</span> <span class="special">{};</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">arg2</span> <span class="special">=</span> <span class="special">{};</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">3</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">arg3</span> <span class="special">=</span> <span class="special">{};</span> +<span class="special">}</span> +</pre> +<p> + and its <a href="http://www.boost.org/libs/lambda/doc/index.html" target="_top">BLL</a> + <code class="computeroutput"><span class="identifier">_1</span></code>..<code class="computeroutput"><span class="identifier">_N</span></code> + style counterparts: + </p> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">placeholders</span> +<span class="special">{</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">_1</span> <span class="special">=</span> <span class="special">{};</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">2</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">_2</span> <span class="special">=</span> <span class="special">{};</span> + <span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">3</span><span class="special">>::</span><span class="identifier">type</span> <span class="keyword">const</span> <span class="identifier">_3</span> <span class="special">=</span> <span class="special">{};</span> +<span class="special">}</span> +</pre> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + You can set <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_ARG_LIMIT</span></code>, + the predefined maximum placeholder index. By default, <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_ARG_LIMIT</span></code> + is set to <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> + (See <a class="link" href="../../actor.html" title="Actor">Actor</a>). + </p></td></tr> +</table></div> +<h6> +<a name="phoenix.modules.core.arguments.h1"></a> + <span><a name="phoenix.modules.core.arguments.user_defined_arguments"></a></span><a class="link" href="arguments.html#phoenix.modules.core.arguments.user_defined_arguments">User Defined + Arguments</a> + </h6> +<p> + When appropriate, you can define your own <code class="computeroutput"><span class="identifier">argument</span></code> + names. For example: + </p> +<pre class="programlisting"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">argument</span><span class="special"><</span><span class="number">1</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">x</span><span class="special">;</span> <span class="comment">// note one based index</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">x</span></code> may now be used as a + parameter to a lazy function: + </p> +<pre class="programlisting"><span class="identifier">add</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="number">6</span><span class="special">)</span> +</pre> +<p> + which is equivalent to: + </p> +<pre class="programlisting"><span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="number">6</span><span class="special">)</span> +</pre> +<h6> +<a name="phoenix.modules.core.arguments.h2"></a> + <span><a name="phoenix.modules.core.arguments.evaluating_an_argument"></a></span><a class="link" href="arguments.html#phoenix.modules.core.arguments.evaluating_an_argument">Evaluating + an Argument</a> + </h6> +<p> + An argument, when evaluated, selects the Nth argument from the those passed + in by the client. + </p> +<p> + For example: + </p> +<pre class="programlisting"><span class="keyword">char</span> <span class="identifier">c</span> <span class="special">=</span> <span class="char">'A'</span><span class="special">;</span> +<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span> +<span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"Hello World"</span><span class="special">;</span> + +<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Get the 1st argument: c</span> +<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">s</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Get the 1st argument: i</span> +<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">s</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Get the 2nd argument: s</span> +</pre> +<p> + will print out: + </p> +<pre class="programlisting"><span class="identifier">A</span> +<span class="number">123</span> +<span class="identifier">Hello</span> <span class="identifier">World</span> +</pre> +<h6> +<a name="phoenix.modules.core.arguments.h3"></a> + <span><a name="phoenix.modules.core.arguments.extra_arguments"></a></span><a class="link" href="arguments.html#phoenix.modules.core.arguments.extra_arguments">Extra + Arguments</a> + </h6> +<p> + In C and C++, a function can have extra arguments that are not at all used + by the function body itself. These extra arguments are simply ignored. + </p> +<p> + Phoenix also allows extra arguments to be passed. For example, recall our + original <code class="computeroutput"><span class="identifier">add</span></code> function: + </p> +<pre class="programlisting"><span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> +</pre> +<p> + We know now that partially applying this function results to a function + that expects 2 arguments. However, the library is a bit more lenient and + allows the caller to supply more arguments than is actually required. Thus, + <code class="computeroutput"><span class="identifier">add</span></code> actually allows 2 + <span class="emphasis"><em>or more</em></span> arguments. For instance, with: + </p> +<pre class="programlisting"><span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">z</span><span class="special">)</span> +</pre> +<p> + the third argument <code class="computeroutput"><span class="identifier">z</span></code> is + ignored. Taking this further, in-between arguments are also ignored. Example: + </p> +<pre class="programlisting"><span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg5</span><span class="special">)(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">d</span><span class="special">,</span> <span class="identifier">e</span><span class="special">)</span> +</pre> +<p> + Here, arguments b, c, and d are ignored. The function <code class="computeroutput"><span class="identifier">add</span></code> + takes in the first argument (<code class="computeroutput"><span class="identifier">arg1</span></code>) + and the fifth argument (<code class="computeroutput"><span class="identifier">arg5</span></code>). + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + There are a few reasons why enforcing strict arity is not desirable. + A case in point is the callback function. Typical callback functions + provide more information than is actually needed. Lambda functions are + often used as callbacks. + </p></td></tr> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="references.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="nothing.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/core/nothing.html b/libs/phoenix/doc/html/phoenix/modules/core/nothing.html new file mode 100644 index 0000000000..4b5d83cdcb --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/core/nothing.html @@ -0,0 +1,52 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Nothing</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../core.html" title="Core"> +<link rel="prev" href="arguments.html" title="Arguments"> +<link rel="next" href="../function.html" title="Function"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="arguments.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../function.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.core.nothing"></a><a class="link" href="nothing.html" title="Nothing">Nothing</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">nothing</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Finally, the <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span></code> + does nothing; (a "bum", if you will :-) ). There's a sole <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">null</span><span class="special"><</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">void_</span><span class="special">>::</span><span class="identifier">type</span></code> instance named "nothing". + This actor is actually useful in situations where we don't want to do anything. + (See <a class="link" href="../statement/for_statement.html" title="for_ Statement">for_ Statement</a> + for example). + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="arguments.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../function.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/core/references.html b/libs/phoenix/doc/html/phoenix/modules/core/references.html new file mode 100644 index 0000000000..a1b13ee87b --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/core/references.html @@ -0,0 +1,116 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>References</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../core.html" title="Core"> +<link rel="prev" href="values.html" title="Values"> +<link rel="next" href="arguments.html" title="Arguments"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="values.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="arguments.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.core.references"></a><a class="link" href="references.html" title="References">References</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">reference</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Values are immutable constants. Attempting to modify a value will result + in a compile time error. When we want the function to modify the parameter, + we use a reference instead. For instance, imagine a lazy function <code class="computeroutput"><span class="identifier">add_assign</span></code>: + </p> +<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">add_assign</span><span class="special">(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">x</span> <span class="special">+=</span> <span class="identifier">y</span><span class="special">;</span> <span class="special">}</span> <span class="comment">// pseudo code</span> +</pre> +<p> + Here, we want the first function argument, x, to be mutable. Obviously, + we cannot write: + </p> +<pre class="programlisting"><span class="identifier">add_assign</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="comment">// error first argument is immutable</span> +</pre> +<p> + In C++, we can pass in a reference to a variable as the first argument + in our example above. Yet, by default, the library forces arguments passed + to partially applied functions to be immutable values (see <a class="link" href="values.html" title="Values">Values</a>). + To achieve our intent, we use: + </p> +<pre class="programlisting"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> +</pre> +<p> + This is similar to <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> + before but instead holds a reference to a variable. + </p> +<p> + We normally don't instantiate <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> + objects directly. Instead we use: + </p> +<pre class="programlisting"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> +</pre> +<p> + For example (where <code class="computeroutput"><span class="identifier">i</span></code> is + an <code class="computeroutput"><span class="keyword">int</span></code> variable): + </p> +<pre class="programlisting"><span class="identifier">add_assign</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">),</span> <span class="number">2</span><span class="special">)</span> +</pre> +<h6> +<a name="phoenix.modules.core.references.h0"></a> + <span><a name="phoenix.modules.core.references.evaluating_a_reference"></a></span><a class="link" href="references.html#phoenix.modules.core.references.evaluating_a_reference">Evaluating + a Reference</a> + </h6> +<p> + References are actors. Hence, references can be evaluated. Such invocation + gives the reference's identity. Example: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> +<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"Hello World"</span><span class="special">;</span> +<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)()</span> <span class="special"><<</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">s</span><span class="special">)();</span> +</pre> +<p> + prints out "3 Hello World" + </p> +<h6> +<a name="phoenix.modules.core.references.h1"></a> + <span><a name="phoenix.modules.core.references.constant_references"></a></span><a class="link" href="references.html#phoenix.modules.core.references.constant_references">Constant + References</a> + </h6> +<p> + Another free function + </p> +<pre class="programlisting"><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cv</span><span class="special">)</span> +</pre> +<p> + may also be used. <code class="computeroutput"><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cv</span><span class="special">)</span></code> + creates an <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">reference</span><span class="special"><</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">>::</span><span class="identifier">type</span></code> + object. This is similar to <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> + but when the data to be passed as argument to a function is heavy and expensive + to copy by value, the <code class="computeroutput"><span class="identifier">cref</span><span class="special">(</span><span class="identifier">cv</span><span class="special">)</span></code> + offers a lighter alternative. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="values.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="arguments.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/core/values.html b/libs/phoenix/doc/html/phoenix/modules/core/values.html new file mode 100644 index 0000000000..38b9964205 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/core/values.html @@ -0,0 +1,84 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Values</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../core.html" title="Core"> +<link rel="prev" href="../core.html" title="Core"> +<link rel="next" href="references.html" title="References"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../core.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="references.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.core.values"></a><a class="link" href="values.html" title="Values">Values</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">/</span><span class="identifier">value</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Whenever we see a constant in a partially applied function, an + </p> +<pre class="programlisting"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> +</pre> +<p> + (where T is the type of the constant) is automatically created for us. + For instance: + </p> +<pre class="programlisting"><span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="number">6</span><span class="special">)</span> +</pre> +<p> + Passing a second argument, <code class="computeroutput"><span class="number">6</span></code>, + an <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> is implicitly created behind the + scenes. This is also equivalent to <code class="computeroutput"><span class="identifier">add</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">val</span><span class="special">(</span><span class="number">6</span><span class="special">))</span></code>. + </p> +<pre class="programlisting"><span class="identifier">val</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> +</pre> +<p> + generates an <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">value</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span></code> + where <code class="computeroutput"><span class="identifier">T</span></code> is the type of + <code class="computeroutput"><span class="identifier">x</span></code>. In most cases, there's + no need to explicitly use <code class="computeroutput"><span class="identifier">val</span></code>, + but, as we'll see later on, there are situations where this is unavoidable. + </p> +<h3> +<a name="phoenix.modules.core.values.h0"></a> + <span><a name="phoenix.modules.core.values.evaluating_a_value"></a></span><a class="link" href="values.html#phoenix.modules.core.values.evaluating_a_value">Evaluating + a Value</a> + </h3> +<p> + Like arguments, values are also actors. As such, values can be evaluated. + Invoking a value gives the value's identity. Example: + </p> +<pre class="programlisting"><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)()</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"Hello World"</span><span class="special">)();</span> +</pre> +<p> + prints out "3 Hello World". + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../core.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="references.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/function.html b/libs/phoenix/doc/html/phoenix/modules/function.html new file mode 100644 index 0000000000..c9a0a40612 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/function.html @@ -0,0 +1,150 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Function</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="core/nothing.html" title="Nothing"> +<link rel="next" href="function/adapting_functions.html" title="Adapting Functions"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="core/nothing.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="function/adapting_functions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.function"></a><a class="link" href="function.html" title="Function">Function</a> +</h3></div></div></div> +<div class="toc"><dl><dt><span class="section"><a href="function/adapting_functions.html">Adapting + Functions</a></span></dt></dl></div> +<p> + The <code class="computeroutput"><span class="identifier">function</span></code> class template + provides a mechanism for implementing lazily evaluated functions. Syntactically, + a lazy function looks like an ordinary C/C++ function. The function call + looks familiar and feels the same as ordinary C++ functions. However, unlike + ordinary functions, the actual function execution is deferred. + </p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Unlike ordinary function pointers or functor objects that need to be explicitly + bound through the bind function (see <a class="link" href="bind.html" title="Bind">Bind</a>), + the argument types of these functions are automatically lazily bound. + </p> +<p> + In order to create a lazy function, we need to implement a model of the + <a href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/functional/concepts/poly.html" target="_top">Polymorphic + Function Object</a> concept. For a function that takes <code class="computeroutput"><span class="identifier">N</span></code> arguments, a model of <a href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/functional/concepts/poly.html" target="_top">Polymorphic + Function Object</a> must provide: + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + An <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code> + that takes <code class="computeroutput"><span class="identifier">N</span></code> arguments, + and implements the function logic. This is also true for ordinary function + pointers. + </li> +<li class="listitem"> + A nested metafunction <code class="computeroutput"><span class="identifier">result</span><span class="special"><</span><span class="identifier">Signature</span><span class="special">></span></code> or nested typedef <code class="computeroutput"><span class="identifier">result_type</span></code>, + following the <a href="http://www.boost.org/doc/libs/release/libs/utility/utility.htm#result_of" target="_top">Boost.Result + Of</a> Protocol + </li> +</ul></div> +<p> + For example, the following type implements the FunctionEval concept, in order + to provide a lazy factorial function: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">factorial_impl</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Arg</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">Arg</span> <span class="keyword">const</span> <span class="special">&)></span> + <span class="special">{</span> + <span class="keyword">typedef</span> <span class="identifier">Arg</span> <span class="identifier">type</span><span class="special">;</span> + <span class="special">};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Arg</span><span class="special">></span> + <span class="identifier">Arg</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Arg</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">n</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="special">(</span><span class="identifier">n</span> <span class="special"><=</span> <span class="number">0</span><span class="special">)</span> <span class="special">?</span> <span class="number">1</span> <span class="special">:</span> <span class="identifier">n</span> <span class="special">*</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)(</span><span class="identifier">n</span><span class="special">-</span><span class="number">1</span><span class="special">);</span> + <span class="special">}</span> +<span class="special">};</span> +</pre> +<p> + (See <a href="../../../../example/factorial.cpp" target="_top">factorial.cpp</a>) + </p> +<p> + Having implemented the <code class="computeroutput"><span class="identifier">factorial_impl</span></code> + type, we can declare and instantiate a lazy <code class="computeroutput"><span class="identifier">factorial</span></code> + function this way: + </p> +<pre class="programlisting"><span class="identifier">function</span><span class="special"><</span><span class="identifier">factorial_impl</span><span class="special">></span> <span class="identifier">factorial</span><span class="special">;</span> +</pre> +<p> + Invoking a lazy function such as <code class="computeroutput"><span class="identifier">factorial</span></code> + does not immediately execute the function object <code class="computeroutput"><span class="identifier">factorial_impl</span></code>. + Instead, an <a class="link" href="../actor.html" title="Actor">actor</a> object is created + and returned to the caller. Example: + </p> +<pre class="programlisting"><span class="identifier">factorial</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> +</pre> +<p> + does nothing more than return an actor. A second function call will invoke + the actual factorial function. Example: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)(</span><span class="number">4</span><span class="special">);</span> +</pre> +<p> + will print out "24". + </p> +<p> + Take note that in certain cases (e.g. for function objects with state), an + instance of the model of <a href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/functional/concepts/poly.html" target="_top">Polymorphic + Function Object</a> may be passed on to the constructor. Example: + </p> +<pre class="programlisting"><span class="identifier">function</span><span class="special"><</span><span class="identifier">factorial_impl</span><span class="special">></span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">ftor</span><span class="special">);</span> +</pre> +<p> + where ftor is an instance of factorial_impl (this is not necessary in this + case as <code class="computeroutput"><span class="identifier">factorial_impl</span></code> does + not require any state). + </p> +<div class="important"><table border="0" summary="Important"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td> +<th align="left">Important</th> +</tr> +<tr><td align="left" valign="top"><p> + Take care though when using function objects with state because they are + often copied repeatedly, and state may change in one of the copies, rather + than the original. + </p></td></tr> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="core/nothing.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="function/adapting_functions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/function/adapting_functions.html b/libs/phoenix/doc/html/phoenix/modules/function/adapting_functions.html new file mode 100644 index 0000000000..1263a0afb6 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/function/adapting_functions.html @@ -0,0 +1,370 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Adapting Functions</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../function.html" title="Function"> +<link rel="prev" href="../function.html" title="Function"> +<link rel="next" href="../operator.html" title="Operator"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../function.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../function.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../operator.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.function.adapting_functions"></a><a class="link" href="adapting_functions.html" title="Adapting Functions">Adapting + Functions</a> +</h4></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary">BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY</a></span></dt> +<dt><span class="section"><a href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function">BOOST_PHOENIX_ADAPT_FUNCTION</a></span></dt> +<dt><span class="section"><a href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary">BOOST_PHOENIX_ADAPT_CALLABLE_NULLARY</a></span></dt> +<dt><span class="section"><a href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable">BOOST_PHOENIX_ADAPT_CALLABLE</a></span></dt> +</dl></div> +<p> + If you want to adapt already existing functions or function objects it + will become a repetetive task. Therefor the following boilerplate macros + are provided to help you adapt already exsiting functions, thus reducing + the need to <a class="link" href="../bind.html" title="Bind">phoenix.modules.bind</a> + functions. + </p> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary"></a><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary" title="BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY">BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY</a> +</h5></div></div></div> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.h0"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.description"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY</span></code> + is a macro that can be used to generate all the necessary boilerplate + to make an arbitrary nullary function a lazy function. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + These macros generate no global objects. The resulting lazy functions + are real functions that create the lazy function expression object + </p></td></tr> +</table></div> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.h1"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.synopsis"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY</span><span class="special">(</span> + <span class="identifier">RETURN_TYPE</span> + <span class="special">,</span> <span class="identifier">LAZY_FUNCTION</span> + <span class="special">,</span> <span class="identifier">FUNCTION</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.h2"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.semantics"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.semantics">Semantics</a> + </h6> +<p> + The above macro generates all necessary code to have a nullary lazy function + <code class="computeroutput"><span class="identifier">LAZY_FUNCTION</span></code> which calls + the nullary <code class="computeroutput"><span class="identifier">FUNCTION</span></code> + that has the return type <code class="computeroutput"><span class="identifier">RETURN_TYPE</span></code> + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.h3"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.header"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">function</span><span class="special">/</span><span class="identifier">adapt_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.h4"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.example"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function_nullary.example">Example</a> + </h6> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">demo</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">foo</span><span class="special">()</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span> + <span class="special">}</span> +<span class="special">}</span> + +<span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">foo</span><span class="special">,</span> <span class="identifier">demo</span><span class="special">::</span><span class="identifier">foo</span><span class="special">)</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">placeholders</span><span class="special">::</span><span class="identifier">_1</span><span class="special">;</span> + + <span class="identifier">assert</span><span class="special">((</span><span class="identifier">_1</span> <span class="special">+</span> <span class="identifier">foo</span><span class="special">())(</span><span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="number">43</span><span class="special">);</span> +<span class="special">}</span> +</pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function"></a><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function" title="BOOST_PHOENIX_ADAPT_FUNCTION">BOOST_PHOENIX_ADAPT_FUNCTION</a> +</h5></div></div></div> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.h0"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.description"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION</span></code> + is a macro that can be used to generate all the necessary boilerplate + to make an arbitrary function a lazy function. + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.h1"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.synopsis"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION</span><span class="special">(</span> + <span class="identifier">RETURN_TYPE</span> + <span class="special">,</span> <span class="identifier">LAZY_FUNCTION</span> + <span class="special">,</span> <span class="identifier">FUNCTION</span> + <span class="special">,</span> <span class="identifier">FUNCTION_ARITY</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.h2"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.semantics"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.semantics">Semantics</a> + </h6> +<p> + The above macro generates all necessary code to have a lazy function + <code class="computeroutput"><span class="identifier">LAZY_FUNCTION</span></code> which calls + <code class="computeroutput"><span class="identifier">FUNCTION</span></code> that has the + return type <code class="computeroutput"><span class="identifier">RETURN_TYPE</span></code> + with <code class="computeroutput"><span class="identifier">FUNCTION_ARITY</span></code> number + of arguments. + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.h3"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.header"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">function</span><span class="special">/</span><span class="identifier">adapt_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.h4"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.example"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_function.example">Example</a> + </h6> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">demo</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">plus</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span><span class="special">)</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span><span class="special">;</span> + <span class="special">}</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> + <span class="identifier">T</span> + <span class="identifier">plus</span><span class="special">(</span><span class="identifier">T</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">c</span><span class="special">)</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">a</span> <span class="special">+</span> <span class="identifier">b</span> <span class="special">+</span> <span class="identifier">c</span><span class="special">;</span> + <span class="special">}</span> +<span class="special">}</span> + +<span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">plus</span><span class="special">,</span> <span class="identifier">demo</span><span class="special">::</span><span class="identifier">plus</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> + +<span class="identifier">BOOST_PHOENIX_ADAPT_FUNCTION</span><span class="special">(</span> + <span class="keyword">typename</span> <span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">A0</span><span class="special">>::</span><span class="identifier">type</span> + <span class="special">,</span> <span class="identifier">plus</span> + <span class="special">,</span> <span class="identifier">demo</span><span class="special">::</span><span class="identifier">plus</span> + <span class="special">,</span> <span class="number">3</span> +<span class="special">)</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">arg_names</span><span class="special">::</span><span class="identifier">arg1</span><span class="special">;</span> + <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">arg_names</span><span class="special">::</span><span class="identifier">arg2</span><span class="special">;</span> + + <span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">256</span><span class="special">;</span> + + <span class="identifier">assert</span><span class="special">(</span><span class="identifier">plus</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">);</span> + <span class="identifier">assert</span><span class="special">(</span><span class="identifier">plus</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">,</span> <span class="number">3</span><span class="special">)(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">+</span><span class="number">3</span><span class="special">);</span> +<span class="special">}</span> +</pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary"></a><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary" title="BOOST_PHOENIX_ADAPT_CALLABLE_NULLARY">BOOST_PHOENIX_ADAPT_CALLABLE_NULLARY</a> +</h5></div></div></div> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.h0"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.description"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE_NULLARY</span></code> + is a macro that can be used to generate all the necessary boilerplate + to make an arbitrary nullary function object a lazy function. + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.h1"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.synopsis"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE_NULLARY</span><span class="special">(</span> + <span class="identifier">LAZY_FUNCTION</span> + <span class="special">,</span> <span class="identifier">CALLABLE</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.h2"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.semantics"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.semantics">Semantics</a> + </h6> +<p> + The above macro generates all necessary code to create <code class="computeroutput"><span class="identifier">LAZY_FUNCTION</span></code> which creates a lazy + function object that represents a nullary call to <code class="computeroutput"><span class="identifier">CALLABLE</span></code>. + The return type is specified by <code class="computeroutput"><span class="identifier">CALLABLE</span></code> + conforming to the <a href="http://www.boost.org/doc/libs/release/libs/utility/utility.htm#result_of" target="_top">Boost.Result + Of</a> protocol. + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.h3"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.header"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">function</span><span class="special">/</span><span class="identifier">adapt_callable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.h4"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.example"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable_nullary.example">Example</a> + </h6> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">demo</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">foo</span> + <span class="special">{</span> + <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">result_type</span><span class="special">;</span> + + <span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="number">42</span><span class="special">;</span> + <span class="special">}</span> + <span class="special">}</span> +<span class="special">}</span> + +<span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE_NULLARY</span><span class="special">(</span><span class="identifier">foo</span><span class="special">,</span> <span class="identifier">demo</span><span class="special">::</span><span class="identifier">foo</span><span class="special">)</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">placeholders</span><span class="special">::</span><span class="identifier">_1</span><span class="special">;</span> + + <span class="identifier">assert</span><span class="special">((</span><span class="identifier">_1</span> <span class="special">+</span> <span class="identifier">foo</span><span class="special">())(</span><span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="number">43</span><span class="special">);</span> +<span class="special">}</span> +</pre> +</div> +<div class="section"> +<div class="titlepage"><div><div><h5 class="title"> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable"></a><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable" title="BOOST_PHOENIX_ADAPT_CALLABLE">BOOST_PHOENIX_ADAPT_CALLABLE</a> +</h5></div></div></div> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.h0"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.description"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.description">Description</a> + </h6> +<p> + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE</span></code> + is a macro that can be used to generate all the necessary boilerplate + to make an arbitrary function object a lazy function. + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.h1"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.synopsis"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.synopsis">Synopsis</a> + </h6> +<pre class="programlisting"><span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE</span><span class="special">(</span> + <span class="identifier">LAZY_FUNCTION</span> + <span class="special">,</span> <span class="identifier">FUNCTION_NAME</span> + <span class="special">,</span> <span class="identifier">FUNCTION_ARITY</span> +<span class="special">)</span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.h2"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.semantics"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.semantics">Semantics</a> + </h6> +<p> + The above macro generates all necessary code to create <code class="computeroutput"><span class="identifier">LAZY_FUNCTION</span></code> which creates a lazy + function object that represents a call to <code class="computeroutput"><span class="identifier">CALLABLE</span></code> + with <code class="computeroutput"><span class="identifier">FUNCTION_ARITY</span></code> arguments. + The return type is specified by <code class="computeroutput"><span class="identifier">CALLABLE</span></code> + conforming to the <a href="http://www.boost.org/doc/libs/release/libs/utility/utility.htm#result_of" target="_top">Boost.Result + Of</a> protocol. + </p> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.h3"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.header"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.header">Header</a> + </h6> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">function</span><span class="special">/</span><span class="identifier">adapt_callable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<h6> +<a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.h4"></a> + <span><a name="phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.example"></a></span><a class="link" href="adapting_functions.html#phoenix.modules.function.adapting_functions.boost_phoenix_adapt_callable.example">Example</a> + </h6> +<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">demo</span> +<span class="special">{</span> + <span class="keyword">struct</span> <span class="identifier">plus</span> + <span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Sig</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span><span class="special">)></span> + <span class="special">:</span> <span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span> + <span class="special">{};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">This</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A2</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span><span class="special"><</span><span class="identifier">This</span><span class="special">(</span><span class="identifier">A0</span><span class="special">,</span> <span class="identifier">A1</span><span class="special">,</span> <span class="identifier">A2</span><span class="special">)></span> + <span class="special">:</span> <span class="identifier">remove_reference</span><span class="special"><</span><span class="identifier">A0</span><span class="special">></span> + <span class="special">{};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">></span> + <span class="identifier">A0</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a1</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">a0</span> <span class="special">+</span> <span class="identifier">a1</span><span class="special">;</span> + <span class="special">}</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">A0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">A2</span><span class="special">></span> + <span class="identifier">A0</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">A0</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a0</span><span class="special">,</span> <span class="identifier">A1</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a1</span><span class="special">,</span> <span class="identifier">A2</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">a2</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">a0</span> <span class="special">+</span> <span class="identifier">a1</span> <span class="special">+</span> <span class="identifier">a2</span><span class="special">;</span> + <span class="special">}</span> + <span class="special">};</span> +<span class="special">}</span> + +<span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE</span><span class="special">(</span><span class="identifier">plus</span><span class="special">,</span> <span class="identifier">demo</span><span class="special">::</span><span class="identifier">plus</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> + +<span class="identifier">BOOST_PHOENIX_ADAPT_CALLABLE</span><span class="special">(</span><span class="identifier">plus</span><span class="special">,</span> <span class="identifier">demo</span><span class="special">::</span><span class="identifier">plus</span><span class="special">,</span> <span class="number">3</span><span class="special">)</span> + +<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">arg_names</span><span class="special">::</span><span class="identifier">arg1</span><span class="special">;</span> + <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">arg_names</span><span class="special">::</span><span class="identifier">arg2</span><span class="special">;</span> + + <span class="keyword">int</span> <span class="identifier">a</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span> + <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">=</span> <span class="number">256</span><span class="special">;</span> + + <span class="identifier">assert</span><span class="special">(</span><span class="identifier">plus</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">);</span> + <span class="identifier">assert</span><span class="special">(</span><span class="identifier">plus</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">,</span> <span class="number">3</span><span class="special">)(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">+</span><span class="number">3</span><span class="special">);</span> +<span class="special">}</span> +</pre> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../function.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../function.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../operator.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/object.html b/libs/phoenix/doc/html/phoenix/modules/object.html new file mode 100644 index 0000000000..a4dd9e4686 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/object.html @@ -0,0 +1,55 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Object</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="statement/throw_.html" title="throw_"> +<link rel="next" href="object/construction.html" title="Construction"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="statement/throw_.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="object/construction.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.object"></a><a class="link" href="object.html" title="Object">Object</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="object/construction.html">Construction</a></span></dt> +<dt><span class="section"><a href="object/new.html">New</a></span></dt> +<dt><span class="section"><a href="object/delete.html">Delete</a></span></dt> +<dt><span class="section"><a href="object/casts.html">Casts</a></span></dt> +</dl></div> +<p> + The Object module deals with object construction, destruction and conversion. + The module provides <span class="emphasis"><em>"lazy"</em></span> versions of C++'s + object constructor, <code class="computeroutput"><span class="keyword">new</span></code>, <code class="computeroutput"><span class="keyword">delete</span></code>, <code class="computeroutput"><span class="keyword">static_cast</span></code>, + <code class="computeroutput"><span class="keyword">dynamic_cast</span></code>, <code class="computeroutput"><span class="keyword">const_cast</span></code> and <code class="computeroutput"><span class="keyword">reinterpret_cast</span></code>. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="statement/throw_.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="object/construction.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/object/casts.html b/libs/phoenix/doc/html/phoenix/modules/object/casts.html new file mode 100644 index 0000000000..1e3fd89257 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/object/casts.html @@ -0,0 +1,71 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Casts</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../object.html" title="Object"> +<link rel="prev" href="delete.html" title="Delete"> +<link rel="next" href="../scope.html" title="Scope"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="delete.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../scope.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.object.casts"></a><a class="link" href="casts.html" title="Casts">Casts</a> +</h4></div></div></div> +<p> + <span class="bold"><strong><span class="emphasis"><em>Lazy casts...</em></span></strong></span> + </p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="keyword">static_cast</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="keyword">dynamic_cast</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="keyword">const_cast</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="keyword">reinterpret_cast</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The set of lazy C++ cast template functions provide a way of lazily casting + an object of a certain type to another type. The syntax resembles the well + known C++ casts. Take note however that the lazy versions have a trailing + underscore. + </p> +<pre class="programlisting"><span class="identifier">static_cast_</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">lambda_expression</span><span class="special">)</span> +<span class="identifier">dynamic_cast_</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">lambda_expression</span><span class="special">)</span> +<span class="identifier">const_cast_</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">lambda_expression</span><span class="special">)</span> +<span class="identifier">reinterpret_cast_</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">lambda_expression</span><span class="special">)</span> +</pre> +<p> + Example: + </p> +<pre class="programlisting"><span class="identifier">static_cast_</span><span class="special"><</span><span class="identifier">Base</span><span class="special">*>(&</span><span class="identifier">arg1</span><span class="special">)</span> +</pre> +<p> + Static-casts the address of <code class="computeroutput"><span class="identifier">arg1</span></code> + to a <code class="computeroutput"><span class="identifier">Base</span><span class="special">*</span></code>. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="delete.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../scope.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/object/construction.html b/libs/phoenix/doc/html/phoenix/modules/object/construction.html new file mode 100644 index 0000000000..1fbcb63256 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/object/construction.html @@ -0,0 +1,80 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Construction</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../object.html" title="Object"> +<link rel="prev" href="../object.html" title="Object"> +<link rel="next" href="new.html" title="New"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../object.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="new.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.object.construction"></a><a class="link" href="construction.html" title="Construction">Construction</a> +</h4></div></div></div> +<p> + <span class="bold"><strong><span class="emphasis"><em>Lazy constructors...</em></span></strong></span> + </p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="identifier">construct</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Lazily construct an object from an arbitrary set of arguments: + </p> +<pre class="programlisting"><span class="identifier">construct</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">ctor_arg1</span><span class="special">,</span> <span class="identifier">ctor_arg2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">ctor_argN</span><span class="special">);</span> +</pre> +<p> + where the given parameters are the parameters to the constructor of the + object of type T (This implies, that type T is expected to have a constructor + with a corresponding set of parameter types.). + </p> +<p> + Example: + </p> +<pre class="programlisting"><span class="identifier">construct</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> +</pre> +<p> + Constructs a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> from <code class="computeroutput"><span class="identifier">arg1</span></code> + and <code class="computeroutput"><span class="identifier">arg2</span></code>. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + The maximum number of actual parameters is limited by the preprocessor + constant BOOST_PHOENIX_COMPOSITE_LIMIT. Note though, that this limit + should not be greater than BOOST_PHOENIX_LIMIT. By default, <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_COMPOSITE_LIMIT</span></code> is set + to <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> + (See <a class="link" href="../../actor.html" title="Actor">Actor</a>). + </p></td></tr> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../object.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="new.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/object/delete.html b/libs/phoenix/doc/html/phoenix/modules/object/delete.html new file mode 100644 index 0000000000..72a9a27bcd --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/object/delete.html @@ -0,0 +1,61 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Delete</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../object.html" title="Object"> +<link rel="prev" href="new.html" title="New"> +<link rel="next" href="casts.html" title="Casts"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="new.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="casts.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.object.delete"></a><a class="link" href="delete.html" title="Delete">Delete</a> +</h4></div></div></div> +<p> + <span class="bold"><strong><span class="emphasis"><em>Lazy delete...</em></span></strong></span> + </p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="keyword">delete</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Lazily delete an object, from the heap: + </p> +<pre class="programlisting"><span class="identifier">delete_</span><span class="special">(</span><span class="identifier">arg</span><span class="special">);</span> +</pre> +<p> + where arg is assumed to be a pointer to an object. + </p> +<p> + Example: + </p> +<pre class="programlisting"><span class="identifier">delete_</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// note the spelling of delete_ (with trailing underscore)</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="new.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="casts.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/object/new.html b/libs/phoenix/doc/html/phoenix/modules/object/new.html new file mode 100644 index 0000000000..1e1cc94386 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/object/new.html @@ -0,0 +1,80 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>New</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../object.html" title="Object"> +<link rel="prev" href="construction.html" title="Construction"> +<link rel="next" href="delete.html" title="Delete"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="construction.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="delete.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.object.new"></a><a class="link" href="new.html" title="New">New</a> +</h4></div></div></div> +<p> + <span class="bold"><strong><span class="emphasis"><em>Lazy new...</em></span></strong></span> + </p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">/</span><span class="keyword">new</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + Lazily construct an object, on the heap, from an arbitrary set of arguments: + </p> +<pre class="programlisting"><span class="identifier">new_</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">ctor_arg1</span><span class="special">,</span> <span class="identifier">ctor_arg2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">ctor_argN</span><span class="special">);</span> +</pre> +<p> + where the given parameters are the parameters to the contractor of the + object of type T (This implies, that type T is expected to have a constructor + with a corresponding set of parameter types.). + </p> +<p> + Example: + </p> +<pre class="programlisting"><span class="identifier">new_</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="comment">// note the spelling of new_ (with trailing underscore)</span> +</pre> +<p> + Creates a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> from <code class="computeroutput"><span class="identifier">arg1</span></code> + and <code class="computeroutput"><span class="identifier">arg2</span></code> on the heap. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + The maximum number of actual parameters is limited by the preprocessor + constant BOOST_PHOENIX_COMPOSITE_LIMIT. Note though, that this limit + should not be greater than BOOST_PHOENIX_LIMIT. By default, <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_COMPOSITE_LIMIT</span></code> is set + to <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code> + (See <a class="link" href="../../actor.html" title="Actor">Actor</a>). + </p></td></tr> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="construction.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../object.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="delete.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/operator.html b/libs/phoenix/doc/html/phoenix/modules/operator.html new file mode 100644 index 0000000000..9b70a2165a --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/operator.html @@ -0,0 +1,368 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Operator</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="function/adapting_functions.html" title="Adapting Functions"> +<link rel="next" href="statement.html" title="Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="function/adapting_functions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="statement.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.operator"></a><a class="link" href="operator.html" title="Operator">Operator</a> +</h3></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + This facility provides a mechanism for lazily evaluating operators. Syntactically, + a lazy operator looks and feels like an ordinary C/C++ infix, prefix or postfix + operator. The operator application looks the same. However, unlike ordinary + operators, the actual operator execution is deferred. Samples: + </p> +<pre class="programlisting"><span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">arg2</span> +<span class="number">1</span> <span class="special">+</span> <span class="identifier">arg1</span> <span class="special">*</span> <span class="identifier">arg2</span> +<span class="number">1</span> <span class="special">/</span> <span class="special">-</span><span class="identifier">arg1</span> +<span class="identifier">arg1</span> <span class="special"><</span> <span class="number">150</span> +</pre> +<p> + We have seen the lazy operators in action (see <a class="link" href="../starter_kit/lazy_operators.html" title="Lazy Operators">Quick + Start - Lazy Operators</a>). Let's go back and examine them a little bit + further: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> +</pre> +<p> + Through operator overloading, the expression <code class="computeroutput"><span class="identifier">arg1</span> + <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> actually + generates an actor. This actor object is passed on to STL's <code class="computeroutput"><span class="identifier">find_if</span></code> function. From the viewpoint of + STL, the expression is simply a function object expecting a single argument + of the containers value_type. For each element in <code class="computeroutput"><span class="identifier">c</span></code>, + the element is passed on as an argument <code class="computeroutput"><span class="identifier">arg1</span></code> + to the actor (function object). The actor checks if this is an odd value + based on the expression <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> + <span class="number">1</span></code> where arg1 is replaced by the container's + element. + </p> +<p> + Like lazy functions (see <a class="link" href="function.html" title="Function">Function</a>), + lazy operators are not immediately executed when invoked. Instead, an actor + (see <a class="link" href="../actor.html" title="Actor">Actor</a>) object is created and returned + to the caller. Example: + </p> +<pre class="programlisting"><span class="special">(</span><span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">arg3</span> +</pre> +<p> + does nothing more than return an actor. A second function call will evaluate + the actual operators. Example: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="special">((</span><span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">arg3</span><span class="special">)(</span><span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">);</span> +</pre> +<p> + will print out "54". + </p> +<p> + Operator expressions are lazily evaluated following four simple rules: + </p> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + A binary operator, except <code class="computeroutput"><span class="special">->*</span></code> + will be lazily evaluated when <span class="emphasis"><em>at least</em></span> one of its + operands is an actor object (see <a class="link" href="../actor.html" title="Actor">Actor</a>). + </li> +<li class="listitem"> + Unary operators are lazily evaluated if their argument is an actor object. + </li> +<li class="listitem"> + Operator <code class="computeroutput"><span class="special">->*</span></code> is lazily + evaluated if the left hand argument is an actor object. + </li> +<li class="listitem"> + The result of a lazy operator is an actor object that can in turn allow + the applications of rules 1, 2 and 3. + </li> +</ol></div> +<p> + For example, to check the following expression is lazily evaluated: + </p> +<pre class="programlisting"><span class="special">-(</span><span class="identifier">arg1</span> <span class="special">+</span> <span class="number">3</span> <span class="special">+</span> <span class="number">6</span><span class="special">)</span> +</pre> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + Following rule 1, <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">+</span> <span class="number">3</span></code> is + lazily evaluated since <code class="computeroutput"><span class="identifier">arg1</span></code> + is an actor (see <a class="link" href="core/arguments.html" title="Arguments">Arguments</a>). + </li> +<li class="listitem"> + The result of this <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">+</span> <span class="number">3</span></code> expression + is an actor object, following rule 4. + </li> +<li class="listitem"> + Continuing, <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">+</span> + <span class="number">3</span> <span class="special">+</span> <span class="number">6</span></code> is again lazily evaluated. Rule 2. + </li> +<li class="listitem"> + By rule 4 again, the result of <code class="computeroutput"><span class="identifier">arg1</span> + <span class="special">+</span> <span class="number">3</span> <span class="special">+</span> <span class="number">6</span></code> is + an actor object. + </li> +<li class="listitem"> + As <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">+</span> + <span class="number">3</span> <span class="special">+</span> <span class="number">6</span></code> is an actor, <code class="computeroutput"><span class="special">-(</span><span class="identifier">arg1</span> <span class="special">+</span> <span class="number">3</span> <span class="special">+</span> <span class="number">6</span><span class="special">)</span></code> is lazily evaluated. Rule 2. + </li> +</ol></div> +<p> + Lazy-operator application is highly contagious. In most cases, a single + <code class="computeroutput"><span class="identifier">argN</span></code> actor infects all its + immediate neighbors within a group (first level or parenthesized expression). + </p> +<p> + Note that at least one operand of any operator must be a valid actor for + lazy evaluation to take effect. To force lazy evaluation of an ordinary expression, + we can use <code class="computeroutput"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>, <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> or <code class="computeroutput"><span class="identifier">cref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code> + to transform an operand into a valid actor object (see <a class="link" href="core.html" title="Core">Core</a>). + For example: + </p> +<pre class="programlisting"><span class="number">1</span> <span class="special"><<</span> <span class="number">3</span><span class="special">;</span> <span class="comment">// Immediately evaluated</span> +<span class="identifier">val</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special"><<</span> <span class="number">3</span><span class="special">;</span> <span class="comment">// Lazily evaluated</span> +</pre> +<h5> +<a name="phoenix.modules.operator.h0"></a> + <span><a name="phoenix.modules.operator.supported_operators"></a></span><a class="link" href="operator.html#phoenix.modules.operator.supported_operators">Supported + operators</a> + </h5> +<h5> +<a name="phoenix.modules.operator.h1"></a> + <span><a name="phoenix.modules.operator.unary_operators"></a></span><a class="link" href="operator.html#phoenix.modules.operator.unary_operators">Unary + operators</a> + </h5> +<pre class="programlisting"><span class="identifier">prefix</span><span class="special">:</span> <span class="special">~,</span> <span class="special">!,</span> <span class="special">-,</span> <span class="special">+,</span> <span class="special">++,</span> <span class="special">--,</span> <span class="special">&</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">),</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">dereference</span><span class="special">)</span> +<span class="identifier">postfix</span><span class="special">:</span> <span class="special">++,</span> <span class="special">--</span> +</pre> +<h5> +<a name="phoenix.modules.operator.h2"></a> + <span><a name="phoenix.modules.operator.binary_operators"></a></span><a class="link" href="operator.html#phoenix.modules.operator.binary_operators">Binary + operators</a> + </h5> +<pre class="programlisting"><span class="special">=,</span> <span class="special">[],</span> <span class="special">+=,</span> <span class="special">-=,</span> <span class="special">*=,</span> <span class="special">/=,</span> <span class="special">%=,</span> <span class="special">&=,</span> <span class="special">|=,</span> <span class="special">^=,</span> <span class="special"><<=,</span> <span class="special">>>=</span> +<span class="special">+,</span> <span class="special">-,</span> <span class="special">*,</span> <span class="special">/,</span> <span class="special">%,</span> <span class="special">&,</span> <span class="special">|,</span> <span class="special">^,</span> <span class="special"><<,</span> <span class="special">>></span> +<span class="special">==,</span> <span class="special">!=,</span> <span class="special"><,</span> <span class="special">>,</span> <span class="special"><=,</span> <span class="special">>=</span> +<span class="special">&&,</span> <span class="special">||,</span> <span class="special">->*</span> +</pre> +<h5> +<a name="phoenix.modules.operator.h3"></a> + <span><a name="phoenix.modules.operator.ternary_operator"></a></span><a class="link" href="operator.html#phoenix.modules.operator.ternary_operator">Ternary + operator</a> + </h5> +<pre class="programlisting"><span class="identifier">if_else</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span> +</pre> +<p> + The ternary operator deserves special mention. Since C++ does not allow us + to overload the conditional expression: <code class="computeroutput"><span class="identifier">c</span> + <span class="special">?</span> <span class="identifier">a</span> <span class="special">:</span> <span class="identifier">b</span></code>, the + if_else pseudo function is provided for this purpose. The behavior is identical, + albeit in a lazy manner. + </p> +<h5> +<a name="phoenix.modules.operator.h4"></a> + <span><a name="phoenix.modules.operator.member_pointer_operator"></a></span><a class="link" href="operator.html#phoenix.modules.operator.member_pointer_operator">Member + pointer operator</a> + </h5> +<pre class="programlisting"><span class="identifier">a</span><span class="special">->*</span><span class="identifier">member_object_pointer</span> +<span class="identifier">a</span><span class="special">->*</span><span class="identifier">member_function_pointer</span> +</pre> +<p> + The left hand side of the member pointer operator must be an actor returning + a pointer type. The right hand side of the member pointer operator may be + either a pointer to member object or pointer to member function. + </p> +<p> + If the right hand side is a member object pointer, the result is an actor + which, when evaluated, returns a reference to that member. For example: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">A</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">member</span><span class="special">;</span> +<span class="special">};</span> + +<span class="identifier">A</span><span class="special">*</span> <span class="identifier">a</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">A</span><span class="special">;</span> +<span class="special">...</span> + +<span class="special">(</span><span class="identifier">arg1</span><span class="special">->*&</span><span class="identifier">A</span><span class="special">::</span><span class="identifier">member</span><span class="special">)(</span><span class="identifier">a</span><span class="special">);</span> <span class="comment">// returns member a->member</span> +</pre> +<p> + If the right hand side is a member function pointer, the result is an actor + which, when invoked, calls the specified member function. For example: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">A</span> +<span class="special">{</span> + <span class="keyword">int</span> <span class="identifier">func</span><span class="special">(</span><span class="keyword">int</span><span class="special">);</span> +<span class="special">};</span> + +<span class="identifier">A</span><span class="special">*</span> <span class="identifier">a</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">A</span><span class="special">;</span> +<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> + +<span class="special">(</span><span class="identifier">arg1</span><span class="special">->*&</span><span class="identifier">A</span><span class="special">::</span><span class="identifier">func</span><span class="special">)(</span><span class="identifier">arg2</span><span class="special">)(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">i</span><span class="special">);</span> <span class="comment">// returns a->func(i)</span> +</pre> +<h5> +<a name="phoenix.modules.operator.h5"></a> + <span><a name="phoenix.modules.operator.include_files"></a></span><a class="link" href="operator.html#phoenix.modules.operator.include_files">Include + Files</a> + </h5> +<div class="informaltable"><table class="table"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Operators + </p> + </th> +<th> + <p> + File + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special">-</span></code>, <code class="computeroutput"><span class="special">+</span></code>, + <code class="computeroutput"><span class="special">++</span></code>, <code class="computeroutput"><span class="special">--</span></code>, <code class="computeroutput"><span class="special">+=</span></code>, + <code class="computeroutput"><span class="special">-=</span></code>, <code class="computeroutput"><span class="special">*=</span></code>, <code class="computeroutput"><span class="special">/=</span></code>, + <code class="computeroutput"><span class="special">%=</span></code>, <code class="computeroutput"><span class="special">*</span></code>, <code class="computeroutput"><span class="special">/</span></code>, + <code class="computeroutput"><span class="special">%</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">arithmetic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special">&=</span></code>, <code class="computeroutput"><span class="special">|=</span></code>, <code class="computeroutput"><span class="special">^=</span></code>, + <code class="computeroutput"><span class="special"><<=</span></code>, <code class="computeroutput"><span class="special">>>=</span></code>, <code class="computeroutput"><span class="special">&</span></code>, + <code class="computeroutput"><span class="special">|</span></code>, <code class="computeroutput"><span class="special">^</span></code>, + <code class="computeroutput"><span class="special"><<</span></code>, <code class="computeroutput"><span class="special">>></span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">bitwise</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special">==</span></code>, <code class="computeroutput"><span class="special">!=</span></code>, <code class="computeroutput"><span class="special"><</span></code>, + <code class="computeroutput"><span class="special"><=</span></code>, <code class="computeroutput"><span class="special">></span></code>, <code class="computeroutput"><span class="special">>=</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">comparison</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special"><<</span></code>, <code class="computeroutput"><span class="special">>></span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special">!</span></code>, &&, <code class="computeroutput"><span class="special">||</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">logical</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special">&</span><span class="identifier">x</span></code>, + <code class="computeroutput"><span class="special">*</span><span class="identifier">p</span></code>, + <code class="computeroutput"><span class="special">=</span></code>, <code class="computeroutput"><span class="special">[]</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">self</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">if_else</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">,</span> + <span class="identifier">b</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">if_else</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="special">->*</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">/</span><span class="identifier">member</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="function/adapting_functions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="statement.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/scope.html b/libs/phoenix/doc/html/phoenix/modules/scope.html new file mode 100644 index 0000000000..7245f2703d --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/scope.html @@ -0,0 +1,66 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Scope</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="object/casts.html" title="Casts"> +<link rel="next" href="scope/local_variables.html" title="Local Variables"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="object/casts.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="scope/local_variables.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.scope"></a><a class="link" href="scope.html" title="Scope">Scope</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="scope/local_variables.html">Local Variables</a></span></dt> +<dt><span class="section"><a href="scope/let.html">let</a></span></dt> +<dt><span class="section"><a href="scope/lambda.html">lambda</a></span></dt> +</dl></div> +<p> + Up until now, the most basic ingredient is missing: creation of and access + to local variables in the stack. When recursion comes into play, you will + soon realize the need to have true local variables. It may seem that we do + not need this at all since an unnamed lambda function cannot call itself + anyway; at least not directly. With some sort of arrangement, situations + will arise where a lambda function becomes recursive. A typical situation + occurs when we store a lambda function in a <a href="http://www.boost.org/libs/function" target="_top">Boost.Function</a>, + essentially naming the unnamed lambda. + </p> +<p> + There will also be situations where a lambda function gets passed as an argument + to another function. This is a more common situation. In this case, the lambda + function assumes a new scope; new arguments and possibly new local variables. + </p> +<p> + This section deals with local variables and nested lambda scopes. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="object/casts.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="scope/local_variables.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/scope/lambda.html b/libs/phoenix/doc/html/phoenix/modules/scope/lambda.html new file mode 100644 index 0000000000..9cd47796c6 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/scope/lambda.html @@ -0,0 +1,194 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>lambda</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../scope.html" title="Scope"> +<link rel="prev" href="let.html" title="let"> +<link rel="next" href="../bind.html" title="Bind"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="let.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../scope.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../bind.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.scope.lambda"></a><a class="link" href="lambda.html" title="lambda">lambda</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">scope</span><span class="special">/</span><span class="identifier">lambda</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + A lot of times, you'd want to write a lazy function that accepts one or + more functions (higher order functions). STL algorithms come to mind, for + example. Consider a lazy version of <code class="computeroutput"><span class="identifier">stl</span><span class="special">::</span><span class="identifier">for_each</span></code>: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">for_each_impl</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span> + <span class="special">{</span> + <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="identifier">type</span><span class="special">;</span> + <span class="special">};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> + <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">C</span><span class="special">&</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">f</span><span class="special">);</span> + <span class="special">}</span> +<span class="special">};</span> + +<span class="identifier">function</span><span class="special"><</span><span class="identifier">for_each_impl</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">for_each</span> <span class="special">=</span> <span class="identifier">for_each_impl</span><span class="special">();</span> +</pre> +<p> + Notice that the function accepts another function, <code class="computeroutput"><span class="identifier">f</span></code> + as an argument. The scope of this function, <code class="computeroutput"><span class="identifier">f</span></code>, + is limited within the <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>. When <code class="computeroutput"><span class="identifier">f</span></code> + is called inside <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span></code>, it exists in a new scope, along + with new arguments and, possibly, local variables. This new scope is not + at all related to the outer scopes beyond the <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>. + </p> +<p> + Simple syntax: + </p> +<pre class="programlisting"><span class="identifier">lambda</span> +<span class="special">[</span> + <span class="identifier">lambda</span><span class="special">-</span><span class="identifier">body</span> +<span class="special">]</span> +</pre> +<p> + Like <code class="computeroutput"><span class="identifier">let</span></code>, local variables + may be declared, allowing 1..N local variable declarations (where N == + <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LOCAL_LIMIT</span></code>): + </p> +<pre class="programlisting"><span class="identifier">lambda</span><span class="special">(</span><span class="identifier">local</span><span class="special">-</span><span class="identifier">declarations</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">lambda</span><span class="special">-</span><span class="identifier">body</span> +<span class="special">]</span> +</pre> +<p> + The same restrictions apply with regard to scope and visibility. The RHS + (right hand side lambda-expression) of each local-declaration cannot refer + to any LHS local-id. The local-ids are not in scope yet; they will be in + scope only in the lambda-body: + </p> +<pre class="programlisting"><span class="identifier">lambda</span><span class="special">(</span> + <span class="identifier">_a</span> <span class="special">=</span> <span class="number">1</span> + <span class="special">,</span> <span class="identifier">_b</span> <span class="special">=</span> <span class="identifier">_a</span> <span class="comment">// Error: _a is not in scope yet</span> +<span class="special">)</span> +</pre> +<p> + See <a class="link" href="let.html#phoenix.modules.scope.let.visibility"><code class="computeroutput"><span class="identifier">let</span></code> Visibility</a> for more information. + </p> +<p> + Example: Using our lazy <code class="computeroutput"><span class="identifier">for_each</span></code> + let's print all the elements in a container: + </p> +<pre class="programlisting"><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">lambda</span><span class="special">[</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span><span class="special">])</span> +</pre> +<p> + As far as the arguments are concerned (arg1..argN), the scope in which + the lambda-body exists is totally new. The left <code class="computeroutput"><span class="identifier">arg1</span></code> + refers to the argument passed to <code class="computeroutput"><span class="identifier">for_each</span></code> + (a container). The right <code class="computeroutput"><span class="identifier">arg1</span></code> + refers to the argument passed by <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span></code> + when we finally get to call <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code> in our <code class="computeroutput"><span class="identifier">for_each_impl</span></code> + above (a container element). + </p> +<p> + Yet, we may wish to get information from outer scopes. While we do not + have access to arguments in outer scopes, what we still have is access + to local variables from outer scopes. We may only be able to pass argument + related information from outer <code class="computeroutput"><span class="identifier">lambda</span></code> + scopes through the local variables. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + This is a crucial difference between <code class="computeroutput"><span class="identifier">let</span></code> + and <code class="computeroutput"><span class="identifier">lambda</span></code>: <code class="computeroutput"><span class="identifier">let</span></code> does not introduce new arguments; + <code class="computeroutput"><span class="identifier">lambda</span></code> does. + </p></td></tr> +</table></div> +<p> + Another example: Using our lazy <code class="computeroutput"><span class="identifier">for_each</span></code>, + and a lazy <code class="computeroutput"><span class="identifier">push_back</span></code>: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">push_back_impl</span> +<span class="special">{</span> + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> + <span class="keyword">struct</span> <span class="identifier">result</span> + <span class="special">{</span> + <span class="keyword">typedef</span> <span class="keyword">void</span> <span class="identifier">type</span><span class="special">;</span> + <span class="special">};</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> + <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">C</span><span class="special">&</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">x</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="identifier">c</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span> + <span class="special">}</span> +<span class="special">};</span> + +<span class="identifier">function</span><span class="special"><</span><span class="identifier">push_back_impl</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">push_back</span> <span class="special">=</span> <span class="identifier">push_back_impl</span><span class="special">();</span> +</pre> +<p> + write a lambda expression that accepts: + </p> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + a 2-dimensional container (e.g. <code class="computeroutput"><span class="identifier">vector</span><span class="special"><</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span></code>) + </li> +<li class="listitem"> + a container element (e.g. <code class="computeroutput"><span class="keyword">int</span></code>) + </li> +</ol></div> +<p> + and pushes-back the element to each of the <code class="computeroutput"><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span></code>. + </p> +<p> + Solution: + </p> +<pre class="programlisting"><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> + <span class="identifier">lambda</span><span class="special">(</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">arg2</span><span class="special">)</span> + <span class="special">[</span> + <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">_a</span><span class="special">)</span> + <span class="special">]</span> +<span class="special">)</span> +</pre> +<p> + Since we do not have access to the arguments of the outer scopes beyond + the lambda-body, we introduce a local variable <code class="computeroutput"><span class="identifier">_a</span></code> + that captures the second outer argument: <code class="computeroutput"><span class="identifier">arg2</span></code>. + Hence: _a = arg2. This local variable is visible inside the lambda scope. + </p> +<p> + (See <a href="../../../../../example/lambda.cpp" target="_top">lambda.cpp</a>) + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="let.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../scope.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../bind.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/scope/let.html b/libs/phoenix/doc/html/phoenix/modules/scope/let.html new file mode 100644 index 0000000000..68a985a23d --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/scope/let.html @@ -0,0 +1,182 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>let</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../scope.html" title="Scope"> +<link rel="prev" href="local_variables.html" title="Local Variables"> +<link rel="next" href="lambda.html" title="lambda"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="local_variables.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../scope.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lambda.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.scope.let"></a><a class="link" href="let.html" title="let">let</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">scope</span><span class="special">/</span><span class="identifier">let</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + You declare local variables using the syntax: + </p> +<pre class="programlisting"><span class="identifier">let</span><span class="special">(</span><span class="identifier">local</span><span class="special">-</span><span class="identifier">declarations</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">let</span><span class="special">-</span><span class="identifier">body</span> +<span class="special">]</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">let</span></code> allows 1..N local variable + declarations (where N == <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LOCAL_LIMIT</span></code>). + Each declaration follows the form: + </p> +<pre class="programlisting"><span class="identifier">local</span><span class="special">-</span><span class="identifier">id</span> <span class="special">=</span> <span class="identifier">lambda</span><span class="special">-</span><span class="identifier">expression</span> +</pre> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + You can set <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LOCAL_LIMIT</span></code>, + the predefined maximum local variable declarations in a let expression. + By default, <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LOCAL_LIMIT</span></code> + is set to <code class="computeroutput"><span class="identifier">BOOST_PHOENIX_LIMIT</span></code>. + </p></td></tr> +</table></div> +<p> + Example: + </p> +<pre class="programlisting"><span class="identifier">let</span><span class="special">(</span><span class="identifier">_a</span> <span class="special">=</span> <span class="number">123</span><span class="special">,</span> <span class="identifier">_b</span> <span class="special">=</span> <span class="number">456</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">_a</span> <span class="special">+</span> <span class="identifier">_b</span> +<span class="special">]</span> +</pre> +<p> + <span class="bold"><strong>Reference Preservation</strong></span> + </p> +<p> + The type of the local variable assumes the type of the lambda- expression. + Type deduction is reference preserving. For example: + </p> +<pre class="programlisting"><span class="identifier">let</span><span class="special">(</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">_b</span> <span class="special">=</span> <span class="number">456</span><span class="special">)</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">_a</span></code> assumes the type of + <code class="computeroutput"><span class="identifier">arg1</span></code>: a reference to an + argument, while <code class="computeroutput"><span class="identifier">_b</span></code> has + type <code class="computeroutput"><span class="keyword">int</span></code>. + </p> +<p> + Consider this: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> + +<span class="identifier">let</span><span class="special">(</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">arg1</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="special">--</span><span class="identifier">_a</span> <span class="special"><<</span> <span class="char">' '</span> +<span class="special">]</span> +<span class="special">(</span><span class="identifier">i</span><span class="special">);</span> + +<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">i</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> +</pre> +<p> + the output of above is : 0 0 + </p> +<p> + While with this: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> + +<span class="identifier">let</span><span class="special">(</span><span class="identifier">_a</span> <span class="special">=</span> <span class="identifier">val</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">))</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="special">--</span><span class="identifier">_a</span> <span class="special"><<</span> <span class="char">' '</span> +<span class="special">]</span> +<span class="special">(</span><span class="identifier">i</span><span class="special">);</span> + +<span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">i</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> +</pre> +<p> + the output is : 0 1 + </p> +<p> + Reference preservation is necessary because we need to have L-value access + to outer lambda-scopes (especially the arguments). <code class="computeroutput"><span class="identifier">arg</span></code>s + and <code class="computeroutput"><span class="identifier">ref</span></code>s are L-values. + <code class="computeroutput"><span class="identifier">val</span></code>s are R-values. + </p> +<p> + <span class="bold"><strong>Visibility</strong></span> <a name="phoenix.modules.scope.let.visibility"></a> + </p> +<p> + The scope and lifetimes of the local variables is limited within the let-body. + <code class="computeroutput"><span class="identifier">let</span></code> blocks can be nested. + A local variable may hide an outer local variable. For example: + </p> +<pre class="programlisting"><span class="identifier">let</span><span class="special">(</span><span class="identifier">_x</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">_y</span> <span class="special">=</span> <span class="string">", World"</span><span class="special">)</span> +<span class="special">[</span> + <span class="comment">// _x here is an int: 1</span> + + <span class="identifier">let</span><span class="special">(</span><span class="identifier">_x</span> <span class="special">=</span> <span class="string">"Hello"</span><span class="special">)</span> <span class="comment">// hides the outer _x</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">_x</span> <span class="special"><<</span> <span class="identifier">_y</span> <span class="comment">// prints "Hello, World"</span> + <span class="special">]</span> +<span class="special">]</span> +</pre> +<p> + The RHS (right hand side lambda-expression) of each local-declaration cannot + refer to any LHS local-id. At this point, the local-ids are not in scope + yet; they will only be in scope in the let-body. The code below is in error: + </p> +<pre class="programlisting"><span class="identifier">let</span><span class="special">(</span> + <span class="identifier">_a</span> <span class="special">=</span> <span class="number">1</span> + <span class="special">,</span> <span class="identifier">_b</span> <span class="special">=</span> <span class="identifier">_a</span> <span class="comment">// Error: _a is not in scope yet</span> +<span class="special">)</span> +<span class="special">[</span> + <span class="comment">// _a and _b's scope starts here</span> + <span class="comment">/*. body .*/</span> +<span class="special">]</span> +</pre> +<p> + However, if an outer let scope is available, this will be searched. Since + the scope of the RHS of a local-declaration is the outer scope enclosing + the let, the RHS of a local-declaration can refer to a local variable of + an outer scope: + </p> +<pre class="programlisting"><span class="identifier">let</span><span class="special">(</span><span class="identifier">_a</span> <span class="special">=</span> <span class="number">1</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">let</span><span class="special">(</span> + <span class="identifier">_a</span> <span class="special">=</span> <span class="number">1</span> + <span class="special">,</span> <span class="identifier">_b</span> <span class="special">=</span> <span class="identifier">_a</span> <span class="comment">// Ok. _a refers to the outer _a</span> + <span class="special">)</span> + <span class="special">[</span> + <span class="comment">/*. body .*/</span> + <span class="special">]</span> +<span class="special">]</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="local_variables.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../scope.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lambda.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/scope/local_variables.html b/libs/phoenix/doc/html/phoenix/modules/scope/local_variables.html new file mode 100644 index 0000000000..28748b94a2 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/scope/local_variables.html @@ -0,0 +1,69 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Local Variables</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../scope.html" title="Scope"> +<link rel="prev" href="../scope.html" title="Scope"> +<link rel="next" href="let.html" title="let"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../scope.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../scope.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="let.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.scope.local_variables"></a><a class="link" href="local_variables.html" title="Local Variables">Local Variables</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">scope</span><span class="special">/</span><span class="identifier">local_variable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + We use an instance of: + </p> +<pre class="programlisting"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">local_variable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">>::</span><span class="identifier">type</span> +</pre> +<p> + to represent a local variable. The local variable acts as an imaginary + data-bin where a local, stack based data will be placed. <code class="computeroutput"><span class="identifier">Key</span></code> is an arbitrary type that is used + to identify the local variable. Example: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">size_key</span><span class="special">;</span> +<span class="identifier">expression</span><span class="special">::</span><span class="identifier">local_variable</span><span class="special"><</span><span class="identifier">size_key</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">size</span><span class="special">;</span> +</pre> +<p> + <span class="bold"><strong>Predefined Local Variables</strong></span> + </p> +<p> + There are a few predefined instances of <code class="computeroutput"><span class="identifier">expression</span><span class="special">::</span><span class="identifier">local_variable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">>::</span><span class="identifier">type</span></code> + named <code class="computeroutput"><span class="identifier">_a</span></code>..<code class="computeroutput"><span class="identifier">_z</span></code> that you can already use. To make + use of them, simply use the <code class="computeroutput"><span class="keyword">namespace</span> + <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">local_names</span></code>: + </p> +<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">local_names</span><span class="special">;</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../scope.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../scope.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="let.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement.html b/libs/phoenix/doc/html/phoenix/modules/statement.html new file mode 100644 index 0000000000..d699a79b9e --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement.html @@ -0,0 +1,114 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Statement</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="operator.html" title="Operator"> +<link rel="next" href="statement/block_statement.html" title="Block Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="operator.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="statement/block_statement.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.statement"></a><a class="link" href="statement.html" title="Statement">Statement</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="statement/block_statement.html">Block Statement</a></span></dt> +<dt><span class="section"><a href="statement/if__statement.html">if_ Statement</a></span></dt> +<dt><span class="section"><a href="statement/___if_else_____statement.html">if_else_ Statement</a></span></dt> +<dt><span class="section"><a href="statement/switch__statement.html">switch_ + Statement</a></span></dt> +<dt><span class="section"><a href="statement/while__statement.html">while_ + Statement</a></span></dt> +<dt><span class="section"><a href="statement/___do_while_____statement.html">do_while_ Statement</a></span></dt> +<dt><span class="section"><a href="statement/for_statement.html">for_ Statement</a></span></dt> +<dt><span class="section"><a href="statement/try__catch__statement.html">try_ + catch_ Statement</a></span></dt> +<dt><span class="section"><a href="statement/throw_.html">throw_</a></span></dt> +</dl></div> +<p> + <span class="bold"><strong><span class="emphasis"><em>Lazy statements...</em></span></strong></span> + </p> +<p> + The expressions presented so far are sufficiently powerful to construct quite + elaborate structures. We have presented lazy-functions and lazy-operators. + How about lazy-statements? First, an appetizer: + </p> +<p> + Print all odd-numbered contents of an STL container using <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span></code> + (<a href="../../../../example/all_odds.cpp" target="_top">all_odds.cpp</a>): + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="char">' '</span> + <span class="special">]</span> +<span class="special">);</span> +</pre> +<p> + Huh? Is that valid C++? Read on... + </p> +<p> + Yes, it is valid C++. The sample code above is as close as you can get to + the syntax of C++. This stylized C++ syntax differs from actual C++ code. + First, the <code class="computeroutput"><span class="keyword">if</span></code> has a trailing + underscore. Second, the block uses square brackets instead of the familiar + curly braces {}. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"> +<p> + <span class="bold"><strong>C++ in C++?</strong></span> + </p> +<p> + In as much as <a href="http://spirit.sourceforge.net" target="_top">Spirit</a> + attempts to mimic EBNF in C++, Phoenix attempts to mimic C++ in C++!!! + </p> +</td></tr> +</table></div> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + Unlike lazy functions and lazy operators, lazy statements always return + void. + </p></td></tr> +</table></div> +<p> + Here are more examples with annotations. The code almost speaks for itself. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="operator.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="statement/block_statement.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/___do_while_____statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/___do_while_____statement.html new file mode 100644 index 0000000000..271be2c453 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/___do_while_____statement.html @@ -0,0 +1,73 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>do_while_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="while__statement.html" title="while_ Statement"> +<link rel="next" href="for_statement.html" title="for_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="while__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="for_statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.___do_while_____statement"></a><a class="link" href="___do_while_____statement.html" title="do_while_ Statement">do_while_ Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="identifier">do_while</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The syntax is: + </p> +<pre class="programlisting"><span class="identifier">do_</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">while_</span><span class="special">(</span><span class="identifier">conditional_expression</span><span class="special">)</span> +</pre> +<p> + Again, take note that <code class="computeroutput"><span class="keyword">while</span></code> + has a leading dot and a trailing underscore: <code class="computeroutput"><span class="special">.</span><span class="identifier">while_</span></code> + </p> +<p> + Example: This code is almost the same as the previous example above with + a slight twist in logic. + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="special">(</span> + <span class="identifier">do_</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">", "</span> + <span class="special">]</span> + <span class="special">.</span><span class="identifier">while_</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">--),</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"\n"</span><span class="special">)</span> + <span class="special">)</span> +<span class="special">);</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="while__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="for_statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/___if_else_____statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/___if_else_____statement.html new file mode 100644 index 0000000000..991df896df --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/___if_else_____statement.html @@ -0,0 +1,88 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>if_else_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="if__statement.html" title="if_ Statement"> +<link rel="next" href="switch__statement.html" title="switch_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="if__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="switch__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.___if_else_____statement"></a><a class="link" href="___if_else_____statement.html" title="if_else_ Statement">if_else_ Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="keyword">if</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The syntax is + </p> +<pre class="programlisting"><span class="identifier">if_</span><span class="special">(</span><span class="identifier">conditional_expression</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">else_</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +</pre> +<p> + Take note that <code class="computeroutput"><span class="keyword">else</span></code> has a + leading dot and a trailing underscore: <code class="computeroutput"><span class="special">.</span><span class="identifier">else_</span></code> + </p> +<p> + Example: This code prints out all the elements and appends <code class="computeroutput"><span class="string">" > 5"</span></code>, <code class="computeroutput"><span class="string">" + == 5"</span></code> or <code class="computeroutput"><span class="string">" < 5"</span></code> + depending on the element's actual value: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">></span> <span class="number">5</span><span class="special">)</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">" > 5\n"</span> + <span class="special">]</span> + <span class="special">.</span><span class="identifier">else_</span> + <span class="special">[</span> + <span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">==</span> <span class="number">5</span><span class="special">)</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">" == 5\n"</span> + <span class="special">]</span> + <span class="special">.</span><span class="identifier">else_</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">" < 5\n"</span> + <span class="special">]</span> + <span class="special">]</span> +<span class="special">);</span> +</pre> +<p> + Notice how the <code class="computeroutput"><span class="identifier">if_else_</span></code> + statement is nested. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="if__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="switch__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/block_statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/block_statement.html new file mode 100644 index 0000000000..62ee942f60 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/block_statement.html @@ -0,0 +1,91 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Block Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="../statement.html" title="Statement"> +<link rel="next" href="if__statement.html" title="if_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="if__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.block_statement"></a><a class="link" href="block_statement.html" title="Block Statement">Block Statement</a> +</h4></div></div></div> +<p> + Syntax: + </p> +<pre class="programlisting"><span class="identifier">statement</span><span class="special">,</span> +<span class="identifier">statement</span><span class="special">,</span> +<span class="special">....</span> +<span class="identifier">statement</span> +</pre> +<p> + Basically, these are comma separated statements. Take note that unlike + the C/C++ semicolon, the comma is a separator put <span class="bold"><strong>in-between</strong></span> + statements. This is like Pascal's semicolon separator, rather than C/C++'s + semicolon terminator. For example: + </p> +<pre class="programlisting"><span class="identifier">statement</span><span class="special">,</span> +<span class="identifier">statement</span><span class="special">,</span> +<span class="identifier">statement</span><span class="special">,</span> <span class="comment">// ERROR!</span> +</pre> +<p> + Is an error. The last statement should not have a comma. Block statements + can be grouped using the parentheses. Again, the last statement in a group + should not have a trailing comma. + </p> +<pre class="programlisting"><span class="identifier">statement</span><span class="special">,</span> +<span class="identifier">statement</span><span class="special">,</span> +<span class="special">(</span> + <span class="identifier">statement</span><span class="special">,</span> + <span class="identifier">statement</span> +<span class="special">),</span> +<span class="identifier">statement</span> +</pre> +<p> + Outside the square brackets, block statements should be grouped. For example: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="special">(</span> + <span class="identifier">do_this</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">),</span> + <span class="identifier">do_that</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> + <span class="special">)</span> +<span class="special">);</span> +</pre> +<p> + Wrapping a comma operator chain around a parentheses pair blocks the interpretation + as an argument separator. The reason for the exception for the square bracket + operator is that the operator always takes exactly one argument, so it + "transforms" any attempt at multiple arguments with a comma operator + chain (and spits out an error for zero arguments). + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="if__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/for_statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/for_statement.html new file mode 100644 index 0000000000..232fa356a2 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/for_statement.html @@ -0,0 +1,81 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>for_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="___do_while_____statement.html" title="do_while_ Statement"> +<link rel="next" href="try__catch__statement.html" title="try_ catch_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="___do_while_____statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="try__catch__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.for_statement"></a><a class="link" href="for_statement.html" title="for_ Statement">for_ Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="keyword">for</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The syntax is: + </p> +<pre class="programlisting"><span class="identifier">for_</span><span class="special">(</span><span class="identifier">init_statement</span><span class="special">,</span> <span class="identifier">conditional_expression</span><span class="special">,</span> <span class="identifier">step_statement</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +</pre> +<p> + It is again very similar to the C++ for statement. Take note that the init_statement, + conditional_expression and step_statement are separated by the comma instead of the semi-colon + and each must be present (i.e. <code class="computeroutput"><span class="identifier">for_</span><span class="special">(,,)</span></code> is invalid). This is a case where the + <a class="link" href="../core/nothing.html" title="Nothing"><code class="computeroutput"><span class="identifier">nothing</span></code></a> + actor can be useful. + </p> +<p> + Example: This code prints each element N times where N is the element's + value. A newline terminates the printout of each value. + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">iii</span><span class="special">;</span> +<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="special">(</span> + <span class="identifier">for_</span><span class="special">(</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">iii</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">iii</span><span class="special">)</span> <span class="special"><</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="special">++</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">iii</span><span class="special">))</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">", "</span> + <span class="special">],</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"\n"</span><span class="special">)</span> + <span class="special">)</span> +<span class="special">);</span> +</pre> +<p> + As before, all these are lazily evaluated. The result of such statements + are in fact expressions that are passed on to STL's for_each function. + In the viewpoint of <code class="computeroutput"><span class="identifier">for_each</span></code>, + what was passed is just a functor, no more, no less. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="___do_while_____statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="try__catch__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/if__statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/if__statement.html new file mode 100644 index 0000000000..a36dc49dff --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/if__statement.html @@ -0,0 +1,54 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>if_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="block_statement.html" title="Block Statement"> +<link rel="next" href="___if_else_____statement.html" title="if_else_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="block_statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="___if_else_____statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.if__statement"></a><a class="link" href="if__statement.html" title="if_ Statement">if_ Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="keyword">if</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + We have seen the <code class="computeroutput"><span class="identifier">if_</span></code> statement. + The syntax is: + </p> +<pre class="programlisting"><span class="identifier">if_</span><span class="special">(</span><span class="identifier">conditional_expression</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="block_statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="___if_else_____statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/switch__statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/switch__statement.html new file mode 100644 index 0000000000..811ff36c18 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/switch__statement.html @@ -0,0 +1,74 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>switch_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="___if_else_____statement.html" title="if_else_ Statement"> +<link rel="next" href="while__statement.html" title="while_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="___if_else_____statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="while__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.switch__statement"></a><a class="link" href="switch__statement.html" title="switch_ Statement">switch_ + Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="keyword">switch</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The syntax is: + </p> +<pre class="programlisting"><span class="identifier">switch_</span><span class="special">(</span><span class="identifier">integral_expression</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">case_</span><span class="special"><</span><span class="identifier">integral_value</span><span class="special">>(</span><span class="identifier">sequenced_statements</span><span class="special">),</span> + <span class="special">...</span> + <span class="identifier">default_</span><span class="special"><</span><span class="identifier">integral_value</span><span class="special">>(</span><span class="identifier">sequenced_statements</span><span class="special">)</span> +<span class="special">]</span> +</pre> +<p> + A comma separated list of cases, and an optional default can be provided. + Note unlike a normal switch statement, cases do not fall through. + </p> +<p> + Example: This code prints out <code class="computeroutput"><span class="string">"one"</span></code>, + <code class="computeroutput"><span class="string">"two"</span></code> or <code class="computeroutput"><span class="string">"other value"</span></code> depending on the + element's actual value: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="identifier">switch_</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> + <span class="special">[</span> + <span class="identifier">case_</span><span class="special"><</span><span class="number">1</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"one"</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">),</span> + <span class="identifier">case_</span><span class="special"><</span><span class="number">2</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"two"</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">),</span> + <span class="identifier">default_</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"other value"</span><span class="special">)</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">)</span> + <span class="special">]</span> +<span class="special">);</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="___if_else_____statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="while__statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/throw_.html b/libs/phoenix/doc/html/phoenix/modules/statement/throw_.html new file mode 100644 index 0000000000..c115029cbf --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/throw_.html @@ -0,0 +1,84 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>throw_</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="try__catch__statement.html" title="try_ catch_ Statement"> +<link rel="next" href="../object.html" title="Object"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="try__catch__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../object.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.throw_"></a><a class="link" href="throw_.html" title="throw_">throw_</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="keyword">throw</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + As a natural companion to the try/catch support, the statement module provides + lazy throwing and re-throwing of exceptions. + </p> +<p> + The syntax to throw an exception is: + </p> +<pre class="programlisting"><span class="identifier">throw_</span><span class="special">(</span><span class="identifier">exception_expression</span><span class="special">)</span> +</pre> +<p> + The syntax to re-throw an exception is: + </p> +<pre class="programlisting"><span class="identifier">throw_</span><span class="special">()</span> +</pre> +<p> + Example: This code extends the try/catch example, re-throwing exceptions + derived from runtime_error or exception, and translating other exception + types to runtime_errors. + </p> +<pre class="programlisting"><span class="identifier">try_</span> +<span class="special">[</span> + <span class="identifier">f</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">runtime_error</span><span class="special">>()</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"caught runtime error or derived\n"</span><span class="special">),</span> + <span class="identifier">throw_</span><span class="special">()</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">exception</span><span class="special">>()</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"caught exception or derived\n"</span><span class="special">),</span> + <span class="identifier">throw_</span><span class="special">()</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_all</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"caught some other type of exception\n"</span><span class="special">),</span> + <span class="identifier">throw_</span><span class="special">(</span><span class="identifier">runtime_error</span><span class="special">(</span><span class="string">"translated exception"</span><span class="special">))</span> +<span class="special">]</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="try__catch__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../object.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/try__catch__statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/try__catch__statement.html new file mode 100644 index 0000000000..e97ab4606f --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/try__catch__statement.html @@ -0,0 +1,89 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>try_ catch_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="for_statement.html" title="for_ Statement"> +<link rel="next" href="throw_.html" title="throw_"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="for_statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="throw_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.try__catch__statement"></a><a class="link" href="try__catch__statement.html" title="try_ catch_ Statement">try_ + catch_ Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="identifier">try_catch</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The syntax is: + </p> +<pre class="programlisting"><span class="identifier">try_</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">exception_type</span><span class="special">>()</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +<span class="special">...</span> +<span class="special">.</span><span class="identifier">catch_all</span> +<span class="special">[</span> + <span class="identifier">sequenced_statement</span> +<span class="special">]</span> +</pre> +<p> + Note the usual underscore after try and catch, and the extra parentheses + required after the catch. + </p> +<p> + Example: The following code calls the (lazy) function <code class="computeroutput"><span class="identifier">f</span></code> + for each element, and prints messages about different exception types it + catches. + </p> +<pre class="programlisting"><span class="identifier">try_</span> +<span class="special">[</span> + <span class="identifier">f</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">runtime_error</span><span class="special">>()</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"caught runtime error or derived\n"</span><span class="special">)</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_</span><span class="special"><</span><span class="identifier">exception</span><span class="special">>()</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"caught exception or derived\n"</span><span class="special">)</span> +<span class="special">]</span> +<span class="special">.</span><span class="identifier">catch_all</span> +<span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"caught some other type of exception\n"</span><span class="special">)</span> +<span class="special">]</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="for_statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="throw_.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/statement/while__statement.html b/libs/phoenix/doc/html/phoenix/modules/statement/while__statement.html new file mode 100644 index 0000000000..1668aa7804 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/statement/while__statement.html @@ -0,0 +1,69 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>while_ Statement</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../statement.html" title="Statement"> +<link rel="prev" href="switch__statement.html" title="switch_ Statement"> +<link rel="next" href="___do_while_____statement.html" title="do_while_ Statement"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="switch__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="___do_while_____statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.statement.while__statement"></a><a class="link" href="while__statement.html" title="while_ Statement">while_ + Statement</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">/</span><span class="keyword">while</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The syntax is: + </p> +<pre class="programlisting"><span class="identifier">while_</span><span class="special">(</span><span class="identifier">conditional_expression</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">sequenced_statements</span> +<span class="special">]</span> +</pre> +<p> + Example: This code decrements each element until it reaches zero and prints + out the number at each step. A newline terminates the printout of each + value. + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="special">(</span> + <span class="identifier">while_</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">--)</span> + <span class="special">[</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">", "</span> + <span class="special">],</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="string">"\n"</span><span class="special">)</span> + <span class="special">)</span> +<span class="special">);</span> +</pre> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="switch__statement.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../statement.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="___do_while_____statement.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/stl.html b/libs/phoenix/doc/html/phoenix/modules/stl.html new file mode 100644 index 0000000000..4494441527 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/stl.html @@ -0,0 +1,52 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>STL</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../modules.html" title="Modules"> +<link rel="prev" href="bind/compatibility_with_boost_bind.html" title="Compatibility with Boost.Bind"> +<link rel="next" href="stl/container.html" title="Container"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="bind/compatibility_with_boost_bind.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stl/container.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.modules.stl"></a><a class="link" href="stl.html" title="STL">STL</a> +</h3></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="stl/container.html">Container</a></span></dt> +<dt><span class="section"><a href="stl/algorithm.html">Algorithm</a></span></dt> +</dl></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + This section summarizes the lazy equivalents of C++ Standard Library functionality + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="bind/compatibility_with_boost_bind.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../modules.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stl/container.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/stl/algorithm.html b/libs/phoenix/doc/html/phoenix/modules/stl/algorithm.html new file mode 100644 index 0000000000..93ce039bd2 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/stl/algorithm.html @@ -0,0 +1,1141 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Algorithm</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../stl.html" title="STL"> +<link rel="prev" href="container.html" title="Container"> +<link rel="next" href="../../inside.html" title="Inside Phoenix"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="container.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../inside.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.stl.algorithm"></a><a class="link" href="algorithm.html" title="Algorithm">Algorithm</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The algorithm module provides wrappers for the standard algorithms in the + <code class="computeroutput"><span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span></code> and <code class="computeroutput"><span class="special"><</span><span class="identifier">numeric</span><span class="special">></span></code> + headers. + </p> +<p> + The algorithms are divided into the categories iteration, transformation + and querying, modeling the <a href="http://boost.org/libs/mpl/doc/index.html" target="_top">Boost.MPL</a> + library. The different algorithm classes can be included using the headers: + </p> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">iteration</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">transformation</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">querying</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The functions of the algorithm module take ranges as arguments where appropriate. + This is different to the standard library, but easy enough to pick up. + Ranges are described in detail in the <a href="http://boost.org/libs/range/index.html" target="_top">Boost.Range</a> + library. + </p> +<p> + For example, using the standard copy algorithm to copy between 2 arrays: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">array</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">};</span> +<span class="keyword">int</span> <span class="identifier">output</span><span class="special">[</span><span class="number">3</span><span class="special">];</span> +<span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">array</span><span class="special">,</span> <span class="identifier">array</span> <span class="special">+</span> <span class="number">3</span><span class="special">,</span> <span class="identifier">output</span><span class="special">);</span> <span class="comment">// We have to provide iterators</span> + <span class="comment">// to both the start and end of array</span> +</pre> +<p> + The analogous code using the phoenix algorithm module is: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">array</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">};</span> +<span class="keyword">int</span> <span class="identifier">output</span><span class="special">[</span><span class="number">3</span><span class="special">];</span> +<span class="identifier">copy</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)(</span><span class="identifier">array</span><span class="special">,</span> <span class="identifier">output</span><span class="special">);</span> <span class="comment">// Notice only 2 arguments, the end of</span> + <span class="comment">// array is established automatically</span> +</pre> +<p> + The <a href="http://boost.org/libs/range/index.html" target="_top">Boost.Range</a> + library provides support for standard containers, strings and arrays, and + can be extended to support additional types. + </p> +<p> + The following tables describe the different categories of algorithms, and + their semantics. + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../../images/tip.png" alt="tip"></span> Arguments in brackets denote optional parameters. + </p> +</div> +<div class="table"> +<a name="phoenix.modules.stl.algorithm.t0"></a><p class="title"><b>Table 1.6. Iteration Algorithms</b></p> +<div class="table-contents"><table class="table" summary="Iteration Algorithms"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Function + </p> + </th> +<th> + <p> + stl Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">accumulate</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">accumulate</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><div class="table"> +<a name="phoenix.modules.stl.algorithm.t1"></a><p class="title"><b>Table 1.7. Querying Algorithms</b></p> +<div class="table-contents"><table class="table" summary="Querying Algorithms"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Function + </p> + </th> +<th> + <p> + stl Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">find</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">find_end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> + <span class="identifier">r2</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">find_end</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">find_first_of</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">find_first_of</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">adjacent_find</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">adjacent_find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">count</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">count</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">count_if</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">count_if</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">distance</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">))</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">mismatch</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">i</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">mismatch</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">i</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">equal</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">i</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">i</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">search</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> + <span class="identifier">r2</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">search</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">lower_bound</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">lower_bound</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">upper_bound</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">upper_bound</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">equal_range</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">equal_range</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">binary_search</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">a</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">binary_search</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">a</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">includes</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> + <span class="identifier">r2</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">includes</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">min_element</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">min_element</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">max_element</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">max_element</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">lexicographical_compare</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">lexicographical_compare</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><div class="table"> +<a name="phoenix.modules.stl.algorithm.t2"></a><p class="title"><b>Table 1.8. Transformation Algorithms</b></p> +<div class="table-contents"><table class="table" summary="Transformation Algorithms"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Function + </p> + </th> +<th> + <p> + stl Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">copy</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">copy_backward</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">copy_backward</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">transform</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">transform</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">transform</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">i</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">transform</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">i</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">,</span> + <span class="identifier">b</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">,</span> + <span class="identifier">b</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace_if</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace_copy</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace_copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace_copy_if</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">replace_copy_if</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">fill</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">fill</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">fill_n</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">n</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">fill_n</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">n</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">generate</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">generate</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">generate_n</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">n</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">generate_n</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">n</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove_if</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove_if</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove_copy</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove_copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove_copy_if</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">remove_copy_if</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">unique</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">unique</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">unique_copy</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">unique_copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">reverse</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">reverse</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">))</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">reverse_copy</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">reverse_copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">rotate</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">m</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">rotate</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">m</span><span class="special">,</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">))</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">rotate_copy</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">m</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">rotate_copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">m</span><span class="special">,</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">random_shuffle</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">random_shuffle</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">partition</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">partition</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">stable_partition</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">stable_partition</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">f</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">sort</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">sort</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">stable_sort</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">stable_sort</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">partial_sort</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">m</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">partial_sort</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">partial_sort_copy</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">partial_sort_copy</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">nth_element</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">n</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">nth_element</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">n</span><span class="special">,</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">merge</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> + <span class="identifier">r2</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">merge</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">inplace_merge</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">m</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">inplace_merge</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">m</span><span class="special">,</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_union</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> + <span class="identifier">r2</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_union</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> + <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_intersection</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">,</span> <span class="identifier">o</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_intersection</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_difference</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">,</span> <span class="identifier">o</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_difference</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_symmetric_difference</span><span class="special">(</span><span class="identifier">r1</span><span class="special">,</span> <span class="identifier">r2</span><span class="special">,</span> <span class="identifier">o</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">set_symmetric_difference</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r1</span><span class="special">),</span> <span class="identifier">begin</span><span class="special">(</span><span class="identifier">r2</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r2</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">push_heap</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">push_heap</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">pop_heap</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">pop_heap</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">make_heap</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">make_heap</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">sort_heap</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">sort_heap</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">next_permutation</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">next_permutation</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">prev_permutation</span><span class="special">(</span><span class="identifier">r</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">prev_permutation</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">)[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">inner_product</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">,</span> <span class="identifier">a</span><span class="special">[,</span> <span class="identifier">f1</span><span class="special">,</span> <span class="identifier">f2</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">inner_product</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">[,</span> <span class="identifier">f1</span><span class="special">,</span> <span class="identifier">f2</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">partial_sum</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">partial_sum</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> + <span class="identifier">o</span><span class="special">[,</span> + <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">adjacent_difference</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="identifier">o</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">adjacent_difference</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">end</span><span class="special">(</span><span class="identifier">r</span><span class="special">),</span> <span class="identifier">o</span><span class="special">[,</span> <span class="identifier">f</span><span class="special">])</span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="container.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../inside.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/modules/stl/container.html b/libs/phoenix/doc/html/phoenix/modules/stl/container.html new file mode 100644 index 0000000000..b224139983 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/modules/stl/container.html @@ -0,0 +1,601 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Container</title> +<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../stl.html" title="STL"> +<link rel="prev" href="../stl.html" title="STL"> +<link rel="next" href="algorithm.html" title="Algorithm"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../stl.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="algorithm.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h4 class="title"> +<a name="phoenix.modules.stl.container"></a><a class="link" href="container.html" title="Container">Container</a> +</h4></div></div></div> +<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> +</pre> +<p> + The container module predefines a set of lazy functions that work on STL + containers. These functions provide a mechanism for the lazy evaluation + of the public member functions of the STL containers. The lazy functions + are thin wrappers that simply forward to their respective counterparts + in the STL library. + </p> +<p> + Lazy functions are provided for all of the member functions of the following + containers: + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + deque + </li> +<li class="listitem"> + list + </li> +<li class="listitem"> + map + </li> +<li class="listitem"> + multimap + </li> +<li class="listitem"> + vector + </li> +</ul></div> +<p> + Indeed, should your class have member functions with the same names and + signatures as those listed below, then it will automatically be supported. + To summarize, lazy functions are provided for member functions: + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + assign + </li> +<li class="listitem"> + at + </li> +<li class="listitem"> + back + </li> +<li class="listitem"> + begin + </li> +<li class="listitem"> + capacity + </li> +<li class="listitem"> + clear + </li> +<li class="listitem"> + empty + </li> +<li class="listitem"> + end + </li> +<li class="listitem"> + erase + </li> +<li class="listitem"> + front + </li> +<li class="listitem"> + get_allocator + </li> +<li class="listitem"> + insert + </li> +<li class="listitem"> + key_comp + </li> +<li class="listitem"> + max_size + </li> +<li class="listitem"> + pop_back + </li> +<li class="listitem"> + pop_front + </li> +<li class="listitem"> + push_back + </li> +<li class="listitem"> + push_front + </li> +<li class="listitem"> + rbegin + </li> +<li class="listitem"> + rend + </li> +<li class="listitem"> + reserve + </li> +<li class="listitem"> + resize + </li> +<li class="listitem"> + size + </li> +<li class="listitem"> + splice + </li> +<li class="listitem"> + value_comp + </li> +</ul></div> +<p> + The lazy functions' names are the same as the corresponding member function. + The difference is that the lazy functions are free functions and therefore + does not use the member "dot" syntax. + </p> +<div class="table"> +<a name="phoenix.modules.stl.container.t0"></a><p class="title"><b>Table 1.4. Sample usage</b></p> +<div class="table-contents"><table class="table" summary="Sample usage"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + "Normal" version + </p> + </th> +<th> + <p> + "Lazy" version + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">my_vector</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="number">5</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">at</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> + <span class="number">5</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">my_list</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">size</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">my_vector1</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">my_vector2</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">swap</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">,</span> + <span class="identifier">arg2</span><span class="special">)</span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><p> + Notice that member functions with names that clash with stl algorithms + are absent. This will be provided in Phoenix's algorithm module. + </p> +<p> + No support is provided here for lazy versions of <code class="computeroutput"><span class="keyword">operator</span><span class="special">+=</span></code>, <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code> etc. Such operators are not specific + to STL containers and lazy versions can therefore be found in <a class="link" href="../operator.html" title="Operator">operators</a>. + </p> +<p> + The following table describes the container functions and their semantics. + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../../images/tip.png" alt="tip"></span> Arguments in brackets denote optional parameters. + </p> +</div> +<div class="table"> +<a name="phoenix.modules.stl.container.t1"></a><p class="title"><b>Table 1.5. Lazy STL Container Functions</b></p> +<div class="table-contents"><table class="table" summary="Lazy STL Container Functions"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Function + </p> + </th> +<th> + <p> + Semantics + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">assign</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">,</span> + <span class="identifier">c</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">,</span> + <span class="identifier">c</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">at</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">i</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">back</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">back</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">begin</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">capacity</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">clear</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">clear</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">empty</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">empty</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">end</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">erase</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">front</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">front</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">get_allocator</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">insert</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">,</span> + <span class="identifier">c</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">,</span> + <span class="identifier">c</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">key_comp</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">key_comp</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">max_size</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">pop_back</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">pop_front</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">pop_front</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">d</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">push_front</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">d</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">push_front</span><span class="special">(</span><span class="identifier">d</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">pop_front</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">pop_front</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">rbegin</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">rend</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">rend</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">n</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">resize</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">size</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">splice</span><span class="special">(</span><span class="identifier">c</span><span class="special">,</span> + <span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">,</span> + <span class="identifier">c</span><span class="special">,</span> + <span class="identifier">d</span><span class="special">])</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">splice</span><span class="special">(</span><span class="identifier">a</span><span class="special">[,</span> + <span class="identifier">b</span><span class="special">,</span> + <span class="identifier">c</span><span class="special">,</span> + <span class="identifier">d</span><span class="special">])</span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + <code class="computeroutput"><span class="identifier">value_comp</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code> + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="identifier">c</span><span class="special">.</span><span class="identifier">value_comp</span><span class="special">()</span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../stl.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="algorithm.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/organization.html b/libs/phoenix/doc/html/phoenix/organization.html new file mode 100644 index 0000000000..0028b4382a --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/organization.html @@ -0,0 +1,361 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Organization</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="basics.html" title="Basics"> +<link rel="next" href="actor.html" title="Actor"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="basics.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="actor.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.organization"></a><a class="link" href="organization.html" title="Organization">Organization</a> +</h2></div></div></div> +<p> + Care and attention to detail was given, painstakingly, to the design and implementation + of Phoenix. + </p> +<p> + The library is organized in four layers: + </p> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + Actor + </li> +<li class="listitem"> + Value, Reference, Arguments + </li> +<li class="listitem"> + Function, Operator, Object, Statement, Scope + </li> +<li class="listitem"> + STL, Fusion, Bind + </li> +</ol></div> +<p> + The modules are orthogonal, with no cyclic dependencies. Lower layers do not + depend on higher layers. Modules in a layer do not depend on other modules + in the same layer. This means, for example, that Bind can be completely discarded + if it is not required; or one could perhaps take out Operator and Statement + and just use Function, which may be desirable in a pure FP application. + </p> +<p> + The library has grown from the original Phoenix but still comprises only header + files. There are no object files to link against. + </p> +<h3> +<a name="phoenix.organization.h0"></a> + <span><a name="phoenix.organization.core"></a></span><a class="link" href="organization.html#phoenix.organization.core">Core</a> + </h3> +<p> + The lowest two layers comprise the core. + </p> +<p> + The <a class="link" href="actor.html" title="Actor"><code class="computeroutput"><span class="identifier">Actor</span></code></a> + is the main concept behind the library. Lazy functions are abstracted as actors. + </p> +<p> + Terminals provide the basic building blocks of functionality within Phoenix. + Expressions are used to combine these terminals together to provide more powerful + functionality. + </p> +<p> + Expressions are composed of zero or more actors. Each actor in a composite + can again be another expression. + </p> +<div class="table"> +<a name="phoenix.organization.t0"></a><p class="title"><b>Table 1.2. Modules</b></p> +<div class="table-contents"><table class="table" summary="Modules"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Module + </p> + </th> +<th> + <p> + Description + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + Function + </p> + </td> +<td> + <p> + Lazy functions support (e.g. <code class="computeroutput"><span class="identifier">add</span></code>) + </p> + </td> +</tr> +<tr> +<td> + <p> + Operator + </p> + </td> +<td> + <p> + Lazy operators support (e.g. <code class="computeroutput"><span class="special">+</span></code>) + </p> + </td> +</tr> +<tr> +<td> + <p> + Statement + </p> + </td> +<td> + <p> + Lazy statements (e.g. <code class="computeroutput"><span class="identifier">if_</span></code>, + <code class="computeroutput"><span class="identifier">while_</span></code>) + </p> + </td> +</tr> +<tr> +<td> + <p> + Object + </p> + </td> +<td> + <p> + Lazy casts (e.g. <code class="computeroutput"><span class="identifier">static_cast_</span></code>), + object creation destruction (e.g. <code class="computeroutput"><span class="identifier">new_</span></code>, + <code class="computeroutput"><span class="identifier">delete_</span></code>) + </p> + </td> +</tr> +<tr> +<td> + <p> + Scope + </p> + </td> +<td> + <p> + Support for scopes, local variables and lambda-lambda + </p> + </td> +</tr> +<tr> +<td> + <p> + Bind + </p> + </td> +<td> + <p> + Lazy functions from free functions, member functions or member variables. + </p> + </td> +</tr> +<tr> +<td> + <p> + STL Container + </p> + </td> +<td> + <p> + Set of predefined "lazy" functions that work on STL containers + and sequences (e.g. <code class="computeroutput"><span class="identifier">push_back</span></code>). + </p> + </td> +</tr> +<tr> +<td> + <p> + STL Algorithm + </p> + </td> +<td> + <p> + Set of predefined "lazy" versions of the STL algorithms + (e.g. <code class="computeroutput"><span class="identifier">find_if</span></code>). + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><p> + Each module is defined in a header file with the same name. For example, the + core module is defined in <code class="computeroutput"><span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>. + </p> +<div class="table"> +<a name="phoenix.organization.t1"></a><p class="title"><b>Table 1.3. Includes</b></p> +<div class="table-contents"><table class="table" summary="Includes"> +<colgroup> +<col> +<col> +</colgroup> +<thead><tr> +<th> + <p> + Module + </p> + </th> +<th> + <p> + File + </p> + </th> +</tr></thead> +<tbody> +<tr> +<td> + <p> + Core + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">core</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Function + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Operator + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="keyword">operator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Statement + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">statement</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Object + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">object</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Scope + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">scope</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Bind + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Container + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +<tr> +<td> + <p> + Algorithm + </p> + </td> +<td> + <p> + <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">phoenix</span><span class="special">/</span><span class="identifier">stl</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code> + </p> + </td> +</tr> +</tbody> +</table></div> +</div> +<br class="table-break"><div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../images/tip.png" alt="tip"></span> Finer grained include files are available per feature; + see the succeeding sections. + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="basics.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="actor.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/references.html b/libs/phoenix/doc/html/phoenix/references.html new file mode 100644 index 0000000000..1db0e4107b --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/references.html @@ -0,0 +1,90 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>References</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="acknowledgments.html" title="Acknowledgments"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="acknowledgments.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.references"></a><a class="link" href="references.html" title="References">References</a> +</h2></div></div></div> +<div class="orderedlist"><ol class="orderedlist" type="1"> +<li class="listitem"> + Why Functional Programming Matters, John Hughes, 1989. Available online + at <a href="http://www.math.chalmers.se/~rjmh/Papers/whyfp.html" target="_top">http://www.math.chalmers.se/~rjmh/Papers/whyfp.html</a>. + </li> +<li class="listitem"> + Boost.Lambda library, Jaakko Jarvi, 1999-2004 Jaakko Jarvi, Gary Powell. + Available online at <a href="http://www.boost.org/libs/lambda/" target="_top">http://www.boost.org/libs/lambda/</a>. + </li> +<li class="listitem"> + Functional Programming in C++ using the FC++ Library: a short article introducing + FC++, Brian McNamara and Yannis Smaragdakis, August 2003. Available online + at <a href="http://www.cc.gatech.edu/~yannis/fc++/" target="_top">http://www.cc.gatech.edu/~yannis/fc++/</a>. + </li> +<li class="listitem"> + Side-effects and partial function application in C++, Jaakko Jarvi and + Gary Powell, 2001. Available online at <a href="http://osl.iu.edu/~jajarvi/publications/papers/mpool01.pdf" target="_top">http://osl.iu.edu/~jajarvi/publications/papers/mpool01.pdf</a>. + </li> +<li class="listitem"> + Spirit Version 1.8.1, Joel de Guzman, Nov 2004. Available online at <a href="http://www.boost.org/libs/spirit/" target="_top">http://www.boost.org/libs/spirit/</a>. + </li> +<li class="listitem"> + The Boost MPL Library, Aleksey Gurtovoy and David Abrahams, 2002-2004. + Available online at <a href="http://www.boost.org/libs/mpl/" target="_top">http://www.boost.org/libs/mpl/</a>. + </li> +<li class="listitem"> + Generic Programming Redesign of Patterns, Proceedings of the 5th European + Conference on Pattern Languages of Programs, (EuroPLoP'2000) Irsee, Germany, + July 2000. Available online at <a href="http://www.coldewey.com/europlop2000/papers/geraud%2Bduret.zip" target="_top">http://www.coldewey.com/europlop2000/papers/geraud%2Bduret.zip</a>. + </li> +<li class="listitem"> + A Gentle Introduction to Haskell, Paul Hudak, John Peterson and Joseph + Fasel, 1999. Available online at <a href="http://www.haskell.org/tutorial/" target="_top">http://www.haskell.org/tutorial/</a>. + </li> +<li class="listitem"> + Large scale software design, John Lackos, ISBN 0201633620, Addison-Wesley, + July 1996. + </li> +<li class="listitem"> + Design Patterns, Elements of Reusable Object-Oriented Software, Erich Gamma, + Richard Helm, Ralph Jhonson, and John Vlissides, Addison-Wesley, 1995. + </li> +<li class="listitem"> + The Forwarding Problem: Arguments Peter Dimov, Howard E. Hinnant, Dave + Abrahams, September 09, 2002. Available online: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm" target="_top">Forwarding + Function Problem</a>. + </li> +</ol></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="acknowledgments.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit.html b/libs/phoenix/doc/html/phoenix/starter_kit.html new file mode 100644 index 0000000000..861f73f264 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit.html @@ -0,0 +1,104 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Starter Kit</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="introduction.html" title="Introduction"> +<link rel="next" href="starter_kit/values.html" title="Values"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="introduction.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="starter_kit/values.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.starter_kit"></a><a class="link" href="starter_kit.html" title="Starter Kit">Starter Kit</a> +</h2></div></div></div> +<div class="toc"><dl> +<dt><span class="section"><a href="starter_kit/values.html">Values</a></span></dt> +<dt><span class="section"><a href="starter_kit/references.html">References</a></span></dt> +<dt><span class="section"><a href="starter_kit/arguments.html">Arguments</a></span></dt> +<dt><span class="section"><a href="starter_kit/lazy_operators.html">Lazy Operators</a></span></dt> +<dt><span class="section"><a href="starter_kit/lazy_statements.html">Lazy Statements</a></span></dt> +<dt><span class="section"><a href="starter_kit/construct__new__delete__casts.html">Construct, + New, Delete, Casts</a></span></dt> +<dt><span class="section"><a href="starter_kit/lazy_functions.html">Lazy Functions</a></span></dt> +<dt><span class="section"><a href="starter_kit/more.html">More</a></span></dt> +</dl></div> +<p> + Most "quick starts" only get you a few blocks from where you are. + From there, you are on your own. Yet, typically, you'd want to get to the next + city. This starter kit shall be as minimal as possible, yet packed as much + power as possible. + </p> +<p> + So you are busy and always on the go. You do not wish to spend a lot of time + studying the library. You wish to be spared the details for later when you + need it. For now, all you need to do is to get up to speed as quickly as possible + and start using the library. If this is the case, this is the right place to + start. + </p> +<p> + This section is by no means a thorough discourse of the library. For more information + on Phoenix, please take some time to read the rest of the Documentation. Yet, + if you just want to use the library quickly, now, this chapter will probably + suffice. Rather than taking you to the details of the library, we shall try + to provide you with annotated examples instead. Hopefully, this will get you + into high gear quickly. + </p> +<h4> +<a name="phoenix.starter_kit.h0"></a> + <span><a name="phoenix.starter_kit.functors_everywhere"></a></span><a class="link" href="starter_kit.html#phoenix.starter_kit.functors_everywhere">Functors + everywhere</a> + </h4> +<p> + Phoenix is built on function objects (functors). The functor is the main building + block. We compose functors to build more complex functors... to build more + complex functors... and so on. Almost everything is a functor. + </p> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + Functors are so ubiquitous in Phoenix that, in the manual, the words <span class="emphasis"><em>"functor"</em></span> + and <span class="emphasis"><em>"function"</em></span> are used interchangeably. + </p></td></tr> +</table></div> +<p> + We start with some core functions that are called <span class="bold"><strong>primitives</strong></span>. + You can think of primitives (such as values, references and arguments) as atoms. + </p> +<p> + Things start to get interesting when we start <span class="emphasis"><em>composing</em></span> + primitives to form <span class="bold"><strong>expressions</strong></span>. The expressions + can, in turn, be composed to form even more complex expressions. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="introduction.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="starter_kit/values.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/arguments.html b/libs/phoenix/doc/html/phoenix/starter_kit/arguments.html new file mode 100644 index 0000000000..0fb9f66141 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/arguments.html @@ -0,0 +1,75 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Arguments</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="references.html" title="References"> +<link rel="next" href="lazy_operators.html" title="Lazy Operators"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="references.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy_operators.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.arguments"></a><a class="link" href="arguments.html" title="Arguments">Arguments</a> +</h3></div></div></div> +<p> + Arguments are also functions? You bet! + </p> +<p> + Until now, we have been dealing with expressions returning a nullary function. + Arguments, on the other hand, evaluate to an N-ary function. An argument + represents the Nth argument. There are a few predefined arguments arg1, arg2, + arg3, arg4 and so on (and it's <a href="http://www.boost.org/libs/lambda/doc/index.html" target="_top">BLL</a> + counterparts: _1, _2, _3, _4 and so on). Examples: + </p> +<pre class="programlisting"><span class="identifier">arg1</span> <span class="comment">// one-or-more argument function that returns its first argument</span> +<span class="identifier">arg2</span> <span class="comment">// two-or-more argument function that returns its second argument</span> +<span class="identifier">arg3</span> <span class="comment">// three-or-more argument function that returns its third argument</span> +</pre> +<p> + <code class="computeroutput"><span class="identifier">argN</span></code> returns the Nth argument. + Examples: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> +<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"Hello World"</span><span class="special">;</span> +<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints 3</span> +<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">s</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints "Hello World"</span> +</pre> +<p> + (See <a href="../../../../example/arguments.cpp" target="_top">arguments.cpp</a>) + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> Learn more about arguments <a class="link" href="../modules/core/arguments.html" title="Arguments">here.</a> + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="references.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy_operators.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/construct__new__delete__casts.html b/libs/phoenix/doc/html/phoenix/starter_kit/construct__new__delete__casts.html new file mode 100644 index 0000000000..faa9d1478c --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/construct__new__delete__casts.html @@ -0,0 +1,70 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Construct, New, Delete, Casts</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="lazy_statements.html" title="Lazy Statements"> +<link rel="next" href="lazy_functions.html" title="Lazy Functions"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="lazy_statements.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy_functions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.construct__new__delete__casts"></a><a class="link" href="construct__new__delete__casts.html" title="Construct, New, Delete, Casts">Construct, + New, Delete, Casts</a> +</h3></div></div></div> +<p> + You'll probably want to work with objects. There are lazy versions of constructor + calls, <code class="computeroutput"><span class="keyword">new</span></code>, <code class="computeroutput"><span class="keyword">delete</span></code> + and the suite of C++ casts. Examples: + </p> +<pre class="programlisting"><span class="identifier">construct</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="comment">// constructs a std::string from arg1, arg2</span> +<span class="identifier">new_</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">arg2</span><span class="special">)</span> <span class="comment">// makes a new std::string from arg1, arg2</span> +<span class="identifier">delete_</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// deletes arg1 (assumed to be a pointer)</span> +<span class="identifier">static_cast_</span><span class="special"><</span><span class="keyword">int</span><span class="special">*>(</span><span class="identifier">arg1</span><span class="special">)</span> <span class="comment">// static_cast's arg1 to an int*</span> +</pre> +<div class="note"><table border="0" summary="Note"> +<tr> +<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td> +<th align="left">Note</th> +</tr> +<tr><td align="left" valign="top"><p> + Take note that, by convention, names that conflict with C++ reserved words + are appended with a single trailing underscore <code class="computeroutput"><span class="char">'_'</span></code> + </p></td></tr> +</table></div> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> Learn more about this <a class="link" href="../modules/object.html" title="Object">here.</a> + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="lazy_statements.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy_functions.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/lazy_functions.html b/libs/phoenix/doc/html/phoenix/starter_kit/lazy_functions.html new file mode 100644 index 0000000000..6e4717b27f --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/lazy_functions.html @@ -0,0 +1,109 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Lazy Functions</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="construct__new__delete__casts.html" title="Construct, New, Delete, Casts"> +<link rel="next" href="more.html" title="More"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="construct__new__delete__casts.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="more.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.lazy_functions"></a><a class="link" href="lazy_functions.html" title="Lazy Functions">Lazy Functions</a> +</h3></div></div></div> +<p> + As you write more lambda functions, you'll notice certain patterns that you + wish to refactor as reusable functions. When you reach that point, you'll + wish that ordinary functions can co-exist with phoenix functions. Unfortunately, + the <span class="emphasis"><em>immediate</em></span> nature of plain C++ functions make them + incompatible. + </p> +<p> + Lazy functions are your friends. The library provides a facility to make + lazy functions. The code below is a rewrite of the <code class="computeroutput"><span class="identifier">is_odd</span></code> + function using the facility: + </p> +<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">is_odd_impl</span> +<span class="special">{</span> + <span class="keyword">typedef</span> <span class="keyword">bool</span> <span class="identifier">result_type</span><span class="special">;</span> + + <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Arg</span><span class="special">></span> + <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">Arg</span> <span class="identifier">arg1</span><span class="special">)</span> <span class="keyword">const</span> + <span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">;</span> + <span class="special">}</span> +<span class="special">};</span> + +<span class="identifier">function</span><span class="special"><</span><span class="identifier">is_odd_impl</span><span class="special">></span> <span class="identifier">is_odd</span><span class="special">;</span> +</pre> +<h5> +<a name="phoenix.starter_kit.lazy_functions.h0"></a> + <span><a name="phoenix.starter_kit.lazy_functions.things_to_note_"></a></span><a class="link" href="lazy_functions.html#phoenix.starter_kit.lazy_functions.things_to_note_">Things + to note:</a> + </h5> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + Result type deduction is implemented with the help of the result_of protocol. + For more information see <a href="http://www.boost.org/doc/libs/release/libs/utility/utility.htm#result_of" target="_top">Boost.Result + Of</a> + </li> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">is_odd_impl</span></code> implements + the function. + </li> +<li class="listitem"> + <code class="computeroutput"><span class="identifier">is_odd</span></code>, an instance of + <code class="computeroutput"><span class="identifier">function</span><span class="special"><</span><span class="identifier">is_odd_impl</span><span class="special">></span></code>, + is the lazy function. + </li> +</ul></div> +<p> + Now, <code class="computeroutput"><span class="identifier">is_odd</span></code> is a truly lazy + function that we can use in conjunction with the rest of phoenix. Example: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">is_odd</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">));</span> +</pre> +<p> + (See <a href="../../../../example/function.cpp" target="_top">function.cpp</a>) + </p> +<h5> +<a name="phoenix.starter_kit.lazy_functions.h1"></a> + <span><a name="phoenix.starter_kit.lazy_functions.predefined_lazy_functions"></a></span><a class="link" href="lazy_functions.html#phoenix.starter_kit.lazy_functions.predefined_lazy_functions">Predefined + Lazy Functions</a> + </h5> +<p> + The library is chock full of STL savvy, predefined lazy functions covering + the whole of the STL containers, iterators and algorithms. For example, there + are lazy versions of container related operations such as assign, at, back, + begin, pop_back, pop_front, push_back, push_front, etc. (See <a class="link" href="../modules/stl.html" title="STL">STL</a>). + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="construct__new__delete__casts.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="more.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/lazy_operators.html b/libs/phoenix/doc/html/phoenix/starter_kit/lazy_operators.html new file mode 100644 index 0000000000..03005e0d2a --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/lazy_operators.html @@ -0,0 +1,149 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Lazy Operators</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="arguments.html" title="Arguments"> +<link rel="next" href="lazy_statements.html" title="Lazy Statements"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="arguments.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy_statements.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.lazy_operators"></a><a class="link" href="lazy_operators.html" title="Lazy Operators">Lazy Operators</a> +</h3></div></div></div> +<p> + You can use the usual set of operators to form expressions. Examples: + </p> +<pre class="programlisting"><span class="identifier">arg1</span> <span class="special">*</span> <span class="identifier">arg1</span> +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">ref</span><span class="special">(</span><span class="identifier">z</span><span class="special">)</span> +<span class="identifier">arg1</span> <span class="special">=</span> <span class="identifier">arg2</span> <span class="special">+</span> <span class="special">(</span><span class="number">3</span> <span class="special">*</span> <span class="identifier">arg3</span><span class="special">)</span> +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">arg1</span><span class="special">[</span><span class="identifier">arg2</span><span class="special">]</span> <span class="comment">// assuming arg1 is indexable and arg2 is a valid index</span> +</pre> +<p> + Note the expression: <code class="computeroutput"><span class="number">3</span> <span class="special">*</span> + <span class="identifier">arg3</span></code>. This expression is actually + a short-hand equivalent to: <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> + <span class="special">*</span> <span class="identifier">arg3</span></code>. + In most cases, like above, you can get away with it. But in some cases, you + will have to explicitly wrap your values in <code class="computeroutput"><span class="identifier">val</span></code>. + Rules of thumb: + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + In a binary expression (e.g. <code class="computeroutput"><span class="number">3</span> + <span class="special">*</span> <span class="identifier">arg3</span></code>), + at least one of the operands must be a phoenix primitive or expression. + </li> +<li class="listitem"> + In a unary expression (e.g. <code class="computeroutput"><span class="identifier">arg1</span><span class="special">++</span></code>), the single operand must be a phoenix + primitive or expression. + </li> +</ul></div> +<p> + If these basic rules are not followed, the result is either an error, or + is immediately evaluated. Some examples: + </p> +<pre class="programlisting"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">=</span> <span class="number">123</span> <span class="comment">// lazy</span> +<span class="identifier">x</span> <span class="special">=</span> <span class="number">123</span> <span class="comment">// immediate</span> + +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)[</span><span class="number">0</span><span class="special">]</span> <span class="comment">// lazy</span> +<span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="comment">// immediate</span> + +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)]</span> <span class="comment">// lazy</span> +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">)[</span><span class="identifier">i</span><span class="special">]</span> <span class="comment">// lazy (equivalent to ref(x)[val(i)])</span> +<span class="identifier">x</span><span class="special">[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)]</span> <span class="comment">// illegal (x is not a phoenix primitive or expression)</span> +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">x</span><span class="special">[</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)])</span> <span class="comment">// illegal (x is not a phoenix primitive or expression)</span> +</pre> +<p> + Why are the last two expression illegal? Although <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code> looks as much like a binary operator as + <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span></code> + above it; the difference is that the former must be a member (i.e. <code class="computeroutput"><span class="identifier">x</span></code> must have an <code class="computeroutput"><span class="keyword">operator</span><span class="special">[]</span></code> that takes a phoenix primitive or expression + as its argument). This will most likely not be the case. + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> Learn more about operators <a class="link" href="../modules/operator.html" title="Operator">here.</a> + </p> +</div> +<h5> +<a name="phoenix.starter_kit.lazy_operators.h0"></a> + <span><a name="phoenix.starter_kit.lazy_operators.first_practical_example"></a></span><a class="link" href="lazy_operators.html#phoenix.starter_kit.lazy_operators.first_practical_example">First + Practical Example</a> + </h5> +<p> + We've covered enough ground to present a real world example. We want to find + the first odd number in an STL container. Normally we use a functor (function + object) or a function pointer and pass that in to STL's <code class="computeroutput"><span class="identifier">find_if</span></code> + generic function: + </p> +<p> + Write a function: + </p> +<pre class="programlisting"><span class="keyword">bool</span> +<span class="identifier">is_odd</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">arg1</span><span class="special">)</span> +<span class="special">{</span> + <span class="keyword">return</span> <span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">;</span> +<span class="special">}</span> +</pre> +<p> + Pass a pointer to the function to STL's <code class="computeroutput"><span class="identifier">find_if</span></code> + algorithm: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="special">&</span><span class="identifier">is_odd</span><span class="special">)</span> +</pre> +<p> + Using Phoenix, the same can be achieved directly with a one-liner: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">find_if</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">arg1</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> +</pre> +<p> + The expression <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">%</span> + <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> automagically creates a functor with the + expected behavior. In FP, this unnamed function is called a lambda function. + Unlike the function pointer version, which is monomorphic (expects and works + only with a fixed type int argument), the Phoenix version is fully polymorphic + and works with any container (of ints, of longs, of bignum, etc.) as long + as its elements can handle the <code class="computeroutput"><span class="identifier">arg1</span> + <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> expression. + </p> +<p> + (See <a href="../../../../example/find_if.cpp" target="_top">find_if.cpp</a>) + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> ...<span class="bold"><strong>That's it, we're done</strong></span>. + Well if you wish to know a little bit more, read on... + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="arguments.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy_statements.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/lazy_statements.html b/libs/phoenix/doc/html/phoenix/starter_kit/lazy_statements.html new file mode 100644 index 0000000000..c267eef7b3 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/lazy_statements.html @@ -0,0 +1,72 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Lazy Statements</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="lazy_operators.html" title="Lazy Operators"> +<link rel="next" href="construct__new__delete__casts.html" title="Construct, New, Delete, Casts"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="lazy_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="construct__new__delete__casts.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.lazy_statements"></a><a class="link" href="lazy_statements.html" title="Lazy Statements">Lazy Statements</a> +</h3></div></div></div> +<p> + Lazy statements? Sure. There are lazy versions of the C++ statements we all + know and love. For example: + </p> +<pre class="programlisting"><span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">></span> <span class="number">5</span><span class="special">)</span> +<span class="special">[</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> +<span class="special">]</span> +</pre> +<p> + Say, for example, we wish to print all the elements that are greater than + 5 (separated by a comma) in a vector. Here's how we write it: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> + <span class="identifier">if_</span><span class="special">(</span><span class="identifier">arg1</span> <span class="special">></span> <span class="number">5</span><span class="special">)</span> + <span class="special">[</span> + <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">arg1</span> <span class="special"><<</span> <span class="string">", "</span> + <span class="special">]</span> +<span class="special">);</span> +</pre> +<p> + (See <a href="../../../../example/if.cpp" target="_top">if.cpp</a>) + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> Learn more about statements <a class="link" href="../modules/statement.html" title="Statement">here.</a> + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="lazy_operators.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="construct__new__delete__casts.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/more.html b/libs/phoenix/doc/html/phoenix/starter_kit/more.html new file mode 100644 index 0000000000..317ff0e118 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/more.html @@ -0,0 +1,58 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>More</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="lazy_functions.html" title="Lazy Functions"> +<link rel="next" href="../basics.html" title="Basics"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="lazy_functions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../basics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.more"></a><a class="link" href="more.html" title="More">More</a> +</h3></div></div></div> +<p> + As mentioned earlier, this chapter is not a thorough discourse of the library. + It is meant only to cover enough ground to get you into high gear as quickly + as possible. Some advanced stuff is not discussed here (e.g. <a class="link" href="../modules/scope.html" title="Scope">Scopes</a>); + nor are features that provide alternative (short-hand) ways to do the same + things (e.g. <a class="link" href="../modules/bind.html" title="Bind">Bind</a> vs. <a class="link" href="../modules/function.html" title="Function">Lazy + Functions</a>). + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> ...<span class="bold"><strong>If you still wish to learn + more, the read on...</strong></span> + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="lazy_functions.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../basics.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/references.html b/libs/phoenix/doc/html/phoenix/starter_kit/references.html new file mode 100644 index 0000000000..9a9c3026cc --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/references.html @@ -0,0 +1,73 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>References</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="values.html" title="Values"> +<link rel="next" href="arguments.html" title="Arguments"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="values.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="arguments.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.references"></a><a class="link" href="references.html" title="References">References</a> +</h3></div></div></div> +<p> + References are functions. They hold a reference to a value stored somewhere. + For example, given: + </p> +<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> +<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">s</span> <span class="special">=</span> <span class="string">"Hello World"</span><span class="special">;</span> +</pre> +<p> + we create <code class="computeroutput"><span class="identifier">references</span></code> to + <code class="computeroutput"><span class="identifier">i</span></code> and <code class="computeroutput"><span class="identifier">s</span></code> + this way: + </p> +<pre class="programlisting"><span class="identifier">ref</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> +<span class="identifier">ref</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> +</pre> +<p> + Like <code class="computeroutput"><span class="identifier">val</span></code>, the expressions + above evaluates to a nullary function; the first one returning an <code class="computeroutput"><span class="keyword">int</span><span class="special">&</span></code>, + and the second one returning a <code class="computeroutput"><span class="keyword">char</span> + <span class="keyword">const</span><span class="special">*&</span></code>. + </p> +<p> + (See <a href="../../../../example/references.cpp" target="_top">references.cpp</a>) + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> Learn more about references <a class="link" href="../modules/core/references.html" title="References">here.</a> + </p> +</div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="values.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="arguments.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/starter_kit/values.html b/libs/phoenix/doc/html/phoenix/starter_kit/values.html new file mode 100644 index 0000000000..49a66603e4 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/starter_kit/values.html @@ -0,0 +1,116 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Values</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../starter_kit.html" title="Starter Kit"> +<link rel="prev" href="../starter_kit.html" title="Starter Kit"> +<link rel="next" href="references.html" title="References"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../starter_kit.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.starter_kit.values"></a><a class="link" href="values.html" title="Values">Values</a> +</h3></div></div></div> +<p> + Values are functions! Examples: + </p> +<pre class="programlisting"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> +<span class="identifier">val</span><span class="special">(</span><span class="string">"Hello, World"</span><span class="special">)</span> +</pre> +<p> + The first evaluates to a nullary function (a function taking no arguments) + that returns an <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="number">3</span></code>. The second evaluates to a nullary function + that returns a <code class="computeroutput"><span class="keyword">char</span> <span class="keyword">const</span><span class="special">(&)[</span><span class="number">13</span><span class="special">]</span></code>, <code class="computeroutput"><span class="string">"Hello, + World"</span></code>. + </p> +<h5> +<a name="phoenix.starter_kit.values.h0"></a> + <span><a name="phoenix.starter_kit.values.lazy_evaluation"></a></span><a class="link" href="values.html#phoenix.starter_kit.values.lazy_evaluation">Lazy + Evaluation</a> + </h5> +<p> + Confused? <code class="computeroutput"><span class="identifier">val</span></code> is a unary + function and <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> invokes + it, you say? Yes. However, read carefully: <span class="emphasis"><em>"evaluates to a + nullary function"</em></span>. <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> + evaluates to (returns) a nullary function. Aha! <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> + returns a function! So, since <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> + returns a function, you can invoke it. Example: + </p> +<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> +</pre> +<p> + (See <a href="../../../../example/values.cpp" target="_top">values.cpp</a>) + </p> +<div class="sidebar"> +<div class="titlepage"></div> +<p> + <span class="inlinemediaobject"><img src="../../images/tip.png" alt="tip"></span> Learn more about values <a class="link" href="../modules/core/values.html" title="Values">here.</a> + </p> +</div> +<p> + The second function call (the one with no arguments) calls the nullary function + which then returns <code class="computeroutput"><span class="number">3</span></code>. The need + for a second function call is the reason why the function is said to be + <span class="bold"><strong><span class="emphasis"><em>Lazily Evaluated</em></span></strong></span>. The + first call doesn't do anything. You need a second call to finally evaluate + the thing. The first call lazily evaluates the function; i.e. doesn't do + anything and defers the evaluation for later. + </p> +<h5> +<a name="phoenix.starter_kit.values.h1"></a> + <span><a name="phoenix.starter_kit.values.callbacks"></a></span><a class="link" href="values.html#phoenix.starter_kit.values.callbacks">Callbacks</a> + </h5> +<p> + It may not be immediately apparent how lazy evaluation can be useful by just + looking at the example above. Putting the first and second function call + in a single line is really not very useful. However, thinking of <code class="computeroutput"><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">)</span></code> as a callback function (and in most cases + they are actually used that way), will make it clear. Example: + </p> +<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span> +<span class="keyword">void</span> <span class="identifier">print</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span> +<span class="special">{</span> + <span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">f</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> +<span class="special">}</span> + +<span class="keyword">int</span> +<span class="identifier">main</span><span class="special">()</span> +<span class="special">{</span> + <span class="identifier">print</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="number">3</span><span class="special">));</span> + <span class="identifier">print</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="string">"Hello World"</span><span class="special">));</span> + <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> +<span class="special">}</span> +</pre> +<p> + (See <a href="../../../../example/callback.cpp" target="_top">callback.cpp</a>) + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../starter_kit.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../starter_kit.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="references.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/what_s_new.html b/libs/phoenix/doc/html/phoenix/what_s_new.html new file mode 100644 index 0000000000..f632c90a28 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/what_s_new.html @@ -0,0 +1,44 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>What's New</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="next" href="what_s_new/phoenix_3_0.html" title="Phoenix 3.0"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="what_s_new/phoenix_3_0.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.what_s_new"></a><a class="link" href="what_s_new.html" title="What's New">What's New</a> +</h2></div></div></div> +<div class="toc"><dl><dt><span class="section"><a href="what_s_new/phoenix_3_0.html">Phoenix 3.0</a></span></dt></dl></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="what_s_new/phoenix_3_0.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/what_s_new/phoenix_3_0.html b/libs/phoenix/doc/html/phoenix/what_s_new/phoenix_3_0.html new file mode 100644 index 0000000000..4241de3979 --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/what_s_new/phoenix_3_0.html @@ -0,0 +1,67 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Phoenix 3.0</title> +<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../what_s_new.html" title="What's New"> +<link rel="prev" href="../what_s_new.html" title="What's New"> +<link rel="next" href="../introduction.html" title="Introduction"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> +<td align="center"><a href="../../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../what_s_new.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../what_s_new.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../introduction.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h3 class="title"> +<a name="phoenix.what_s_new.phoenix_3_0"></a><a class="link" href="phoenix_3_0.html" title="Phoenix 3.0">Phoenix 3.0</a> +</h3></div></div></div> +<p> + This is the first official release of Phoenix as first class Boost citizen. + As a consequence of the review of Phoenix V2 the internals got completely + rewritten. Therefore the internal extension mechanism is different. + </p> +<div class="itemizedlist"><ul class="itemizedlist" type="disc"> +<li class="listitem"> + composite<...>, as_composite<...> and compose are gone and + have been replaced. For an in depth discussion see the section <a class="link" href="../inside.html" title="Inside Phoenix">Inside Phoenix</a> + </li> +<li class="listitem"> + <a class="link" href="../modules/function.html" title="Function">phoenix.modules.function</a> + phoenix::function now supports function objects that implement the <a href="http://www.boost.org/doc/libs/release/libs/utility/utility.htm#result_of" target="_top">Boost.Result + Of</a> protocol. <span class="bold"><strong>This is a breaking change</strong></span> + </li> +<li class="listitem"> + Boilerplate macros to easily adapt already existing functions and function + objects + </li> +<li class="listitem"> + <a class="link" href="../modules/bind.html" title="Bind">Bind</a> is no completely compatible + with Boost.Bind + </li> +</ul></div> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="../what_s_new.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../what_s_new.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../introduction.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> diff --git a/libs/phoenix/doc/html/phoenix/wrap_up.html b/libs/phoenix/doc/html/phoenix/wrap_up.html new file mode 100644 index 0000000000..878da378fa --- /dev/null +++ b/libs/phoenix/doc/html/phoenix/wrap_up.html @@ -0,0 +1,76 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> +<title>Wrap Up</title> +<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> +<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> +<link rel="home" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="up" href="../index.html" title="Chapter 1. Phoenix 3.0"> +<link rel="prev" href="examples/transforming_the_expression_tree.html" title="Transforming the Expression Tree"> +<link rel="next" href="acknowledgments.html" title="Acknowledgments"> +</head> +<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> +<table cellpadding="2" width="100%"><tr> +<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> +<td align="center"><a href="../../../../../index.html">Home</a></td> +<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> +<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> +<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> +<td align="center"><a href="../../../../../more/index.htm">More</a></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="examples/transforming_the_expression_tree.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgments.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +<div class="section"> +<div class="titlepage"><div><div><h2 class="title" style="clear: both"> +<a name="phoenix.wrap_up"></a><a class="link" href="wrap_up.html" title="Wrap Up">Wrap Up</a> +</h2></div></div></div> +<p> + Sooner or later more FP techniques become standard practice as people find + the true value of this programming discipline outside the academe and into + the mainstream. In as much as structured programming of the 70s and object + oriented programming in the 80s and generic programming in the 90s shaped our + thoughts towards a more robust sense of software engineering, FP will certainly + be a paradigm that will catapult us towards more powerful software design and + engineering onward into the new millennium. + </p> +<p> + Let me quote Doug Gregor of Boost.org. About functional style programming libraries: + </p> +<div class="blockquote"><blockquote class="blockquote"><p> + <span class="emphasis"><em>They're gaining acceptance, but are somewhat stunted by the ubiquitousness + of broken compilers. The C++ community is moving deeper into the so-called + "STL- style" programming paradigm, which brings many aspects of + functional programming into the fold. Look at, for instance, the Spirit parser + to see how such function objects can be used to build Yacc-like grammars + with semantic actions that can build abstract syntax trees on the fly. This + type of functional composition is gaining momentum.</em></span> + </p></blockquote></div> +<p> + Indeed. Phoenix is another attempt to introduce more FP techniques into the + mainstream. Not only is it a tool that will make life easier for the programmer. + In its own right, the actual design of the library itself is a model of true + C++ FP in action. The library is designed and structured in a strict but clear + and well mannered FP sense. By all means, use the library as a tool. But for + those who want to learn more about FP in C++, don't stop there, I invite you + to take a closer look at the design of the library itself. + </p> +<p> + So there you have it. Have fun! See you in the FP world. + </p> +</div> +<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> +<td align="left"></td> +<td align="right"><div class="copyright-footer">Copyright © 2002-2005, 2010 Joel de Guzman, Dan Marsden, Thomas Heller<p> + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) + </p> +</div></td> +</tr></table> +<hr> +<div class="spirit-nav"> +<a accesskey="p" href="examples/transforming_the_expression_tree.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgments.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> +</div> +</body> +</html> |