3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Auto Generator</title>
5 <link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
7 <link rel="home" href="../../../index.html" title="Spirit 2.5.2">
8 <link rel="up" href="../reference.html" title="Reference">
9 <link rel="prev" href="action.html" title="Semantic Actions with Generators">
10 <link rel="next" href="auxiliary.html" title="Auxiliary Generators">
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>
22 <div class="spirit-nav">
23 <a accesskey="p" href="action.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="auxiliary.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h4 class="title">
27 <a name="spirit.karma.reference.auto"></a><a class="link" href="auto.html" title="Auto Generator">Auto Generator</a>
28 </h4></div></div></div>
30 <a name="spirit.karma.reference.auto.h0"></a>
31 <span class="phrase"><a name="spirit.karma.reference.auto.description"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.description">Description</a>
34 This module includes the description of the <code class="computeroutput"><span class="identifier">auto_</span></code>
35 generator. This generator can be used to automatically create a generator
36 based on the supplied attribute type.
39 <a name="spirit.karma.reference.auto.h1"></a>
40 <span class="phrase"><a name="spirit.karma.reference.auto.header"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.header">Header</a>
42 <pre class="programlisting"><span class="comment">// forwards to <boost/spirit/home/karma/auto.hpp></span>
43 <span class="preprocessor">#include</span> <span class="special"><</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_auto</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
46 Also, see <a class="link" href="../../structure/include.html" title="Include">Include Structure</a>.
49 <a name="spirit.karma.reference.auto.h2"></a>
50 <span class="phrase"><a name="spirit.karma.reference.auto.namespace"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.namespace">Namespace</a>
52 <div class="informaltable"><table class="table">
53 <colgroup><col></colgroup>
61 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">auto_</span> <span class="comment">// alias:
62 boost::spirit::karma::auto_</span></code>
67 <a name="spirit.karma.reference.auto.h3"></a>
68 <span class="phrase"><a name="spirit.karma.reference.auto.model_of"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.model_of">Model
71 <div class="blockquote"><blockquote class="blockquote"><p>
72 <a class="link" href="generator_concepts/primitivegenerator.html" title="PrimitiveGenerator"><code class="computeroutput"><span class="identifier">PrimitiveGenerator</span></code></a>
73 </p></blockquote></div>
74 <div class="variablelist">
75 <p class="title"><b>Notation</b></p>
76 <dl class="variablelist">
77 <dt><span class="term"><code class="computeroutput"><span class="identifier">s</span></code></span></dt>
79 A variable instance of any type for which a mapping to a generator
80 type is defined (the meta function <code class="computeroutput"><span class="identifier">traits</span><span class="special">::</span><span class="identifier">create_generator_exists</span></code>
81 returns <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span></code>) or a <a class="link" href="basics.html#spirit.karma.reference.basics.lazy_argument">Lazy
82 Argument</a> that evaluates to any type for which a mapping to
83 a generator type is defined (the meta function <code class="computeroutput"><span class="identifier">traits</span><span class="special">::</span><span class="identifier">create_generator_exists</span></code>
84 returns <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span></code>).
89 <a name="spirit.karma.reference.auto.h4"></a>
90 <span class="phrase"><a name="spirit.karma.reference.auto.expression_semantics"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.expression_semantics">Expression
94 Semantics of an expression is defined only where it differs from, or is
95 not defined in <a class="link" href="generator_concepts/primitivegenerator.html" title="PrimitiveGenerator"><code class="computeroutput"><span class="identifier">PrimitiveGenerator</span></code></a>.
97 <div class="informaltable"><table class="table">
118 <code class="computeroutput"><span class="identifier">auto_</span></code>
123 Create a generator instance compatible with the supplied attribute
124 type and use it for output generation. This generator never fails
125 (unless the underlying output stream reports an error).
132 <code class="computeroutput"><span class="identifier">auto_</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span></code>
137 Create a generator instance compatible with the supplied literal
138 value. This generator never fails (unless the underlying output
139 stream reports an error).
146 <a name="spirit.karma.reference.auto.h5"></a>
147 <span class="phrase"><a name="spirit.karma.reference.auto.additional_requirements"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.additional_requirements">Additional
151 The <code class="computeroutput"><span class="identifier">auto_</span></code> generators can
152 be used to emit output for any data type for which a mapping to a generator
153 type is defined (the meta function <code class="computeroutput"><span class="identifier">traits</span><span class="special">::</span><span class="identifier">create_generator_exists</span></code>
154 returns <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span></code>). The following table outlines
155 the predefined mapping rules from the attribute type to the generator type.
156 These rules are applied recursively to create the generator type which
157 can be used to generate output from the given attribute type.
159 <div class="informaltable"><table class="table">
180 <code class="computeroutput"><span class="keyword">char</span></code>, <code class="computeroutput"><span class="keyword">wchar_t</span></code>
185 <code class="computeroutput"><span class="identifier">standard</span><span class="special">::</span><span class="identifier">char_</span></code>, <code class="computeroutput"><span class="identifier">standard_wide</span><span class="special">::</span><span class="identifier">char_</span></code>
192 <code class="computeroutput"><span class="keyword">short</span></code>, <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">long</span></code>
197 <code class="computeroutput"><span class="identifier">short_</span></code>, <code class="computeroutput"><span class="identifier">int_</span></code>, <code class="computeroutput"><span class="identifier">long_</span></code>
204 <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">short</span></code>,
205 <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">int</span></code>,
206 <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">long</span></code>
211 <code class="computeroutput"><span class="identifier">ushort_</span></code>, <code class="computeroutput"><span class="identifier">uint_</span></code>, <code class="computeroutput"><span class="identifier">ulong_</span></code>
218 <code class="computeroutput"><span class="keyword">float</span></code>, <code class="computeroutput"><span class="keyword">double</span></code>, <code class="computeroutput"><span class="keyword">long</span>
219 <span class="keyword">double</span></code>
224 <code class="computeroutput"><span class="identifier">float_</span></code>, <code class="computeroutput"><span class="identifier">double_</span></code>, <code class="computeroutput"><span class="identifier">long_double</span></code>
231 <code class="computeroutput"><span class="keyword">short</span></code>, <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">long</span></code>
236 <code class="computeroutput"><span class="identifier">short_</span></code>, <code class="computeroutput"><span class="identifier">int_</span></code>, <code class="computeroutput"><span class="identifier">long_</span></code>
243 <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">long</span></code>,
244 <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">long</span>
245 <span class="keyword">long</span></code>
250 <code class="computeroutput"><span class="identifier">long_long</span></code>, <code class="computeroutput"><span class="identifier">ulong_long</span></code>
257 <code class="computeroutput"><span class="keyword">bool</span></code>
262 <code class="computeroutput"><span class="identifier">bool_</span></code>
269 Any string (<code class="computeroutput"><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span></code>,
270 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>, etc.)
275 <code class="computeroutput"><span class="identifier">string</span></code>
287 Kleene Star (unary <code class="computeroutput"><span class="char">'*'</span></code>)
299 Sequence operator (<code class="computeroutput"><span class="char">'<<'</span></code>)
306 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><></span></code>
311 Optional operator (unary <code class="computeroutput"><span class="char">'-'</span></code>)
318 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">variant</span><span class="special"><></span></code>
323 Alternative operator (<code class="computeroutput"><span class="char">'|'</span></code>)
330 It is possible to add support for any custom data type by implementing
331 a specialization of the customization point <a class="link" href="../../advanced/customize/auto/create_generator.html" title="Define a Custom Attribute Mapping for a Generator"><code class="computeroutput"><span class="identifier">traits</span><span class="special">::</span><span class="identifier">create_generator</span></code></a>. This customization
332 can be used also to redefined any of the predefined mappings.
335 <a name="spirit.karma.reference.auto.h6"></a>
336 <span class="phrase"><a name="spirit.karma.reference.auto.attributes"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.attributes">Attributes</a>
338 <div class="informaltable"><table class="table">
359 <code class="computeroutput"><span class="identifier">auto_</span></code>
364 <code class="computeroutput"><span class="identifier">hold_any</span></code>, attribute
365 is mandatory (otherwise compilation will fail)
372 <code class="computeroutput"><span class="identifier">auto_</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span></code>
377 <code class="computeroutput"><span class="identifier">unused</span></code>
383 <div class="important"><table border="0" summary="Important">
385 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../images/important.png"></td>
386 <th align="left">Important</th>
388 <tr><td align="left" valign="top"><p>
389 The attribute type <code class="computeroutput"><span class="identifier">hold_any</span></code>
390 exposed by some of the <code class="computeroutput"><span class="identifier">auto_</span></code>
391 generators is semantically and syntactically equivalent to the type implemented
392 by <a href="../../../../../../../libs/any/index.html" target="_top">Boost.Any</a>. It has
393 been added to <span class="emphasis"><em>Spirit</em></span> as it has better a performance
394 and a smaller footprint if compared to <a href="../../../../../../../libs/any/index.html" target="_top">Boost.Any</a>.
397 <div class="note"><table border="0" summary="Note">
399 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
400 <th align="left">Note</th>
402 <tr><td align="left" valign="top"><p>
403 In addition to their usual attribute of type <code class="computeroutput"><span class="identifier">Attrib</span></code>
404 all listed generators accept an instance of a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><</span><span class="identifier">Attrib</span><span class="special">></span></code> as well. If the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><></span></code> is initialized (holds a value)
405 the generators behave as if their attribute was an instance of <code class="computeroutput"><span class="identifier">Attrib</span></code> and emit the value stored in
406 the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><></span></code>.
407 Otherwise the generators will fail.
411 <a name="spirit.karma.reference.auto.h7"></a>
412 <span class="phrase"><a name="spirit.karma.reference.auto.complexity"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.complexity">Complexity</a>
414 <div class="blockquote"><blockquote class="blockquote"><p>
415 The complexity of the <code class="computeroutput"><span class="identifier">auto_</span></code>
416 generator depends on the attribute type. Each attribute type results
417 in a different generator type to be instantiated which defines the overall
419 </p></blockquote></div>
421 <a name="spirit.karma.reference.auto.h8"></a>
422 <span class="phrase"><a name="spirit.karma.reference.auto.example"></a></span><a class="link" href="auto.html#spirit.karma.reference.auto.example">Example</a>
424 <div class="note"><table border="0" summary="Note">
426 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
427 <th align="left">Note</th>
429 <tr><td align="left" valign="top"><p>
430 The test harness for the example(s) below is presented in the <a class="link" href="basics.html#spirit.karma.reference.basics.examples">Basics
431 Examples</a> section.
439 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
440 <span class="preprocessor">#include</span> <span class="special"><</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">></span>
441 <span class="preprocessor">#include</span> <span class="special"><</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">></span>
442 <span class="preprocessor">#include</span> <span class="special"><</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">></span>
443 <span class="preprocessor">#include</span> <span class="special"><</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">></span>
444 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
445 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">string</span><span class="special">></span>
450 Some using declarations:
454 <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">auto_</span><span class="special">;</span>
459 And a class definition used in the examples:
463 <pre class="programlisting"><span class="comment">// a simple complex number representation z = a + bi</span>
464 <span class="keyword">struct</span> <span class="identifier">complex</span>
465 <span class="special">{</span>
466 <span class="identifier">complex</span> <span class="special">(</span><span class="keyword">double</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">b</span><span class="special">)</span>
467 <span class="special">:</span> <span class="identifier">a</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">b</span><span class="special">)</span>
468 <span class="special">{}</span>
470 <span class="keyword">double</span> <span class="identifier">a</span><span class="special">;</span>
471 <span class="keyword">double</span> <span class="identifier">b</span><span class="special">;</span>
472 <span class="special">};</span>
477 The following construct is required to allow the <code class="computeroutput"><span class="identifier">complex</span></code>
478 data structure to be utilized as a <a href="../../../../../../../libs/fusion/doc/html/index.html" target="_top">Boost.Fusion</a>
479 sequence. This is required as we will emit output for this data structure
480 with a <span class="emphasis"><em>Spirit.Karma</em></span> sequence: <code class="computeroutput"><span class="char">'{'</span>
481 <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="char">','</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="char">'}'</span></code>.
485 <pre class="programlisting"><span class="identifier">BOOST_FUSION_ADAPT_STRUCT</span><span class="special">(</span>
486 <span class="identifier">complex</span><span class="special">,</span>
487 <span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span>
488 <span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">b</span><span class="special">)</span>
489 <span class="special">)</span>
494 We add a specialization for the create_generator customization point defining
495 a custom output format for the complex type. Generally, any specialization
496 for create_generator is expected to return the proto expression to be used
497 to generate output for the type the customization point has been specialized
501 We need to utilize <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">deep_copy</span></code>
502 as the expression contains literals (the <code class="computeroutput"><span class="char">'{'</span></code>,
503 <code class="computeroutput"><span class="char">','</span></code>, and <code class="computeroutput"><span class="char">'}'</span></code>)
504 which normally get embedded in the proto expression by reference only.
505 The deep copy converts the proto tree to hold this by value. The deep copy
506 operation can be left out for simpler proto expressions (not containing
507 references to temporaries). Alternatively you could use the <code class="computeroutput"><span class="identifier">proto</span><span class="special">::</span><span class="identifier">make_expr</span></code> facility to build the required
512 <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">traits</span>
513 <span class="special">{</span>
514 <span class="keyword">template</span> <span class="special"><></span>
515 <span class="keyword">struct</span> <span class="identifier">create_generator</span><span class="special"><</span><span class="identifier">complex</span><span class="special">></span>
516 <span class="special">{</span>
517 <span class="keyword">typedef</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">deep_copy</span><span class="special"><</span>
518 <span class="identifier">BOOST_TYPEOF</span><span class="special">(</span><span class="char">'{'</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="char">','</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="char">'}'</span><span class="special">)</span>
519 <span class="special">>::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
521 <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">call</span><span class="special">()</span>
522 <span class="special">{</span>
523 <span class="keyword">return</span> <span class="identifier">proto</span><span class="special">::</span><span class="identifier">deep_copy</span><span class="special">(</span>
524 <span class="char">'{'</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="char">','</span> <span class="special"><<</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">double_</span> <span class="special"><<</span> <span class="char">'}'</span><span class="special">);</span>
525 <span class="special">}</span>
526 <span class="special">};</span>
527 <span class="special">}}}</span>
532 Some usage examples of <code class="computeroutput"><span class="identifier">auto_</span></code>
536 Emit a simple string using the <code class="computeroutput"><span class="identifier">karma</span><span class="special">::</span><span class="identifier">string</span></code>
541 <pre class="programlisting"><span class="identifier">test_generator_attr</span><span class="special">(</span><span class="string">"abc"</span><span class="special">,</span> <span class="identifier">auto_</span><span class="special">,</span> <span class="string">"abc"</span><span class="special">);</span>
542 <span class="identifier">test_generator</span><span class="special">(</span><span class="string">"abc"</span><span class="special">,</span> <span class="identifier">auto_</span><span class="special">(</span><span class="string">"abc"</span><span class="special">));</span>
547 Emit instances of the <code class="computeroutput"><span class="identifier">complex</span></code>
548 data type as defined above using the generator defined by the customization
549 point for <code class="computeroutput"><span class="identifier">complex</span></code>:
553 <pre class="programlisting"><span class="identifier">test_generator_attr</span><span class="special">(</span><span class="string">"{1.2,2.4}"</span><span class="special">,</span> <span class="identifier">auto_</span><span class="special">,</span> <span class="identifier">complex</span><span class="special">(</span><span class="number">1.2</span><span class="special">,</span> <span class="number">2.4</span><span class="special">));</span>
554 <span class="identifier">test_generator</span><span class="special">(</span><span class="string">"{1.2,2.4}"</span><span class="special">,</span> <span class="identifier">auto_</span><span class="special">(</span><span class="identifier">complex</span><span class="special">(</span><span class="number">1.2</span><span class="special">,</span> <span class="number">2.4</span><span class="special">)));</span>
559 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
560 <td align="left"></td>
561 <td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
562 Distributed under the Boost Software License, Version 1.0. (See accompanying
563 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>)
568 <div class="spirit-nav">
569 <a accesskey="p" href="action.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="auxiliary.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>