• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Optional Generator (-a)</title>
5<link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../../../../index.html" title="Spirit 2.5.8">
8<link rel="up" href="../operator.html" title="Generator Operators">
9<link rel="prev" href="list.html" title="List Generator (a % b)">
10<link rel="next" href="and_predicate.html" title="And-Predicate Generator (&amp;a)">
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="list.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../operator.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="and_predicate.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h5 class="title">
27<a name="spirit.karma.reference.operator.optional"></a><a class="link" href="optional.html" title="Optional Generator (-a)">Optional
28          Generator (<code class="computeroutput"><span class="special">-</span><span class="identifier">a</span></code>)</a>
29</h5></div></div></div>
30<h6>
31<a name="spirit.karma.reference.operator.optional.h0"></a>
32            <span class="phrase"><a name="spirit.karma.reference.operator.optional.description"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.description">Description</a>
33          </h6>
34<p>
35            The optional generator is used to conditionally execute an embedded generator.
36            It succeeds always.
37          </p>
38<h6>
39<a name="spirit.karma.reference.operator.optional.h1"></a>
40            <span class="phrase"><a name="spirit.karma.reference.operator.optional.header"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.header">Header</a>
41          </h6>
42<pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/home/karma/operator/optional.hpp&gt;</span>
43<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">karma_optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
44</pre>
45<p>
46            Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>.
47          </p>
48<h6>
49<a name="spirit.karma.reference.operator.optional.h2"></a>
50            <span class="phrase"><a name="spirit.karma.reference.operator.optional.model_of"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.model_of">Model of</a>
51          </h6>
52<div class="blockquote"><blockquote class="blockquote"><p>
53              <a class="link" href="../generator_concepts/unarygenerator.html" title="UnaryGenerator"><code class="computeroutput"><span class="identifier">UnaryGenerator</span></code></a>
54            </p></blockquote></div>
55<h6>
56<a name="spirit.karma.reference.operator.optional.h3"></a>
57            <span class="phrase"><a name="spirit.karma.reference.operator.optional.expression_semantics"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.expression_semantics">Expression
58            Semantics</a>
59          </h6>
60<p>
61            Semantics of an expression is defined only where it differs from, or
62            is not defined in <a class="link" href="../generator_concepts/unarygenerator.html" title="UnaryGenerator"><code class="computeroutput"><span class="identifier">UnaryGenerator</span></code></a>.
63          </p>
64<div class="informaltable"><table class="table">
65<colgroup>
66<col>
67<col>
68</colgroup>
69<thead><tr>
70<th>
71                    <p>
72                      Expression
73                    </p>
74                  </th>
75<th>
76                    <p>
77                      Semantics
78                    </p>
79                  </th>
80</tr></thead>
81<tbody><tr>
82<td>
83                    <p>
84                      <code class="computeroutput"><span class="special">-</span><span class="identifier">a</span></code>
85                    </p>
86                  </td>
87<td>
88                    <p>
89                      The generator <code class="computeroutput"><span class="identifier">a</span></code>
90                      is executed depending on the availability of an attribute.
91                      The optional generator succeeds if its embedded generator succeeds
92                      (unless the underlying output stream reports an error).
93                    </p>
94                  </td>
95</tr></tbody>
96</table></div>
97<h6>
98<a name="spirit.karma.reference.operator.optional.h4"></a>
99            <span class="phrase"><a name="spirit.karma.reference.operator.optional.attributes"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.attributes">Attributes</a>
100          </h6>
101<p>
102            See <a class="link" href="../../quick_reference/compound_attribute_rules.html#spirit.karma.quick_reference.compound_attribute_rules.notation">Compound
103            Attribute Notation</a>.
104          </p>
105<div class="informaltable"><table class="table">
106<colgroup>
107<col>
108<col>
109</colgroup>
110<thead><tr>
111<th>
112                    <p>
113                      Expression
114                    </p>
115                  </th>
116<th>
117                    <p>
118                      Attribute
119                    </p>
120                  </th>
121</tr></thead>
122<tbody><tr>
123<td>
124                    <p>
125                      <code class="computeroutput"><span class="special">-</span><span class="identifier">a</span></code>
126                      (optional, unary <code class="computeroutput"><span class="special">-</span></code>)
127                    </p>
128                  </td>
129<td>
130                    <p>
131</p>
132<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">a</span><span class="special">:</span> <span class="identifier">A</span> <span class="special">--&gt;</span> <span class="special">-</span><span class="identifier">a</span><span class="special">:</span> <span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span>
133<span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span> <span class="special">--&gt;</span> <span class="special">-</span><span class="identifier">a</span><span class="special">:</span> <span class="identifier">Unused</span></pre>
134<p>
135                    </p>
136                  </td>
137</tr></tbody>
138</table></div>
139<div class="important"><table border="0" summary="Important">
140<tr>
141<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../images/important.png"></td>
142<th align="left">Important</th>
143</tr>
144<tr><td align="left" valign="top"><p>
145              The table above uses <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span></code> as a placeholder only. The notation
146              of <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span></code>
147              stands for the data type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">A</span><span class="special">&gt;</span></code>.
148            </p></td></tr>
149</table></div>
150<p>
151            The optional generator will execute its embedded generator once if the
152            provided attribute holds a valid value. It forwards the value held in
153            its attribute to the embedded generator.
154          </p>
155<p>
156            It is important to note, that the optional generator does not perform
157            any buffering of the output generated by its embedded elements. That
158            means that any failing element might have already generated some output,
159            which is <span class="emphasis"><em>not</em></span> rolled back.
160          </p>
161<div class="tip"><table border="0" summary="Tip">
162<tr>
163<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../images/tip.png"></td>
164<th align="left">Tip</th>
165</tr>
166<tr><td align="left" valign="top">
167<p>
168              The simplest way to force a optional generator to behave as if it did
169              buffering is to wrap it into a buffering directive (see <a class="link" href="../directive/buffer.html" title="Generator Directive for Temporary Output Buffering (buffer[])"><code class="computeroutput"><span class="identifier">buffer</span></code></a>):
170            </p>
171<p>
172</p>
173<pre class="programlisting"><span class="identifier">buffer</span><span class="special">[-</span><span class="identifier">a</span><span class="special">]</span></pre>
174<p>
175            </p>
176<p>
177              which will <span class="emphasis"><em>not</em></span> generate any output in case of
178              a failing generator <code class="computeroutput"><span class="special">-</span><span class="identifier">a</span></code>.
179            </p>
180</td></tr>
181</table></div>
182<h6>
183<a name="spirit.karma.reference.operator.optional.h5"></a>
184            <span class="phrase"><a name="spirit.karma.reference.operator.optional.complexity"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.complexity">Complexity</a>
185          </h6>
186<div class="blockquote"><blockquote class="blockquote"><p>
187              The overall complexity of the optional generator is defined by the
188              complexity of its embedded generator. The complexity of the optional
189              generator itself is O(1).
190            </p></blockquote></div>
191<h6>
192<a name="spirit.karma.reference.operator.optional.h6"></a>
193            <span class="phrase"><a name="spirit.karma.reference.operator.optional.example"></a></span><a class="link" href="optional.html#spirit.karma.reference.operator.optional.example">Example</a>
194          </h6>
195<div class="note"><table border="0" summary="Note">
196<tr>
197<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
198<th align="left">Note</th>
199</tr>
200<tr><td align="left" valign="top"><p>
201              The test harness for the example(s) below is presented in the <a class="link" href="../basics.html#spirit.karma.reference.basics.examples">Basics Examples</a>
202              section.
203            </p></td></tr>
204</table></div>
205<p>
206            Some includes:
207          </p>
208<p>
209</p>
210<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">karma</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
211<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">support_utree</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
212<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">phoenix_core</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
213<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">phoenix_operator</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
214<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fusion</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">std_pair</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
215<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
216<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
217</pre>
218<p>
219          </p>
220<p>
221            Some using declarations:
222          </p>
223<p>
224</p>
225<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span><span class="special">;</span>
226</pre>
227<p>
228          </p>
229<p>
230            Basic usage of an optional generator:
231          </p>
232<p>
233</p>
234<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">val</span><span class="special">(</span><span class="number">1.0</span><span class="special">);</span>
235<span class="identifier">test_generator_attr</span><span class="special">(</span><span class="string">"1.0"</span><span class="special">,</span> <span class="special">-</span><span class="identifier">double_</span><span class="special">,</span> <span class="identifier">val</span><span class="special">);</span>
236<span class="identifier">test_generator_attr</span><span class="special">(</span><span class="string">"2.0"</span><span class="special">,</span> <span class="special">-</span><span class="identifier">double_</span><span class="special">,</span> <span class="number">2.0</span><span class="special">);</span>
237</pre>
238<p>
239          </p>
240<p>
241            Usage and result of an empty optional generator:
242          </p>
243<p>
244</p>
245<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;</span> <span class="identifier">val</span><span class="special">;</span>          <span class="comment">// empty optional</span>
246<span class="identifier">test_generator_attr</span><span class="special">(</span><span class="string">""</span><span class="special">,</span> <span class="special">-</span><span class="identifier">double_</span><span class="special">,</span> <span class="identifier">val</span><span class="special">);</span>
247</pre>
248<p>
249          </p>
250</div>
251<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
252<td align="left"></td>
253<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
254        Distributed under the Boost Software License, Version 1.0. (See accompanying
255        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>)
256      </p>
257</div></td>
258</tr></table>
259<hr>
260<div class="spirit-nav">
261<a accesskey="p" href="list.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../operator.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="and_predicate.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
262</div>
263</body>
264</html>
265