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"><</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">></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"><</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">></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"><</span><span class="identifier">unspecified</span><span class="special">></span> <span class="identifier">type</span><span class="special">;</span> 98 99 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">></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">&</span> <span class="identifier">attr</span><span class="special">,</span> <span class="identifier">Context</span><span class="special">&</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"><</span><span class="identifier">Exposed</span><span class="special">,</span> <span class="identifier">Attrib</span><span class="special">>::</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">&</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"><</span><span class="identifier">Attrib</span><span class="special">></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">&</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"><></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"><</span><span class="identifier">Attrib</span><span class="special">></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">&</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"><></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