blob: 33d942918d42769936ff114e272cb2ae2504b926 [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Dereference the Iterator pointing into a Container Attribute</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="../iterate.html" title="Extract Attribute Values to Generate Output from a Container (Karma)">
<link rel="prev" href="next_iterator.html" title="Increment the Iterator pointing into a Container Attribute">
<link rel="next" href="compare_iterators.html" title="Compare two Iterator pointing into a Container Attribute for Equality">
</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="next_iterator.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../iterate.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="compare_iterators.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h5 class="title">
<a name="spirit.advanced.customize.iterate.deref_iterator"></a><a class="link" href="deref_iterator.html" title="Dereference the Iterator pointing into a Container Attribute">Dereference
the Iterator pointing into a Container Attribute</a>
</h5></div></div></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.deref_iterator"></a><h6>
<a name="id1192619"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.deref_iterator">deref_iterator</a>
</h6>
<p>
The template <code class="computeroutput"><span class="identifier">deref_iterator</span></code>
is a type used as an attribute customization point. It is invoked by
the <span class="emphasis"><em>Karma</em></span> repetitive generators (such as <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene
(unary <code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary <code class="computeroutput"><span class="special">+</span></code>)</a>, and <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>)
in order to dereference an iterator pointing to an element of a container
holding the attributes to generate output from.
</p>
<a name="spirit.advanced.customize.iterate.deref_iterator.module_headers"></a><h6>
<a name="id1192692"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.module_headers">Module
Headers</a>
</h6>
<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">home</span><span class="special">/</span><span class="identifier">support</span><span class="special">/</span><span class="identifier">container</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
</pre>
<p>
Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
This header file does not need to be included directly by any user
program as it is normally included by other Spirit header files relying
on its content.
</p></td></tr>
</table></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.namespace"></a><h6>
<a name="id1193882"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.namespace">Namespace</a>
</h6>
<div class="informaltable"><table class="table">
<colgroup><col></colgroup>
<thead><tr><th>
<p>
Name
</p>
</th></tr></thead>
<tbody><tr><td>
<p>
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">traits</span></code>
</p>
</td></tr></tbody>
</table></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.synopsis"></a><h6>
<a name="id1193960"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.synopsis">Synopsis</a>
</h6>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Enable</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">deref_iterator</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="special">&lt;</span><span class="identifier">unspecified</span><span class="special">&gt;</span> <span class="identifier">type</span><span class="special">;</span>
<span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">call</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&amp;</span> <span class="identifier">it</span><span class="special">);</span>
<span class="special">};</span>
</pre>
<a name="spirit.advanced.customize.iterate.deref_iterator.template_parameters"></a><h6>
<a name="id1194092"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.template_parameters">Template
parameters</a>
</h6>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Parameter
</p>
</th>
<th>
<p>
Description
</p>
</th>
<th>
<p>
Default
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">Iterator</span></code>
</p>
</td>
<td>
<p>
The type, <code class="computeroutput"><span class="identifier">Iterator</span></code>
of the iterator to dereference. This is the same as the type
returned by the customization point <a class="link" href="container_iterator.html" title="Determine the Type of the Iterator of a Container (Karma)"><code class="computeroutput"><span class="identifier">container_iterator</span></code></a>.
</p>
</td>
<td>
<p>
none
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">Enable</span></code>
</p>
</td>
<td>
<p>
Helper template parameter usable to selectively enable or disable
certain specializations of <code class="computeroutput"><span class="identifier">deref_iterator</span></code>
utilizing SFINAE (i.e. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span></code>
or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">disable_if</span></code>).
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="keyword">void</span></code>
</p>
</td>
</tr>
</tbody>
</table></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.notation"></a><h6>
<a name="id1194274"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.notation">Notation</a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term"><code class="computeroutput"><span class="identifier">Iterator</span></code></span></dt>
<dd><p>
An iterator type.
</p></dd>
<dt><span class="term"><code class="computeroutput"><span class="identifier">it</span></code></span></dt>
<dd><p>
An instance of an iterator of type <code class="computeroutput"><span class="identifier">Iterator</span></code>.
</p></dd>
<dt><span class="term"><code class="computeroutput"><span class="identifier">C</span></code></span></dt>
<dd><p>
A container type whose iterator type is <code class="computeroutput"><span class="identifier">Iterator</span></code>.
</p></dd>
</dl>
</div>
<a name="spirit.advanced.customize.iterate.deref_iterator.expression_semantics"></a><h6>
<a name="id1194369"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.expression_semantics">Expression
Semantics</a>
</h6>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Expression
</p>
</th>
<th>
<p>
Semantics
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">deref_iterator</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">type</span></code>
</p>
</td>
<td>
<p>
Metafunction result evaluating to the type returned by dereferencing
the iterator.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">deref_iterator</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">call</span><span class="special">(</span><span class="identifier">it</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
Return the element in the container referred to by the iterator.
The type of the returned value is the same as returned by the
metafunction result <code class="computeroutput"><span class="identifier">type</span></code>.
</p>
</td>
</tr>
</tbody>
</table></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.predefined_specializations"></a><h6>
<a name="id1194514"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.predefined_specializations">Predefined
Specializations</a>
</h6>
<p>
<a href="http://boost-spirit.com" target="_top">Spirit</a> predefines specializations
of this customization point for several types. The following table lists
those types together with the types returned by the embedded typedef
<code class="computeroutput"><span class="identifier">type</span></code>:
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Template Parameters
</p>
</th>
<th>
<p>
Value
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">Iterator</span></code>
</p>
</td>
<td>
<p>
The metafunction result <code class="computeroutput"><span class="identifier">type</span></code>
evaluates to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">&gt;::</span><span class="identifier">reference</span></code>
and the function <code class="computeroutput"><span class="identifier">call</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="identifier">it</span></code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">unused_type</span></code><code class="computeroutput">
<span class="keyword">const</span><span class="special">*</span></code>
</p>
</td>
<td>
<p>
The metafunction result <code class="computeroutput"><span class="identifier">type</span></code>
evaluates to <code class="computeroutput"><span class="identifier">unused_type</span></code>
and the function <code class="computeroutput"><span class="identifier">call</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="identifier">unused</span></code>.
</p>
</td>
</tr>
</tbody>
</table></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.when_to_implement"></a><h6>
<a name="id1194738"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.when_to_implement">When
to implement</a>
</h6>
<p>
The customization point <code class="computeroutput"><span class="identifier">deref_iterator</span></code>
needs to be implemented for a specific iterator type whenever the container
this iterator belongs to is to be used as an attribute in place of a
STL container. It is applicable for generators (<span class="emphasis"><em>Spirit.Karma</em></span>)
only. As a rule of thumb: it has to be implemented whenever a certain
iterator type belongs to a container which is to be passed as an attribute
to a generator normally exposing a STL container, <code class="computeroutput"><span class="identifier">C</span></code>
and if the container type does not expose the interface of a STL container
(i.e. <code class="computeroutput"><span class="identifier">is_container</span><span class="special">&lt;</span><span class="identifier">C</span><span class="special">&gt;::</span><span class="identifier">type</span></code> would normally return <code class="computeroutput"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span></code>).
</p>
<a name="spirit.advanced.customize.iterate.deref_iterator.related_attribute_customization_points"></a><h6>
<a name="id1194808"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.related_attribute_customization_points">Related
Attribute Customization Points</a>
</h6>
<p>
If this customization point is implemented, the following other customization
points might need to be implemented as well.
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Name
</p>
</th>
<th>
<p>
When to implement
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<a class="link" href="../is_container.html" title="Determine if a Type Should be Treated as a Container (Qi and Karma)"><code class="computeroutput"><span class="identifier">is_container</span></code></a>
</p>
</td>
<td>
<p>
Needs to be implemented whenever a type is to be used as a
container attribute in <span class="emphasis"><em>Karma</em></span>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="container_iterator.html" title="Determine the Type of the Iterator of a Container (Karma)"><code class="computeroutput"><span class="identifier">container_iterator</span></code></a>
</p>
</td>
<td>
<p>
Karma: <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene (unary
<code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary
<code class="computeroutput"><span class="special">+</span></code>)</a>, <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="begin_container.html" title="Get the Iterator pointing to the Begin of a Container Attribute"><code class="computeroutput"><span class="identifier">begin_container</span></code></a>
</p>
</td>
<td>
<p>
Karma: <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene (unary
<code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary
<code class="computeroutput"><span class="special">+</span></code>)</a>, <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="end_container.html" title="Get the Iterator pointing to the End of a Container Attribute"><code class="computeroutput"><span class="identifier">end_container</span></code></a>
</p>
</td>
<td>
<p>
Karma: <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene (unary
<code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary
<code class="computeroutput"><span class="special">+</span></code>)</a>, <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="deref_iterator.html" title="Dereference the Iterator pointing into a Container Attribute"><code class="computeroutput"><span class="identifier">deref_iterator</span></code></a>
</p>
</td>
<td>
<p>
Karma: <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene (unary
<code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary
<code class="computeroutput"><span class="special">+</span></code>)</a>, <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="next_iterator.html" title="Increment the Iterator pointing into a Container Attribute"><code class="computeroutput"><span class="identifier">next_iterator</span></code></a>
</p>
</td>
<td>
<p>
Karma: <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene (unary
<code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary
<code class="computeroutput"><span class="special">+</span></code>)</a>, <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="compare_iterators.html" title="Compare two Iterator pointing into a Container Attribute for Equality"><code class="computeroutput"><span class="identifier">compare_iterators</span></code></a>
</p>
</td>
<td>
<p>
Karma: <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/kleene.html" title="Kleene Star (*a)">Kleene (unary
<code class="computeroutput"><span class="special">*</span></code>)</a>, <a class="link" href="../../../karma/reference/operator/plus.html" title="Plus (+a)">Plus (unary
<code class="computeroutput"><span class="special">+</span></code>)</a>, <a class="link" href="../../../karma/reference/directive/repeat.html" title="Repetition Directive (repeat[])">Repeat</a>.
</p>
</td>
</tr>
</tbody>
</table></div>
<a name="spirit.advanced.customize.iterate.deref_iterator.example"></a><h6>
<a name="id1195305"></a>
<a class="link" href="deref_iterator.html#spirit.advanced.customize.iterate.deref_iterator.example">Example</a>
</h6>
<p>
Here are the header files needed to make the example code below compile:
</p>
<p>
</p>
<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>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
</pre>
<p>
</p>
<p>
The example (for the full source code please see here: <a href="../../../../../../example/karma/customize_counter.cpp" target="_top">customize_counter.cpp</a>)
uses the data structure
</p>
<p>
</p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">client</span>
<span class="special">{</span>
<span class="keyword">struct</span> <span class="identifier">counter</span>
<span class="special">{</span>
<span class="comment">// expose the current value of the counter as our iterator
</span> <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">iterator</span><span class="special">;</span>
<span class="comment">// expose 'int' as the type of each generated element
</span> <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">type</span><span class="special">;</span>
<span class="identifier">counter</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">max_count</span><span class="special">)</span>
<span class="special">:</span> <span class="identifier">counter_</span><span class="special">(</span><span class="number">0</span><span class="special">),</span> <span class="identifier">max_count_</span><span class="special">(</span><span class="identifier">max_count</span><span class="special">)</span>
<span class="special">{}</span>
<span class="keyword">int</span> <span class="identifier">counter_</span><span class="special">;</span>
<span class="keyword">int</span> <span class="identifier">max_count_</span><span class="special">;</span>
<span class="special">};</span>
<span class="special">}</span>
</pre>
<p>
</p>
<p>
as a direct attribute to the <a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List
(<code class="computeroutput"><span class="special">%</span></code>)</a> generator. This
type does not expose any of the interfaces of an STL container. It does
not even expose the usual semantics of a container. The presented customization
points build a counter instance which is incremented each time it is
accessed. The examples shows how to enable its use as an attribute to
<span class="emphasis"><em>Karma's</em></span> repetitive generators.
</p>
<p>
In order to make this data structure compatible we need to specialize
a couple of attribute customization points: <a class="link" href="../is_container.html" title="Determine if a Type Should be Treated as a Container (Qi and Karma)"><code class="computeroutput"><span class="identifier">is_container</span></code></a>, <a class="link" href="container_iterator.html" title="Determine the Type of the Iterator of a Container (Karma)"><code class="computeroutput"><span class="identifier">container_iterator</span></code></a>, <a class="link" href="begin_container.html" title="Get the Iterator pointing to the Begin of a Container Attribute"><code class="computeroutput"><span class="identifier">begin_container</span></code></a>, and <a class="link" href="end_container.html" title="Get the Iterator pointing to the End of a Container Attribute"><code class="computeroutput"><span class="identifier">end_container</span></code></a>. In addition,
we specialize one of the iterator related customization points as well:
<a class="link" href="deref_iterator.html" title="Dereference the Iterator pointing into a Container Attribute"><code class="computeroutput"><span class="identifier">deref_iterator</span></code></a>.
</p>
<p>
</p>
<pre class="programlisting"><span class="comment">// All specializations of attribute customization points have to be placed into
</span><span class="comment">// the namespace boost::spirit::traits.
</span><span class="comment">//
</span><span class="comment">// Note that all templates below are specialized using the 'const' type.
</span><span class="comment">// This is necessary as all attributes in Karma are 'const'.
</span><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>
<span class="special">{</span>
<span class="comment">// The specialization of the template 'is_container&lt;&gt;' will tell the
</span> <span class="comment">// library to treat the type 'client::counter' as a container providing
</span> <span class="comment">// the items to generate output from.
</span> <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <span class="identifier">is_container</span><span class="special">&lt;</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&gt;</span>
<span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span>
<span class="special">{};</span>
<span class="comment">// The specialization of the template 'container_iterator&lt;&gt;' will be
</span> <span class="comment">// invoked by the library to evaluate the iterator type to be used
</span> <span class="comment">// for iterating the data elements in the container.
</span> <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <span class="identifier">container_iterator</span><span class="special">&lt;</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">type</span><span class="special">;</span>
<span class="special">};</span>
<span class="comment">// The specialization of the templates 'begin_container&lt;&gt;' and
</span> <span class="comment">// 'end_container&lt;&gt;' below will be used by the library to get the iterators
</span> <span class="comment">// pointing to the begin and the end of the data to generate output from.
</span> <span class="comment">// These specializations respectively return the initial and maximum
</span> <span class="comment">// counter values.
</span> <span class="comment">//
</span> <span class="comment">// The passed argument refers to the attribute instance passed to the list
</span> <span class="comment">// generator.
</span> <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <span class="identifier">begin_container</span><span class="special">&lt;</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">static</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span><span class="special">::</span><span class="identifier">iterator</span>
<span class="identifier">call</span><span class="special">(</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">c</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">counter_</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <span class="identifier">end_container</span><span class="special">&lt;</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">static</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span><span class="special">::</span><span class="identifier">iterator</span>
<span class="identifier">call</span><span class="special">(</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">c</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">c</span><span class="special">.</span><span class="identifier">max_count_</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="special">}}}</span>
</pre>
<p>
</p>
<p>
</p>
<pre class="programlisting"><span class="comment">// All specializations of attribute customization points have to be placed into
</span><span class="comment">// the namespace boost::spirit::traits.
</span><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>
<span class="special">{</span>
<span class="comment">// The specialization of the template 'deref_iterator&lt;&gt;' will be used to
</span> <span class="comment">// dereference the iterator associated with our counter data structure.
</span> <span class="comment">// Since we expose the current value as the iterator we just return the
</span> <span class="comment">// current iterator as the return value.
</span> <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
<span class="keyword">struct</span> <span class="identifier">deref_iterator</span><span class="special">&lt;</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span><span class="special">::</span><span class="identifier">iterator</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span><span class="special">::</span><span class="identifier">type</span> <span class="identifier">type</span><span class="special">;</span>
<span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">call</span><span class="special">(</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span><span class="special">::</span><span class="identifier">iterator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">it</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">it</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="special">}}}</span>
</pre>
<p>
</p>
<p>
The last code snippet shows an example using an instance of the data
structure <code class="computeroutput"><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span></code> to generate output from a
<a class="link" href="../../../karma/reference/operator/list.html" title="Lists (a % b)">List (<code class="computeroutput"><span class="special">%</span></code>)</a> generator:
</p>
<p>
</p>
<pre class="programlisting"><span class="comment">// use the instance of a 'client::counter' instead of a STL vector
</span><span class="identifier">client</span><span class="special">::</span><span class="identifier">counter</span> <span class="identifier">count</span><span class="special">(</span><span class="number">4</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">karma</span><span class="special">::</span><span class="identifier">format</span><span class="special">(</span><span class="identifier">karma</span><span class="special">::</span><span class="identifier">int_</span> <span class="special">%</span> <span class="string">", "</span><span class="special">,</span> <span class="identifier">count</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// prints: '0, 1, 2, 3'
</span></pre>
<p>
</p>
<p>
As you can see, the specializations for the customization points as defined
above enable the seamless integration of the custom data structure without
having to modify the output format or the generator itself.
</p>
<p>
For other examples of how to use the customization point <code class="computeroutput"><span class="identifier">deref_iterator</span></code> please see here: <a class="link" href="next_iterator.html#spirit.advanced.customize.iterate.next_iterator.example">use_as_container</a>.
</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="next_iterator.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../iterate.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="compare_iterators.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>