• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Iterator Based Generator API</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="../generate_api.html" title="Generator API">
9<link rel="prev" href="../generate_api.html" title="Generator API">
10<link rel="next" href="stream_api.html" title="Stream Based Generator API">
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="../generate_api.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../generate_api.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="stream_api.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.generate_api.iterator_api"></a><a class="link" href="iterator_api.html" title="Iterator Based Generator API">Iterator
28          Based Generator API</a>
29</h5></div></div></div>
30<h6>
31<a name="spirit.karma.reference.generate_api.iterator_api.h0"></a>
32            <span class="phrase"><a name="spirit.karma.reference.generate_api.iterator_api.description"></a></span><a class="link" href="iterator_api.html#spirit.karma.reference.generate_api.iterator_api.description">Description</a>
33          </h6>
34<p>
35            The library provides a couple of free functions to make generating a
36            snap. These generator functions have two forms. The first form, <code class="computeroutput"><span class="identifier">generate</span></code>, concatenates the output generated
37            by the involved components without inserting any output in between. The
38            second <code class="computeroutput"><span class="identifier">generate_delimited</span></code>
39            intersperses the output generated by the involved components using the
40            given delimiter generator. Both versions can take in attributes by (constant)
41            reference that hold the attribute values to output.
42          </p>
43<h6>
44<a name="spirit.karma.reference.generate_api.iterator_api.h1"></a>
45            <span class="phrase"><a name="spirit.karma.reference.generate_api.iterator_api.header"></a></span><a class="link" href="iterator_api.html#spirit.karma.reference.generate_api.iterator_api.header">Header</a>
46          </h6>
47<pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/home/karma/generate.hpp&gt;</span>
48<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_generate</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
49</pre>
50<p>
51            For variadic attributes:
52          </p>
53<pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/home/karma/generate_attr.hpp&gt;</span>
54<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_generate_attr</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
55</pre>
56<p>
57            The variadic attributes version of the API allows one or more attributes
58            to be passed into the <code class="computeroutput"><span class="identifier">generate</span></code>
59            functions. The functions taking two or more attributes are usable when
60            the generator expression is a <a class="link" href="../operator/sequence.html" title="Sequence Generator (a &lt;&lt; b)">Sequence
61            (<code class="computeroutput"><span class="special">&lt;&lt;</span></code>)</a> only.
62            In this case each of the attributes passed have to match the corresponding
63            part of the sequence.
64          </p>
65<p>
66            For the API functions deducing the correct (matching) generator type
67            from the supplied attribute type:
68          </p>
69<pre class="programlisting"><span class="comment">// forwards to &lt;boost/spirit/home/karma/detail/generate_auto.hpp&gt;</span>
70<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_generate_auto</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
71</pre>
72<p>
73            Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>.
74          </p>
75<h6>
76<a name="spirit.karma.reference.generate_api.iterator_api.h2"></a>
77            <span class="phrase"><a name="spirit.karma.reference.generate_api.iterator_api.namespace"></a></span><a class="link" href="iterator_api.html#spirit.karma.reference.generate_api.iterator_api.namespace">Namespace</a>
78          </h6>
79<div class="informaltable"><table class="table">
80<colgroup><col></colgroup>
81<thead><tr><th>
82                    <p>
83                      Name
84                    </p>
85                  </th></tr></thead>
86<tbody>
87<tr><td>
88                    <p>
89                      <code class="computeroutput"><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">generate</span></code>
90                    </p>
91                  </td></tr>
92<tr><td>
93                    <p>
94                      <code class="computeroutput"><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">generate_delimited</span></code>
95                    </p>
96                  </td></tr>
97<tr><td>
98                    <p>
99                      <code class="computeroutput"><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">delimit_flag</span><span class="special">::</span><span class="identifier">predelimit</span></code>
100                    </p>
101                  </td></tr>
102<tr><td>
103                    <p>
104                      <code class="computeroutput"><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">delimit_flag</span><span class="special">::</span><span class="identifier">dont_predelimit</span></code>
105                    </p>
106                  </td></tr>
107</tbody>
108</table></div>
109<h6>
110<a name="spirit.karma.reference.generate_api.iterator_api.h3"></a>
111            <span class="phrase"><a name="spirit.karma.reference.generate_api.iterator_api.synopsis"></a></span><a class="link" href="iterator_api.html#spirit.karma.reference.generate_api.iterator_api.synopsis">Synopsis</a>
112          </h6>
113<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">spirit</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">karma</span>
114<span class="special">{</span>
115    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Expr</span><span class="special">&gt;</span>
116    <span class="keyword">inline</span> <span class="keyword">bool</span>
117    <span class="identifier">generate</span><span class="special">(</span>
118        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
119      <span class="special">,</span> <span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">expr</span><span class="special">);</span>
120
121    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Expr</span>
122      <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr2</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">AttrN</span><span class="special">&gt;</span>
123    <span class="keyword">inline</span> <span class="keyword">bool</span>
124    <span class="identifier">generate</span><span class="special">(</span>
125        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
126      <span class="special">,</span> <span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">expr</span>
127      <span class="special">,</span> <span class="identifier">Attr1</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr1</span><span class="special">,</span> <span class="identifier">Attr2</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">AttrN</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attrN</span><span class="special">);</span>
128
129    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</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">Delimiter</span><span class="special">&gt;</span>
130    <span class="keyword">inline</span> <span class="keyword">bool</span>
131    <span class="identifier">generate_delimited</span><span class="special">(</span>
132        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
133      <span class="special">,</span> <span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">expr</span>
134      <span class="special">,</span> <span class="identifier">Delimiter</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">delimiter</span>
135      <span class="special">,</span> <span class="identifier">BOOST_SCOPED_ENUM</span><span class="special">(</span><span class="identifier">delimit_flag</span><span class="special">)</span> <span class="identifier">pre_delimit</span> <span class="special">=</span> <span class="identifier">delimit_flag</span><span class="special">::</span><span class="identifier">dont_predelimit</span><span class="special">);</span>
136
137    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</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">Delimiter</span>
138      <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr2</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">AttrN</span><span class="special">&gt;</span>
139    <span class="keyword">inline</span> <span class="keyword">bool</span>
140    <span class="identifier">generate_delimited</span><span class="special">(</span>
141        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
142      <span class="special">,</span> <span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">expr</span>
143      <span class="special">,</span> <span class="identifier">Delimiter</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">delimiter</span>
144      <span class="special">,</span> <span class="identifier">Attr1</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr1</span><span class="special">,</span> <span class="identifier">Attr2</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">AttrN</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attrN</span><span class="special">);</span>
145
146    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</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">Delimiter</span>
147      <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr2</span><span class="special">,</span> <span class="special">...,</span> <span class="keyword">typename</span> <span class="identifier">AttrN</span><span class="special">&gt;</span>
148    <span class="keyword">inline</span> <span class="keyword">bool</span>
149    <span class="identifier">generate_delimited</span><span class="special">(</span>
150        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
151      <span class="special">,</span> <span class="identifier">Expr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">expr</span>
152      <span class="special">,</span> <span class="identifier">Delimiter</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">delimiter</span>
153      <span class="special">,</span> <span class="identifier">BOOST_SCOPED_ENUM</span><span class="special">(</span><span class="identifier">delimit_flag</span><span class="special">)</span> <span class="identifier">pre_delimit</span>
154      <span class="special">,</span> <span class="identifier">Attr1</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr1</span><span class="special">,</span> <span class="identifier">Attr2</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr2</span><span class="special">,</span> <span class="special">...,</span> <span class="identifier">AttrN</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attrN</span><span class="special">);</span>
155<span class="special">}}}</span>
156</pre>
157<div class="note"><table border="0" summary="Note">
158<tr>
159<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
160<th align="left">Note</th>
161</tr>
162<tr><td align="left" valign="top"><p>
163              Starting with <a href="http://boost-spirit.com" target="_top">Spirit</a> V2.5
164              (distributed with Boost V1.47) the placeholder <code class="computeroutput"><span class="identifier">_val</span></code>
165              can be used in semantic actions attached to top level generator components.
166              In this case <code class="computeroutput"><span class="identifier">_val</span></code> refers
167              to the supplied attribute as a whole. For API functions taking more
168              than one attribute argument <code class="computeroutput"><span class="identifier">_val</span></code>
169              will refer to a Fusion vector or references to the attributes.
170            </p></td></tr>
171</table></div>
172<p>
173            <span class="emphasis"><em>Spirit.Karma</em></span> generator API functions based on the
174            automatic creation of the matching generator type:
175          </p>
176<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">spirit</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">karma</span>
177<span class="special">{</span>
178    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Delimiter</span><span class="special">&gt;</span>
179    <span class="keyword">inline</span> <span class="keyword">bool</span>
180    <span class="identifier">generate_delimited</span><span class="special">(</span>
181        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
182      <span class="special">,</span> <span class="identifier">Attr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr</span>
183      <span class="special">,</span> <span class="identifier">Delimiter</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">delimiter</span>
184      <span class="special">,</span> <span class="identifier">BOOST_SCOPED_ENUM</span><span class="special">(</span><span class="identifier">delimit_flag</span><span class="special">)</span> <span class="identifier">pre_delimit</span> <span class="special">=</span> <span class="identifier">delimit_flag</span><span class="special">::</span><span class="identifier">dont_predelimit</span><span class="special">);</span>
185
186    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">OutputIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attr</span><span class="special">&gt;</span>
187    <span class="keyword">inline</span> <span class="keyword">bool</span>
188    <span class="identifier">generate</span><span class="special">(</span>
189        <span class="identifier">OutputIterator</span><span class="special">&amp;</span> <span class="identifier">sink</span>
190      <span class="special">,</span> <span class="identifier">Attr</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr</span><span class="special">);</span>
191<span class="special">}}}</span>
192</pre>
193<p>
194            All functions above return <code class="computeroutput"><span class="keyword">true</span></code>
195            if none of the involved generator components failed, and <code class="computeroutput"><span class="keyword">false</span></code> otherwise. If during the process
196            of the output generation the underlying output stream reports an error,
197            the return value will be <code class="computeroutput"><span class="keyword">false</span></code>
198            as well.
199          </p>
200<p>
201            The maximum number of supported arguments is limited by the preprocessor
202            constant <code class="computeroutput"><span class="identifier">SPIRIT_ARGUMENTS_LIMIT</span></code>.
203            This constant defaults to the value defined by the preprocessor constant
204            <code class="computeroutput"><span class="identifier">PHOENIX_LIMIT</span></code> (which
205            in turn defaults to <code class="computeroutput"><span class="number">10</span></code>).
206          </p>
207<div class="note"><table border="0" summary="Note">
208<tr>
209<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
210<th align="left">Note</th>
211</tr>
212<tr><td align="left" valign="top"><p>
213              The variadic functions with two or more attributes internally combine
214              (constant) references to all passed attributes into a <code class="computeroutput"><span class="identifier">fusion</span><span class="special">::</span><span class="identifier">vector</span></code> and forward this as a combined
215              attribute to the corresponding function taking one attribute.
216            </p></td></tr>
217</table></div>
218<p>
219            The <code class="computeroutput"><span class="identifier">generate_delimited</span></code>
220            functions not taking an explicit <code class="computeroutput"><span class="identifier">delimit_flag</span></code>
221            as one of their arguments don't invoke the passed delimiter before starting
222            to generate output from the generator expression. This can be enabled
223            by using the other version of that function while passing <code class="computeroutput"><span class="identifier">delimit_flag</span><span class="special">::</span><span class="identifier">predelimit</span></code> to the corresponding argument.
224          </p>
225<h6>
226<a name="spirit.karma.reference.generate_api.iterator_api.h4"></a>
227            <span class="phrase"><a name="spirit.karma.reference.generate_api.iterator_api.template_parameters"></a></span><a class="link" href="iterator_api.html#spirit.karma.reference.generate_api.iterator_api.template_parameters">Template
228            parameters</a>
229          </h6>
230<div class="informaltable"><table class="table">
231<colgroup>
232<col>
233<col>
234</colgroup>
235<thead><tr>
236<th>
237                    <p>
238                      Parameter
239                    </p>
240                  </th>
241<th>
242                    <p>
243                      Description
244                    </p>
245                  </th>
246</tr></thead>
247<tbody>
248<tr>
249<td>
250                    <p>
251                      <code class="computeroutput"><span class="identifier">OutputIterator</span></code>
252                    </p>
253                  </td>
254<td>
255                    <p>
256                      <a href="http://en.cppreference.com/w/cpp/named_req/OutputIterator" target="_top"><code class="computeroutput"><span class="identifier">OutputIterator</span></code></a> receiving
257                      the generated output.
258                    </p>
259                  </td>
260</tr>
261<tr>
262<td>
263                    <p>
264                      <code class="computeroutput"><span class="identifier">Expr</span></code>
265                    </p>
266                  </td>
267<td>
268                    <p>
269                      An expression that can be converted to a Karma generator.
270                    </p>
271                  </td>
272</tr>
273<tr>
274<td>
275                    <p>
276                      <code class="computeroutput"><span class="identifier">Delimiter</span></code>
277                    </p>
278                  </td>
279<td>
280                    <p>
281                      Generator used to delimit the output of the expression components.
282                    </p>
283                  </td>
284</tr>
285<tr>
286<td>
287                    <p>
288                      <code class="computeroutput"><span class="identifier">Attr</span></code>
289                    </p>
290                  </td>
291<td>
292                    <p>
293                      An attribute type utilized to create the corresponding generator
294                      type from.
295                    </p>
296                  </td>
297</tr>
298<tr>
299<td>
300                    <p>
301                      <code class="computeroutput"><span class="identifier">Attr1</span></code>, <code class="computeroutput"><span class="identifier">Attr2</span></code>, ..., <code class="computeroutput"><span class="identifier">AttrN</span></code>
302                    </p>
303                  </td>
304<td>
305                    <p>
306                      One or more attributes.
307                    </p>
308                  </td>
309</tr>
310</tbody>
311</table></div>
312</div>
313<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
314<td align="left"></td>
315<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
316        Distributed under the Boost Software License, Version 1.0. (See accompanying
317        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>)
318      </p>
319</div></td>
320</tr></table>
321<hr>
322<div class="spirit-nav">
323<a accesskey="p" href="../generate_api.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../generate_api.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="stream_api.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
324</div>
325</body>
326</html>
327