]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/phoenix/doc/html/phoenix/starter_kit/lazy_operators.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / phoenix / doc / html / phoenix / starter_kit / lazy_operators.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Lazy Operators</title>
5 <link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
7 <link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Phoenix 3.2.0">
8 <link rel="up" href="../starter_kit.html" title="Starter Kit">
9 <link rel="prev" href="arguments.html" title="Arguments">
10 <link rel="next" href="lazy_statements.html" title="Lazy Statements">
11 </head>
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
20 </tr></table>
21 <hr>
22 <div class="spirit-nav">
23 <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>
24 </div>
25 <div class="section">
26 <div class="titlepage"><div><div><h3 class="title">
27 <a name="phoenix.starter_kit.lazy_operators"></a><a class="link" href="lazy_operators.html" title="Lazy Operators">Lazy Operators</a>
28 </h3></div></div></div>
29 <p>
30 You can use the usual set of operators to form expressions. Examples:
31 </p>
32 <pre class="programlisting"><span class="identifier">arg1</span> <span class="special">*</span> <span class="identifier">arg1</span>
33 <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>
34 <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>
35 <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>
36 </pre>
37 <p>
38 Note the expression: <code class="computeroutput"><span class="number">3</span> <span class="special">*</span>
39 <span class="identifier">arg3</span></code>. This expression is actually
40 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>
41 <span class="special">*</span> <span class="identifier">arg3</span></code>.
42 In most cases, like above, you can get away with it. But in some cases, you
43 will have to explicitly wrap your values in <code class="computeroutput"><span class="identifier">val</span></code>.
44 Rules of thumb:
45 </p>
46 <div class="itemizedlist"><ul class="itemizedlist" type="disc">
47 <li class="listitem">
48 In a binary expression (e.g. <code class="computeroutput"><span class="number">3</span>
49 <span class="special">*</span> <span class="identifier">arg3</span></code>),
50 at least one of the operands must be a phoenix primitive or expression.
51 </li>
52 <li class="listitem">
53 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
54 primitive or expression.
55 </li>
56 </ul></div>
57 <p>
58 If these basic rules are not followed, the result is either an error, or
59 is immediately evaluated. Some examples:
60 </p>
61 <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>
62 <span class="identifier">x</span> <span class="special">=</span> <span class="number">123</span> <span class="comment">// immediate</span>
63
64 <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>
65 <span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="comment">// immediate</span>
66
67 <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>
68 <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>
69 <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>
70 <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>
71 </pre>
72 <p>
73 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
74 <code class="computeroutput"><span class="keyword">operator</span><span class="special">=</span></code>
75 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
76 as its argument). This will most likely not be the case.
77 </p>
78 <div class="sidebar">
79 <p class="title"><b></b></p>
80 <p>
81 <span class="inlinemediaobject"><img src="../../images/tip.png"></span>
82 Learn more about operators <a class="link" href="../modules/operator.html" title="Operator">here.</a>
83 </p>
84 </div>
85 <h5>
86 <a name="phoenix.starter_kit.lazy_operators.h0"></a>
87 <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
88 Practical Example</a>
89 </h5>
90 <p>
91 We've covered enough ground to present a real world example. We want to find
92 the first odd number in an STL container. Normally we use a functor (function
93 object) or a function pointer and pass that in to STL's <code class="computeroutput"><span class="identifier">find_if</span></code>
94 generic function:
95 </p>
96 <p>
97 Write a function:
98 </p>
99 <pre class="programlisting"><span class="keyword">bool</span>
100 <span class="identifier">is_odd</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">arg1</span><span class="special">)</span>
101 <span class="special">{</span>
102 <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>
103 <span class="special">}</span>
104 </pre>
105 <p>
106 Pass a pointer to the function to STL's <code class="computeroutput"><span class="identifier">find_if</span></code>
107 algorithm:
108 </p>
109 <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">&amp;</span><span class="identifier">is_odd</span><span class="special">)</span>
110 </pre>
111 <p>
112 Using Phoenix, the same can be achieved directly with a one-liner:
113 </p>
114 <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>
115 </pre>
116 <p>
117 The expression <code class="computeroutput"><span class="identifier">arg1</span> <span class="special">%</span>
118 <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> automagically creates a functor with the
119 expected behavior. In FP, this unnamed function is called a lambda function.
120 Unlike the function pointer version, which is monomorphic (expects and works
121 only with a fixed type int argument), the Phoenix version is fully polymorphic
122 and works with any container (of ints, of longs, of bignum, etc.) as long
123 as its elements can handle the <code class="computeroutput"><span class="identifier">arg1</span>
124 <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">1</span></code> expression.
125 </p>
126 <p>
127 (See <a href="../../../../example/find_if.cpp" target="_top">find_if.cpp</a>)
128 </p>
129 <div class="sidebar">
130 <p class="title"><b></b></p>
131 <p>
132 <span class="inlinemediaobject"><img src="../../images/tip.png"></span>
133 ...<span class="bold"><strong>That's it, we're done</strong></span>. Well if you wish
134 to know a little bit more, read on...
135 </p>
136 </div>
137 </div>
138 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
139 <td align="left"></td>
140 <td align="right"><div class="copyright-footer">Copyright &#169; 2002-2005, 2010, 2014, 2015 Joel de Guzman, Dan Marsden, Thomas
141 Heller, John Fletcher<p>
142 Distributed under the Boost Software License, Version 1.0. (See accompanying
143 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>)
144 </p>
145 </div></td>
146 </tr></table>
147 <hr>
148 <div class="spirit-nav">
149 <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>
150 </div>
151 </body>
152 </html>