• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Extract an Attribute Value to Generate Output (Karma)</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="../customize.html" title="Customization of Spirit's Attribute Handling">
9<link rel="prev" href="clear_value.html" title="Re-Initialize an Attribute Value before Parsing (Qi)">
10<link rel="next" href="extract_from_container.html" title="Extract From a Container Attribute Value to Generate Output (Karma)">
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="clear_value.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../customize.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="extract_from_container.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h4 class="title">
27<a name="spirit.advanced.customize.extract_from"></a><a class="link" href="extract_from.html" title="Extract an Attribute Value to Generate Output (Karma)">Extract an
28        Attribute Value to Generate Output (Karma)</a>
29</h4></div></div></div>
30<h6>
31<a name="spirit.advanced.customize.extract_from.h0"></a>
32          <span class="phrase"><a name="spirit.advanced.customize.extract_from.extract_from"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.extract_from">extract_from</a>
33        </h6>
34<p>
35          Before generating output for a value this value needs to extracted from
36          the attribute instance provided by the user. The customization point <code class="computeroutput"><span class="identifier">extract_from_attribute</span></code> is utilized to
37          adapt this extraction for any data type possibly used to store the values
38          to output.
39        </p>
40<div class="note"><table border="0" summary="Note">
41<tr>
42<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
43<th align="left">Note</th>
44</tr>
45<tr><td align="left" valign="top"><p>
46            The interface of this customization point has been changed with Boost
47            V1.44. We added the <code class="computeroutput"><span class="identifier">Exposed</span></code>
48            template parameter to allow for more fine grained specializations of
49            the required <span class="emphasis"><em>Spirit.Karma</em></span> attribute transformations.
50          </p></td></tr>
51</table></div>
52<h6>
53<a name="spirit.advanced.customize.extract_from.h1"></a>
54          <span class="phrase"><a name="spirit.advanced.customize.extract_from.module_headers"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.module_headers">Module
55          Headers</a>
56        </h6>
57<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">karma</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">extract_from</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
58</pre>
59<p>
60          Also, see <a class="link" href="../../structure/include.html" title="Include">Include Structure</a>.
61        </p>
62<div class="note"><table border="0" summary="Note">
63<tr>
64<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../images/note.png"></td>
65<th align="left">Note</th>
66</tr>
67<tr><td align="left" valign="top"><p>
68            This header file does not need to be included directly by any user program
69            as it is normally included by other Spirit header files relying on its
70            content.
71          </p></td></tr>
72</table></div>
73<h6>
74<a name="spirit.advanced.customize.extract_from.h2"></a>
75          <span class="phrase"><a name="spirit.advanced.customize.extract_from.namespace"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.namespace">Namespace</a>
76        </h6>
77<div class="informaltable"><table class="table">
78<colgroup><col></colgroup>
79<thead><tr><th>
80                  <p>
81                    Name
82                  </p>
83                </th></tr></thead>
84<tbody><tr><td>
85                  <p>
86                    <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>
87                  </p>
88                </td></tr></tbody>
89</table></div>
90<h6>
91<a name="spirit.advanced.customize.extract_from.h3"></a>
92          <span class="phrase"><a name="spirit.advanced.customize.extract_from.synopsis"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.synopsis">Synopsis</a>
93        </h6>
94<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Exposed</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attrib</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Enable</span><span class="special">&gt;</span>
95<span class="keyword">struct</span> <span class="identifier">extract_from_attribute</span>
96<span class="special">{</span>
97    <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>
98
99    <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">&gt;</span>
100    <span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">call</span><span class="special">(</span><span class="identifier">Attrib</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">attr</span><span class="special">,</span> <span class="identifier">Context</span><span class="special">&amp;</span> <span class="identifier">context</span><span class="special">);</span>
101<span class="special">};</span>
102</pre>
103<h6>
104<a name="spirit.advanced.customize.extract_from.h4"></a>
105          <span class="phrase"><a name="spirit.advanced.customize.extract_from.template_parameters"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.template_parameters">Template
106          parameters</a>
107        </h6>
108<div class="informaltable"><table class="table">
109<colgroup>
110<col>
111<col>
112</colgroup>
113<thead><tr>
114<th>
115                  <p>
116                    Parameter
117                  </p>
118                </th>
119<th>
120                  <p>
121                    Description
122                  </p>
123                </th>
124<th>
125                  <p>
126                    Default
127                  </p>
128                </th>
129</tr></thead>
130<tbody>
131<tr>
132<td>
133                  <p>
134                    <code class="computeroutput"><span class="identifier">Exposed</span></code>
135                  </p>
136                </td>
137<td>
138                  <p>
139                    The type, <code class="computeroutput"><span class="identifier">Exposed</span></code>
140                    of the attribute natively exposed by the component the <code class="computeroutput"><span class="identifier">extract_from_attribute</span></code> is invoked
141                    from.
142                  </p>
143                </td>
144<td>
145                  <p>
146                    none
147                  </p>
148                </td>
149</tr>
150<tr>
151<td>
152                  <p>
153                    <code class="computeroutput"><span class="identifier">Attrib</span></code>
154                  </p>
155                </td>
156<td>
157                  <p>
158                    The type, <code class="computeroutput"><span class="identifier">Attrib</span></code>
159                    of the attribute to be used to generate output from.
160                  </p>
161                </td>
162<td>
163                  <p>
164                    none
165                  </p>
166                </td>
167</tr>
168<tr>
169<td>
170                  <p>
171                    <code class="computeroutput"><span class="identifier">Enable</span></code>
172                  </p>
173                </td>
174<td>
175                  <p>
176                    Helper template parameter usable to selectively enable or disable
177                    certain specializations of <code class="computeroutput"><span class="identifier">clear_value</span></code>
178                    utilizing SFINAE (i.e. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_if</span></code>
179                    or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">disable_if</span></code>).
180                  </p>
181                </td>
182<td>
183                  <p>
184                    <code class="computeroutput"><span class="keyword">void</span></code>
185                  </p>
186                </td>
187</tr>
188<tr>
189<td>
190                  <p>
191                    <code class="computeroutput"><span class="identifier">Context</span></code>
192                  </p>
193                </td>
194<td>
195                  <p>
196                    This is the type of the current generator execution context.
197                  </p>
198                </td>
199</tr>
200</tbody>
201</table></div>
202<div class="variablelist">
203<p class="title"><b>Notation</b></p>
204<dl class="variablelist">
205<dt><span class="term"><code class="computeroutput"><span class="identifier">Exposed</span></code></span></dt>
206<dd><p>
207                A type exposed as the native attribute of a component.
208              </p></dd>
209<dt><span class="term"><code class="computeroutput"><span class="identifier">Attrib</span></code></span></dt>
210<dd><p>
211                A type to be used to generate output from.
212              </p></dd>
213<dt><span class="term"><code class="computeroutput"><span class="identifier">attr</span></code></span></dt>
214<dd><p>
215                An attribute instance of type <code class="computeroutput"><span class="identifier">Attrib</span></code>.
216              </p></dd>
217<dt><span class="term"><code class="computeroutput"><span class="identifier">ctx</span></code></span></dt>
218<dd><p>
219                An instance of type <code class="computeroutput"><span class="identifier">Context</span></code>.
220              </p></dd>
221</dl>
222</div>
223<h6>
224<a name="spirit.advanced.customize.extract_from.h5"></a>
225          <span class="phrase"><a name="spirit.advanced.customize.extract_from.expression_semantics"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.expression_semantics">Expression
226          Semantics</a>
227        </h6>
228<div class="informaltable"><table class="table">
229<colgroup>
230<col>
231<col>
232</colgroup>
233<thead><tr>
234<th>
235                  <p>
236                    Expression
237                  </p>
238                </th>
239<th>
240                  <p>
241                    Semantics
242                  </p>
243                </th>
244</tr></thead>
245<tbody><tr>
246<td>
247                  <p>
248</p>
249<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">extract_from_attribute</span><span class="special">&lt;</span><span class="identifier">Exposed</span><span class="special">,</span> <span class="identifier">Attrib</span><span class="special">&gt;::</span><span class="identifier">call</span><span class="special">(</span><span class="identifier">attr</span><span class="special">,</span> <span class="identifier">ctx</span><span class="special">)</span></pre>
250<p>
251                  </p>
252                </td>
253<td>
254                  <p>
255                    Extract the value to generate output from <code class="computeroutput"><span class="identifier">attr</span></code>
256                    and return it to the caller.
257                  </p>
258                </td>
259</tr></tbody>
260</table></div>
261<h6>
262<a name="spirit.advanced.customize.extract_from.h6"></a>
263          <span class="phrase"><a name="spirit.advanced.customize.extract_from.predefined_specializations"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.predefined_specializations">Predefined
264          Specializations</a>
265        </h6>
266<p>
267          <a href="http://boost-spirit.com" target="_top">Spirit</a> predefines specializations
268          of this customization point for several types. The following table lists
269          those types together with the types exposed and the corresponding semantics:
270        </p>
271<div class="informaltable"><table class="table">
272<colgroup>
273<col>
274<col>
275</colgroup>
276<thead><tr>
277<th>
278                  <p>
279                    Template Parameters
280                  </p>
281                </th>
282<th>
283                  <p>
284                    Semantics
285                  </p>
286                </th>
287</tr></thead>
288<tbody>
289<tr>
290<td>
291                  <p>
292                    <code class="computeroutput"><span class="identifier">Attrib</span></code>
293                  </p>
294                </td>
295<td>
296                  <p>
297                    The exposed typedef <code class="computeroutput"><span class="identifier">type</span></code>
298                    is defined to <code class="computeroutput"><span class="identifier">Attrib</span>
299                    <span class="keyword">const</span><span class="special">&amp;</span></code>.
300                    The function <code class="computeroutput"><span class="identifier">call</span><span class="special">()</span></code> returns the argument by reference
301                    without change.
302                  </p>
303                </td>
304</tr>
305<tr>
306<td>
307                  <p>
308                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">Attrib</span><span class="special">&gt;</span></code>
309                  </p>
310                </td>
311<td>
312                  <p>
313                    The exposed typedef <code class="computeroutput"><span class="identifier">type</span></code>
314                    is defined to <code class="computeroutput"><span class="identifier">Attrib</span>
315                    <span class="keyword">const</span><span class="special">&amp;</span></code>.
316                    The function <code class="computeroutput"><span class="identifier">call</span><span class="special">()</span></code> returns the value held by the
317                    <code class="computeroutput"><span class="identifier">optional</span><span class="special">&lt;&gt;</span></code>
318                    argument by reference without change.
319                  </p>
320                </td>
321</tr>
322<tr>
323<td>
324                  <p>
325                    <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">reference_wrapper</span><span class="special">&lt;</span><span class="identifier">Attrib</span><span class="special">&gt;</span></code>
326                  </p>
327                </td>
328<td>
329                  <p>
330                    The exposed typedef <code class="computeroutput"><span class="identifier">type</span></code>
331                    is defined to <code class="computeroutput"><span class="identifier">Attrib</span>
332                    <span class="keyword">const</span><span class="special">&amp;</span></code>.
333                    The function <code class="computeroutput"><span class="identifier">call</span><span class="special">()</span></code> returns the value held by the
334                    <code class="computeroutput"><span class="identifier">reference_wrapper</span><span class="special">&lt;&gt;</span></code> argument by reference
335                    without change.
336                  </p>
337                </td>
338</tr>
339<tr>
340<td>
341                  <p>
342                    <code class="computeroutput"><span class="identifier">unused_type</span></code>
343                  </p>
344                </td>
345<td>
346                  <p>
347                    The exposed typedef <code class="computeroutput"><span class="identifier">type</span></code>
348                    is defined to <code class="computeroutput"><span class="identifier">unused_type</span></code>.
349                    The function <code class="computeroutput"><span class="identifier">call</span><span class="special">()</span></code> returns an instance of <code class="computeroutput"><span class="identifier">unused_type</span></code>.
350                  </p>
351                </td>
352</tr>
353</tbody>
354</table></div>
355<h6>
356<a name="spirit.advanced.customize.extract_from.h7"></a>
357          <span class="phrase"><a name="spirit.advanced.customize.extract_from.when_to_implement"></a></span><a class="link" href="extract_from.html#spirit.advanced.customize.extract_from.when_to_implement">When
358          to implement</a>
359        </h6>
360<p>
361          The customization point <code class="computeroutput"><span class="identifier">extract_from_attribute</span></code>
362          needs to be implemented for a specific type whenever the default implementation
363          as shown above is not applicable. Examples for this could be that the type
364          to be extracted is different from <code class="computeroutput"><span class="identifier">Attrib</span></code>
365          and is not copy constructible.
366        </p>
367</div>
368<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
369<td align="left"></td>
370<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
371        Distributed under the Boost Software License, Version 1.0. (See accompanying
372        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>)
373      </p>
374</div></td>
375</tr></table>
376<hr>
377<div class="spirit-nav">
378<a accesskey="p" href="clear_value.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../customize.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="extract_from_container.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
379</div>
380</body>
381</html>
382