blob: 4c3e7e95fce6560645d2d12b497256d05b588daa [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Customization of Spirit's Attribute Handling</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.0">
<link rel="home" href="../../index.html" title="Spirit 2.4.1">
<link rel="up" href="../advanced.html" title="Advanced">
<link rel="prev" href="indepth/parsers_indepth.html" title="Parsers in Depth">
<link rel="next" href="customize/is_container.html" title="Determine if a Type Should be Treated as a Container (Qi and Karma)">
</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="indepth/parsers_indepth.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.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="customize/is_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="spirit.advanced.customize"></a><a class="link" href="customize.html" title="Customization of Spirit's Attribute Handling">Customization of Spirit's
Attribute Handling</a>
</h3></div></div></div>
<div class="toc"><dl>
<dt><span class="section"><a href="customize/is_container.html">Determine if
a Type Should be Treated as a Container (Qi and Karma)</a></span></dt>
<dt><span class="section"><a href="customize/transform.html">Transform an Attribute
to a Different Type (Qi and Karma)</a></span></dt>
<dt><span class="section"><a href="customize/assign_to.html">Store a Parsed
Attribute Value (Qi)</a></span></dt>
<dt><span class="section"><a href="customize/store_value.html">Store Parsed
Attribute Values into a Container (Qi)</a></span></dt>
<dt><span class="section"><a href="customize/clear_value.html">Re-Initialize
an Attribute Value before Parsing (Qi)</a></span></dt>
<dt><span class="section"><a href="customize/extract_from.html">Extract an
Attribute Value to Generate Output (Karma)</a></span></dt>
<dt><span class="section"><a href="customize/iterate.html">Extract Attribute
Values to Generate Output from a Container (Karma)</a></span></dt>
<dt><span class="section"><a href="customize/auto.html">Create Components from
Attributes</a></span></dt>
</dl></div>
<a name="spirit.advanced.customize.why_do_we_need_attribute_customization_points"></a><h5>
<a name="id1159823"></a>
<a class="link" href="customize.html#spirit.advanced.customize.why_do_we_need_attribute_customization_points">Why
do we need Attribute Customization Points</a>
</h5>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
Before you read on please be aware that the interfaces described in this
section are not finalized and may change in the future without attempting
to be backwards compatible. We document the customization point interfaces
anyways as we think they are important. Understanding customization points
helps understanding Spirit. Additionally they prove to be powerful tools
enabling full integration of the user's data structures with <span class="emphasis"><em>Qi's</em></span>
parsers and <span class="emphasis"><em>Karma's</em></span> generators.
</p></td></tr>
</table></div>
<p>
<a href="http://boost-spirit.com" target="_top">Spirit</a> has been written with
extensibility in mind. It provides many different attribute customization
points allowing to integrate custom data types with the process of parsing
in <span class="emphasis"><em>Spirit.Qi</em></span> or output generation with <span class="emphasis"><em>Spirit.Karma</em></span>.
All attribute customization points are exposed using a similar technique:
full or partial template specialization. <a href="http://boost-spirit.com" target="_top">Spirit</a>
generally implements the main template, providing a default implementation.
You as the user have to provide a partial or full specialization of this
template for the data types you want to integrate with the library. In fact,
the library uses these customization points itself for instance to handle
the magic of the <code class="computeroutput"><span class="identifier">unused_type</span></code>
attribute type.
</p>
<p>
Here is an example showing the <a class="link" href="customize/store_value/container_value.html" title="Determine the Type to be Stored in a Container (Qi)"><code class="computeroutput"><span class="identifier">container_value</span></code></a> customization point
used by different parsers (such as <a class="link" href="../qi/reference/operator/kleene.html" title="Kleene (*a)">Kleene</a>,
<a class="link" href="../qi/reference/operator/plus.html" title="Plus (+a)">Plus</a>, etc.) to find
the attribute type to be stored in a supplied STL container:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Enable</span><span class="comment">/* = void*/</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">container_value</span>
<span class="special">:</span> <span class="identifier">detail</span><span class="special">::</span><span class="identifier">remove_value_const</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">&gt;</span>
<span class="special">{};</span>
</pre>
<p>
</p>
<p>
This template is instantiated by the library at the appropriate places while
using the supplied container type as the template argument. The embedded
<code class="computeroutput"><span class="identifier">type</span></code> is used as the attribute
type while parsing the elements to be store in that container.
</p>
<p>
The following example shows the predefined specialization for <code class="computeroutput"><span class="identifier">unused_type</span></code>:
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <span class="identifier">container_value</span><span class="special">&lt;</span><span class="identifier">unused_type</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">unused_type</span> <span class="identifier">type</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<p>
</p>
<p>
which defines its embedded <code class="computeroutput"><span class="identifier">type</span></code>
to be <code class="computeroutput"><span class="identifier">unused_type</span></code> as well,
this way propagating the 'don't care' attribute status to the embedded parser.
</p>
<p>
All attribute customization points follow the same scheme. The last template
parameter is always <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">Enable</span> <span class="special">=</span> <span class="keyword">void</span></code> allowing to apply SFINAE for fine grained
control over the template specialization process. But most of the time you
can safely forget about its existence.
</p>
<p>
The following sections will describe all customization points, together with
a description which needs to be specialized for what purpose.
</p>
<a name="spirit.advanced.customize.the_usage_of_customization_points"></a><h5>
<a name="id1160137"></a>
<a class="link" href="customize.html#spirit.advanced.customize.the_usage_of_customization_points">The
Usage of Customization Points</a>
</h5>
<p>
The different customizations points are used by different parts of the library.
Part of the customizations points are used by both, <span class="emphasis"><em>Spirit.Qi</em></span>
and <span class="emphasis"><em>Spirit.Karma</em></span>, whereas others are specialized to
be applied for one of the sub-libraries only. We will explain when a specific
customization point needs to be implemented and, equally important, which
customization points need to be implemented at the same time. Often it is
not sufficient to provide a specialization for one single customization point
only, in this case you as the user have to provide all necessary customizations
for your data type you want to integrate with 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 &#169; 2001-2010 Joel de Guzman, Hartmut Kaiser<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="indepth/parsers_indepth.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../advanced.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="customize/is_container.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>