1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Real Number Parsers (float_, double_, etc.)</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="../numeric.html" title="Numeric Parsers"> 9<link rel="prev" href="int.html" title="Signed Integer Parsers (int_, etc.)"> 10<link rel="next" href="boolean.html" title="Boolean Parser (bool_)"> 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="int.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../numeric.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="boolean.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h5 class="title"> 27<a name="spirit.qi.reference.numeric.real"></a><a class="link" href="real.html" title="Real Number Parsers (float_, double_, etc.)">Real Number Parsers 28 (<code class="computeroutput"><span class="identifier">float_</span></code>, <code class="computeroutput"><span class="identifier">double_</span></code>, etc.)</a> 29</h5></div></div></div> 30<h6> 31<a name="spirit.qi.reference.numeric.real.h0"></a> 32 <span class="phrase"><a name="spirit.qi.reference.numeric.real.description"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.description">Description</a> 33 </h6> 34<p> 35 The <code class="computeroutput"><span class="identifier">real_parser</span></code> can parse 36 real numbers of arbitrary length and size limited by its template parameter, 37 <code class="computeroutput"><span class="identifier">T</span></code>. The numeric base type 38 <code class="computeroutput"><span class="identifier">T</span></code> can be a user defined 39 numeric type such as fixed_point (fixed point reals) and bignum (unlimited 40 precision numbers) as long as the type follows certain expression requirements 41 (documented below). 42 </p> 43<h6> 44<a name="spirit.qi.reference.numeric.real.h1"></a> 45 <span class="phrase"><a name="spirit.qi.reference.numeric.real.header"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.header">Header</a> 46 </h6> 47<pre class="programlisting"><span class="comment">// forwards to <boost/spirit/home/qi/numeric/real.hpp></span> 48<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">qi_real</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 49</pre> 50<p> 51 Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>. 52 </p> 53<h6> 54<a name="spirit.qi.reference.numeric.real.h2"></a> 55 <span class="phrase"><a name="spirit.qi.reference.numeric.real.namespace"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.namespace">Namespace</a> 56 </h6> 57<div class="informaltable"><table class="table"> 58<colgroup><col></colgroup> 59<thead><tr><th> 60 <p> 61 Name 62 </p> 63 </th></tr></thead> 64<tbody> 65<tr><td> 66 <p> 67 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">lit</span> <span class="comment">// alias: 68 boost::spirit::qi::lit</span></code> 69 </p> 70 </td></tr> 71<tr><td> 72 <p> 73 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">float_</span> <span class="comment">// 74 alias: boost::spirit::qi::float_</span></code> 75 </p> 76 </td></tr> 77<tr><td> 78 <p> 79 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">double_</span> <span class="comment">// 80 alias: boost::spirit::qi::double_</span></code> 81 </p> 82 </td></tr> 83<tr><td> 84 <p> 85 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">long_double</span> <span class="comment">// 86 alias: boost::spirit::qi::long_double</span></code> 87 </p> 88 </td></tr> 89</tbody> 90</table></div> 91<div class="note"><table border="0" summary="Note"> 92<tr> 93<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td> 94<th align="left">Note</th> 95</tr> 96<tr><td align="left" valign="top"><p> 97 <code class="computeroutput"><span class="identifier">lit</span></code> is reused by the 98 <a class="link" href="../char/char.html" title="Character Parser (char_, lit)">Character Parsers</a>, 99 and the Numeric Parsers. In general, a char parser is created when 100 you pass in a character, and a numeric parser is created when you use 101 a numeric literal. 102 </p></td></tr> 103</table></div> 104<h6> 105<a name="spirit.qi.reference.numeric.real.h3"></a> 106 <span class="phrase"><a name="spirit.qi.reference.numeric.real.synopsis"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.synopsis">Synopsis</a> 107 </h6> 108<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">RealPolicies</span><span class="special">></span> 109<span class="keyword">struct</span> <span class="identifier">real_parser</span><span class="special">;</span> 110</pre> 111<h6> 112<a name="spirit.qi.reference.numeric.real.h4"></a> 113 <span class="phrase"><a name="spirit.qi.reference.numeric.real.template_parameters"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.template_parameters">Template 114 parameters</a> 115 </h6> 116<div class="informaltable"><table class="table"> 117<colgroup> 118<col> 119<col> 120<col> 121</colgroup> 122<thead><tr> 123<th> 124 <p> 125 Parameter 126 </p> 127 </th> 128<th> 129 <p> 130 Description 131 </p> 132 </th> 133<th> 134 <p> 135 Default 136 </p> 137 </th> 138</tr></thead> 139<tbody> 140<tr> 141<td> 142 <p> 143 <code class="computeroutput"><span class="identifier">T</span></code> 144 </p> 145 </td> 146<td> 147 <p> 148 The numeric base type of the numeric parser. 149 </p> 150 </td> 151<td> 152 <p> 153 none 154 </p> 155 </td> 156</tr> 157<tr> 158<td> 159 <p> 160 <code class="computeroutput"><span class="identifier">RealPolicies</span></code> 161 </p> 162 </td> 163<td> 164 <p> 165 Policies control the parser's behavior. 166 </p> 167 </td> 168<td> 169 <p> 170 <code class="computeroutput"><span class="identifier">real_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> 171 </p> 172 </td> 173</tr> 174</tbody> 175</table></div> 176<h6> 177<a name="spirit.qi.reference.numeric.real.h5"></a> 178 <span class="phrase"><a name="spirit.qi.reference.numeric.real.model_of"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.model_of">Model 179 of</a> 180 </h6> 181<div class="blockquote"><blockquote class="blockquote"><p> 182 <a class="link" href="../parser_concepts/primitiveparser.html" title="PrimitiveParser"><code class="computeroutput"><span class="identifier">PrimitiveParser</span></code></a> 183 </p></blockquote></div> 184<div class="variablelist"> 185<p class="title"><b>Notation</b></p> 186<dl class="variablelist"> 187<dt><span class="term"><code class="computeroutput"><span class="identifier">n</span></code></span></dt> 188<dd><p> 189 An object of <code class="computeroutput"><span class="identifier">T</span></code>, 190 the numeric base type. 191 </p></dd> 192<dt><span class="term"><code class="computeroutput"><span class="identifier">num</span></code></span></dt> 193<dd><p> 194 Numeric literal, any real value, or a <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy 195 Argument</a> that evaluates to a real value. 196 </p></dd> 197<dt><span class="term"><code class="computeroutput"><span class="identifier">RP</span></code></span></dt> 198<dd><p> 199 A <code class="computeroutput"><span class="identifier">RealPolicies</span></code> 200 (type). 201 </p></dd> 202<dt><span class="term"><code class="computeroutput"><span class="identifier">exp</span></code></span></dt> 203<dd><p> 204 A <code class="computeroutput"><span class="keyword">int</span></code> exponent. 205 </p></dd> 206<dt><span class="term"><code class="computeroutput"><span class="identifier">b</span></code></span></dt> 207<dd><p> 208 A <code class="computeroutput"><span class="keyword">bool</span></code> flag. 209 </p></dd> 210<dt><span class="term"><code class="computeroutput"><span class="identifier">f</span></code>, <code class="computeroutput"><span class="identifier">l</span></code></span></dt> 211<dd><p> 212 <a href="http://en.cppreference.com/w/cpp/named_req/ForwardIterator" target="_top"><code class="computeroutput"><span class="identifier">ForwardIterator</span></code></a>. first/last 213 iterator pair. 214 </p></dd> 215</dl> 216</div> 217<h6> 218<a name="spirit.qi.reference.numeric.real.h6"></a> 219 <span class="phrase"><a name="spirit.qi.reference.numeric.real.expression_semantics"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.expression_semantics">Expression 220 Semantics</a> 221 </h6> 222<p> 223 Semantics of an expression is defined only where it differs from, or 224 is not defined in <a class="link" href="../parser_concepts/primitiveparser.html" title="PrimitiveParser"><code class="computeroutput"><span class="identifier">PrimitiveParser</span></code></a>. 225 </p> 226<div class="informaltable"><table class="table"> 227<colgroup> 228<col> 229<col> 230</colgroup> 231<thead><tr> 232<th> 233 <p> 234 Expression 235 </p> 236 </th> 237<th> 238 <p> 239 Semantics 240 </p> 241 </th> 242</tr></thead> 243<tbody> 244<tr> 245<td> 246 <p> 247</p> 248<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">float_</span> 249<span class="identifier">double_</span> 250<span class="identifier">long_double</span> 251</pre> 252<p> 253 </p> 254 </td> 255<td> 256 <p> 257 Parse a real using the default policies (<code class="computeroutput"><span class="identifier">real_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>). 258 </p> 259 </td> 260</tr> 261<tr> 262<td> 263 <p> 264</p> 265<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">lit</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 266<span class="identifier">float_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 267<span class="identifier">double_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 268<span class="identifier">long_double</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 269</pre> 270<p> 271 </p> 272 </td> 273<td> 274 <p> 275 Match the literal <code class="computeroutput"><span class="identifier">num</span></code> 276 using the default policies (<code class="computeroutput"><span class="identifier">real_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>). The parser will fail 277 if the parsed value is not equal to the specified value. 278 </p> 279 </td> 280</tr> 281<tr> 282<td> 283 <p> 284</p> 285<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">real_parser</span><span class="special"><</span> 286 <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span> 287<span class="special">>()</span> 288</pre> 289<p> 290 </p> 291 </td> 292<td> 293 <p> 294 Parse a real of type <code class="computeroutput"><span class="identifier">T</span></code> 295 using <code class="computeroutput"><span class="identifier">RealPolicies</span></code>. 296 </p> 297 </td> 298</tr> 299<tr> 300<td> 301 <p> 302</p> 303<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">real_parser</span><span class="special"><</span> 304 <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span> 305<span class="special">>()(</span><span class="identifier">num</span><span class="special">)</span> 306</pre> 307<p> 308 </p> 309 </td> 310<td> 311 <p> 312 Match the literal <code class="computeroutput"><span class="identifier">num</span></code> 313 of type <code class="computeroutput"><span class="identifier">T</span></code> using 314 <code class="computeroutput"><span class="identifier">RealPolicies</span></code>. 315 The parser will fail if the parsed value is not equal to the 316 specified value. 317 </p> 318 </td> 319</tr> 320</tbody> 321</table></div> 322<h6> 323<a name="spirit.qi.reference.numeric.real.h7"></a> 324 <span class="phrase"><a name="spirit.qi.reference.numeric.real.attributes"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.attributes">Attributes</a> 325 </h6> 326<div class="informaltable"><table class="table"> 327<colgroup> 328<col> 329<col> 330</colgroup> 331<thead><tr> 332<th> 333 <p> 334 Expression 335 </p> 336 </th> 337<th> 338 <p> 339 Attribute 340 </p> 341 </th> 342</tr></thead> 343<tbody> 344<tr> 345<td> 346 <p> 347</p> 348<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">lit</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 349</pre> 350<p> 351 </p> 352 </td> 353<td> 354 <p> 355 <code class="computeroutput"><span class="identifier">unused</span></code> 356 </p> 357 </td> 358</tr> 359<tr> 360<td> 361 <p> 362</p> 363<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">float_</span> 364<span class="identifier">float_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 365</pre> 366<p> 367 </p> 368 </td> 369<td> 370 <p> 371 <code class="computeroutput"><span class="keyword">float</span></code> 372 </p> 373 </td> 374</tr> 375<tr> 376<td> 377 <p> 378</p> 379<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">double_</span> 380<span class="identifier">double_</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 381</pre> 382<p> 383 </p> 384 </td> 385<td> 386 <p> 387 <code class="computeroutput"><span class="keyword">double</span></code> 388 </p> 389 </td> 390</tr> 391<tr> 392<td> 393 <p> 394</p> 395<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">long_double</span> 396<span class="identifier">long_double</span><span class="special">(</span><span class="identifier">num</span><span class="special">)</span> 397</pre> 398<p> 399 </p> 400 </td> 401<td> 402 <p> 403 <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code> 404 </p> 405 </td> 406</tr> 407<tr> 408<td> 409 <p> 410</p> 411<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">real_parser</span><span class="special"><</span> 412 <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span> 413<span class="special">>()</span> 414<span class="identifier">real_parser</span><span class="special"><</span> 415 <span class="identifier">T</span><span class="special">,</span> <span class="identifier">RealPolicies</span> 416<span class="special">>()(</span><span class="identifier">num</span><span class="special">)</span> 417</pre> 418<p> 419 </p> 420 </td> 421<td> 422 <p> 423 <code class="computeroutput"><span class="identifier">T</span></code> 424 </p> 425 </td> 426</tr> 427</tbody> 428</table></div> 429<h6> 430<a name="spirit.qi.reference.numeric.real.h8"></a> 431 <span class="phrase"><a name="spirit.qi.reference.numeric.real.complexity"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.complexity">Complexity</a> 432 </h6> 433<div class="blockquote"><blockquote class="blockquote"><p> 434 O(N), where N is the number of characters (including the digits, exponent, 435 sign, etc.) being parsed. 436 </p></blockquote></div> 437<h6> 438<a name="spirit.qi.reference.numeric.real.h9"></a> 439 <span class="phrase"><a name="spirit.qi.reference.numeric.real.minimum_expression_requirements_for__code__phrase_role__identifier__t__phrase___code_"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.minimum_expression_requirements_for__code__phrase_role__identifier__t__phrase___code_">Minimum 440 Expression Requirements for <code class="computeroutput"><span class="identifier">T</span></code></a> 441 </h6> 442<p> 443 The numeric base type, <code class="computeroutput"><span class="identifier">T</span></code>, 444 the minimum expression requirements listed below must be valid. Take 445 note that additional requirements may be imposed by custom policies. 446 </p> 447<div class="informaltable"><table class="table"> 448<colgroup> 449<col> 450<col> 451</colgroup> 452<thead><tr> 453<th> 454 <p> 455 Expression 456 </p> 457 </th> 458<th> 459 <p> 460 Semantics 461 </p> 462 </th> 463</tr></thead> 464<tbody> 465<tr> 466<td> 467 <p> 468 <code class="computeroutput"><span class="identifier">T</span><span class="special">()</span></code> 469 </p> 470 </td> 471<td> 472 <p> 473 Default construct. 474 </p> 475 </td> 476</tr> 477<tr> 478<td> 479 <p> 480 <code class="computeroutput"><span class="identifier">T</span><span class="special">(</span><span class="number">0</span><span class="special">)</span></code> 481 </p> 482 </td> 483<td> 484 <p> 485 Construct from an <code class="computeroutput"><span class="keyword">int</span></code>. 486 </p> 487 </td> 488</tr> 489<tr> 490<td> 491 <p> 492 <code class="computeroutput"><span class="identifier">n</span> <span class="special">+</span> 493 <span class="identifier">n</span></code> 494 </p> 495 </td> 496<td> 497 <p> 498 Addition. 499 </p> 500 </td> 501</tr> 502<tr> 503<td> 504 <p> 505 <code class="computeroutput"><span class="identifier">n</span> <span class="special">-</span> 506 <span class="identifier">n</span></code> 507 </p> 508 </td> 509<td> 510 <p> 511 Subtraction. 512 </p> 513 </td> 514</tr> 515<tr> 516<td> 517 <p> 518 <code class="computeroutput"><span class="identifier">n</span> <span class="special">*</span> 519 <span class="identifier">n</span></code> 520 </p> 521 </td> 522<td> 523 <p> 524 Multiplication. 525 </p> 526 </td> 527</tr> 528<tr> 529<td> 530 <p> 531 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_bounded</span></code> 532 </p> 533 </td> 534<td> 535 <p> 536 <code class="computeroutput"><span class="keyword">true</span></code> or <code class="computeroutput"><span class="keyword">false</span></code> if <code class="computeroutput"><span class="identifier">T</span></code> 537 bounded. 538 </p> 539 </td> 540</tr> 541<tr> 542<td> 543 <p> 544 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">digits</span></code> 545 </p> 546 </td> 547<td> 548 <p> 549 Maximum Digits for <code class="computeroutput"><span class="identifier">T</span></code>, 550 radix digits. Required only if <code class="computeroutput"><span class="identifier">T</span></code> 551 is bounded. 552 </p> 553 </td> 554</tr> 555<tr> 556<td> 557 <p> 558 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">digits10</span></code> 559 </p> 560 </td> 561<td> 562 <p> 563 Maximum Digits for <code class="computeroutput"><span class="identifier">T</span></code>, 564 base 10. Required only if <code class="computeroutput"><span class="identifier">T</span></code> 565 is bounded. 566 </p> 567 </td> 568</tr> 569<tr> 570<td> 571 <p> 572 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">max</span><span class="special">()</span></code> 573 </p> 574 </td> 575<td> 576 <p> 577 Maximum value for <code class="computeroutput"><span class="identifier">T</span></code>. 578 Required only if <code class="computeroutput"><span class="identifier">T</span></code> 579 is bounded. 580 </p> 581 </td> 582</tr> 583<tr> 584<td> 585 <p> 586 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">min</span><span class="special">()</span></code> 587 </p> 588 </td> 589<td> 590 <p> 591 Minimum value for <code class="computeroutput"><span class="identifier">T</span></code>. 592 Required only if <code class="computeroutput"><span class="identifier">T</span></code> 593 is bounded. 594 </p> 595 </td> 596</tr> 597<tr> 598<td> 599 <p> 600 <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><span class="special">::</span><span class="identifier">scale</span><span class="special">(</span><span class="identifier">exp</span><span class="special">,</span> 601 <span class="identifier">n</span><span class="special">)</span></code> 602 </p> 603 </td> 604<td> 605 <p> 606 Multiply <code class="computeroutput"><span class="identifier">n</span></code> 607 by <code class="computeroutput"><span class="number">10</span><span class="special">^</span><span class="identifier">exp</span></code>. Default implementation 608 is provided for <code class="computeroutput"><span class="keyword">float</span></code>, 609 <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>. 610 </p> 611 </td> 612</tr> 613<tr> 614<td> 615 <p> 616 <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><span class="special">::</span><span class="identifier">negate</span><span class="special">(</span><span class="identifier">b</span><span class="special">,</span> 617 <span class="identifier">n</span><span class="special">)</span></code> 618 </p> 619 </td> 620<td> 621 <p> 622 Negate <code class="computeroutput"><span class="identifier">n</span></code> if 623 <code class="computeroutput"><span class="identifier">b</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>. Default implementation 624 is provided for <code class="computeroutput"><span class="keyword">float</span></code>, 625 <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>. 626 </p> 627 </td> 628</tr> 629</tbody> 630</table></div> 631<div class="note"><table border="0" summary="Note"> 632<tr> 633<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td> 634<th align="left">Note</th> 635</tr> 636<tr><td align="left" valign="top"><p> 637 The additional spirit real number traits above are provided to allow 638 custom implementations to implement efficient real number parsers. 639 For example, for certain custom real numbers, scaling to a base 10 640 exponent is a very cheap operation. 641 </p></td></tr> 642</table></div> 643<h6> 644<a name="spirit.qi.reference.numeric.real.h10"></a> 645 <span class="phrase"><a name="spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code_"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code_"><code class="computeroutput"><span class="identifier">RealPolicies</span></code></a> 646 </h6> 647<p> 648 The <code class="computeroutput"><span class="identifier">RealPolicies</span></code> template 649 parameter is a class that groups all the policies that control the parser's 650 behavior. Policies control the real number parsers' behavior. 651 </p> 652<p> 653 The default is <code class="computeroutput"><span class="identifier">real_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>. The default is provided to take 654 care of the most common case (there are many ways to represent, and hence 655 parse, real numbers). In most cases, the default policies are sufficient 656 and can be used straight out of the box. They are designed to parse C/C++ 657 style floating point numbers of the form <code class="computeroutput"><span class="identifier">nnn</span><span class="special">.</span><span class="identifier">fff</span><span class="special">.</span><span class="identifier">Eeee</span></code> 658 where <code class="computeroutput"><span class="identifier">nnn</span></code> is the whole 659 number part, <code class="computeroutput"><span class="identifier">fff</span></code> is the 660 fractional part, <code class="computeroutput"><span class="identifier">E</span></code> is 661 <code class="computeroutput"><span class="char">'e'</span></code> or <code class="computeroutput"><span class="char">'E'</span></code> 662 and <code class="computeroutput"><span class="identifier">eee</span></code> is the exponent 663 optionally preceded by <code class="computeroutput"><span class="char">'-'</span></code> 664 or <code class="computeroutput"><span class="char">'+'</span></code> with the additional 665 detection of NaN and Inf as mandated by the C99 Standard and proposed 666 for inclusion into the C++0x Standard: nan, nan(...), inf and infinity 667 (the matching is case-insensitive). This corresponds to the following 668 grammar: 669 </p> 670<pre class="programlisting"><span class="identifier">sign</span> 671 <span class="special">=</span> <span class="identifier">lit</span><span class="special">(</span><span class="char">'+'</span><span class="special">)</span> <span class="special">|</span> <span class="char">'-'</span> 672 <span class="special">;</span> 673 674<span class="identifier">nan</span> 675 <span class="special">=</span> <span class="identifier">no_case</span><span class="special">[</span><span class="string">"nan"</span><span class="special">]</span> 676 <span class="special">>></span> <span class="special">-(</span><span class="char">'('</span> <span class="special">>></span> <span class="special">*(</span><span class="identifier">char_</span> <span class="special">-</span> <span class="char">')'</span><span class="special">)</span> <span class="special">>></span> <span class="char">')'</span><span class="special">)</span> 677 <span class="special">;</span> 678 679<span class="identifier">inf</span> 680 <span class="special">=</span> <span class="identifier">no_case</span><span class="special">[</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"inf"</span><span class="special">)</span> <span class="special">>></span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="string">"inity"</span><span class="special">)]</span> 681 <span class="special">;</span> 682 683<span class="identifier">floating_literal</span> 684 <span class="special">=</span> <span class="special">-</span><span class="identifier">sign</span> <span class="special">>></span> 685 <span class="special">(</span> <span class="identifier">nan</span> 686 <span class="special">|</span> <span class="identifier">inf</span> 687 <span class="special">|</span> <span class="identifier">fractional_constant</span> <span class="special">>></span> <span class="special">-</span><span class="identifier">exponent_part</span> 688 <span class="special">|</span> <span class="special">+</span><span class="identifier">digit</span> <span class="special">>></span> <span class="identifier">exponent_part</span> 689 <span class="special">)</span> 690 <span class="special">;</span> 691 692<span class="identifier">fractional_constant</span> 693 <span class="special">=</span> <span class="special">*</span><span class="identifier">digit</span> <span class="special">>></span> <span class="char">'.'</span> <span class="special">>></span> <span class="special">+</span><span class="identifier">digit</span> 694 <span class="special">|</span> <span class="special">+</span><span class="identifier">digit</span> <span class="special">>></span> <span class="special">-</span><span class="identifier">lit</span><span class="special">(</span><span class="char">'.'</span><span class="special">)</span> 695 <span class="special">;</span> 696 697<span class="identifier">exponent_part</span> 698 <span class="special">=</span> <span class="special">(</span><span class="identifier">lit</span><span class="special">(</span><span class="char">'e'</span><span class="special">)</span> <span class="special">|</span> <span class="char">'E'</span><span class="special">)</span> <span class="special">>></span> <span class="special">-</span><span class="identifier">sign</span> <span class="special">>></span> <span class="special">+</span><span class="identifier">digit</span> 699 <span class="special">;</span> 700</pre> 701<p> 702 There are four <code class="computeroutput"><span class="identifier">RealPolicies</span></code> 703 predefined for immediate use: 704 </p> 705<div class="table"> 706<a name="spirit.qi.reference.numeric.real.predefined_policies"></a><p class="title"><b>Table 4. Predefined Policies</b></p> 707<div class="table-contents"><table class="table" summary="Predefined Policies"> 708<colgroup> 709<col> 710<col> 711</colgroup> 712<thead><tr> 713<th> 714 <p> 715 Policies 716 </p> 717 </th> 718<th> 719 <p> 720 Description 721 </p> 722 </th> 723</tr></thead> 724<tbody> 725<tr> 726<td> 727 <p> 728 <code class="computeroutput"><span class="identifier">ureal_policies</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code> 729 </p> 730 </td> 731<td> 732 <p> 733 Without sign. 734 </p> 735 </td> 736</tr> 737<tr> 738<td> 739 <p> 740 <code class="computeroutput"><span class="identifier">real_policies</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code> 741 </p> 742 </td> 743<td> 744 <p> 745 With sign. 746 </p> 747 </td> 748</tr> 749<tr> 750<td> 751 <p> 752 <code class="computeroutput"><span class="identifier">strict_ureal_policies</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code> 753 </p> 754 </td> 755<td> 756 <p> 757 Without sign, dot required. 758 </p> 759 </td> 760</tr> 761<tr> 762<td> 763 <p> 764 <code class="computeroutput"><span class="identifier">strict_real_policies</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code> 765 </p> 766 </td> 767<td> 768 <p> 769 With sign, dot required. 770 </p> 771 </td> 772</tr> 773</tbody> 774</table></div> 775</div> 776<br class="table-break"><div class="note"><table border="0" summary="Note"> 777<tr> 778<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td> 779<th align="left">Note</th> 780</tr> 781<tr><td align="left" valign="top"><p> 782 Integers are considered a subset of real numbers, so for instance, 783 <code class="computeroutput"><span class="identifier">double_</span></code> recognizes 784 integer numbers (without a dot) just as well. To avoid this ambiguity, 785 <code class="computeroutput"><span class="identifier">strict_ureal_policies</span></code> 786 and <code class="computeroutput"><span class="identifier">strict_real_policies</span></code> 787 require a dot to be present for a number to be considered a successful 788 match. 789 </p></td></tr> 790</table></div> 791<h6> 792<a name="spirit.qi.reference.numeric.real.h11"></a> 793 <span class="phrase"><a name="spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__expression_requirements"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__expression_requirements"><code class="computeroutput"><span class="identifier">RealPolicies</span></code> Expression Requirements</a> 794 </h6> 795<p> 796 For models of <code class="computeroutput"><span class="identifier">RealPolicies</span></code> 797 the following expressions must be valid: 798 </p> 799<div class="informaltable"><table class="table"> 800<colgroup> 801<col> 802<col> 803</colgroup> 804<thead><tr> 805<th> 806 <p> 807 Expression 808 </p> 809 </th> 810<th> 811 <p> 812 Semantics 813 </p> 814 </th> 815</tr></thead> 816<tbody> 817<tr> 818<td> 819 <p> 820 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">allow_leading_dot</span></code> 821 </p> 822 </td> 823<td> 824 <p> 825 Allow leading dot. 826 </p> 827 </td> 828</tr> 829<tr> 830<td> 831 <p> 832 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">allow_trailing_dot</span></code> 833 </p> 834 </td> 835<td> 836 <p> 837 Allow trailing dot. 838 </p> 839 </td> 840</tr> 841<tr> 842<td> 843 <p> 844 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">expect_dot</span></code> 845 </p> 846 </td> 847<td> 848 <p> 849 Require a dot. 850 </p> 851 </td> 852</tr> 853<tr> 854<td> 855 <p> 856 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_sign</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 857 <span class="identifier">l</span><span class="special">)</span></code> 858 </p> 859 </td> 860<td> 861 <p> 862 Parse the prefix sign (e.g. '-'). Return <code class="computeroutput"><span class="keyword">true</span></code> 863 if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>. 864 </p> 865 </td> 866</tr> 867<tr> 868<td> 869 <p> 870 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_n</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 871 <span class="identifier">l</span><span class="special">,</span> 872 <span class="identifier">n</span><span class="special">)</span></code> 873 </p> 874 </td> 875<td> 876 <p> 877 Parse the integer at the left of the decimal point. Return 878 <code class="computeroutput"><span class="keyword">true</span></code> if successful, 879 otherwise <code class="computeroutput"><span class="keyword">false</span></code>. 880 If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>. 881 </p> 882 </td> 883</tr> 884<tr> 885<td> 886 <p> 887 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_dot</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 888 <span class="identifier">l</span><span class="special">)</span></code> 889 </p> 890 </td> 891<td> 892 <p> 893 Parse the decimal point. Return <code class="computeroutput"><span class="keyword">true</span></code> 894 if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>. 895 </p> 896 </td> 897</tr> 898<tr> 899<td> 900 <p> 901 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_frac_n</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 902 <span class="identifier">l</span><span class="special">,</span> 903 <span class="identifier">n</span><span class="special">,</span> 904 <span class="identifier">d</span><span class="special">)</span></code> 905 </p> 906 </td> 907<td> 908 <p> 909 Parse the fraction after the decimal point. Return <code class="computeroutput"><span class="keyword">true</span></code> if successful, otherwise 910 <code class="computeroutput"><span class="keyword">false</span></code>. If successful, 911 place the result into <code class="computeroutput"><span class="identifier">n</span></code> 912 and the number of digits into <code class="computeroutput"><span class="identifier">d</span></code> 913 </p> 914 </td> 915</tr> 916<tr> 917<td> 918 <p> 919 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_exp</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 920 <span class="identifier">l</span><span class="special">)</span></code> 921 </p> 922 </td> 923<td> 924 <p> 925 Parse the exponent prefix (e.g. 'e'). Return <code class="computeroutput"><span class="keyword">true</span></code> if successful, otherwise 926 <code class="computeroutput"><span class="keyword">false</span></code>. 927 </p> 928 </td> 929</tr> 930<tr> 931<td> 932 <p> 933 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_exp_n</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 934 <span class="identifier">l</span><span class="special">,</span> 935 <span class="identifier">n</span><span class="special">)</span></code> 936 </p> 937 </td> 938<td> 939 <p> 940 Parse the actual exponent. Return <code class="computeroutput"><span class="keyword">true</span></code> 941 if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>. 942 If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>. 943 </p> 944 </td> 945</tr> 946<tr> 947<td> 948 <p> 949 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_nan</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 950 <span class="identifier">l</span><span class="special">,</span> 951 <span class="identifier">n</span><span class="special">)</span></code> 952 </p> 953 </td> 954<td> 955 <p> 956 Parse a NaN. Return <code class="computeroutput"><span class="keyword">true</span></code> 957 if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>. 958 If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>. 959 </p> 960 </td> 961</tr> 962<tr> 963<td> 964 <p> 965 <code class="computeroutput"><span class="identifier">RP</span><span class="special">::</span><span class="identifier">parse_inf</span><span class="special">(</span><span class="identifier">f</span><span class="special">,</span> 966 <span class="identifier">l</span><span class="special">,</span> 967 <span class="identifier">n</span><span class="special">)</span></code> 968 </p> 969 </td> 970<td> 971 <p> 972 Parse an Inf. Return <code class="computeroutput"><span class="keyword">true</span></code> 973 if successful, otherwise <code class="computeroutput"><span class="keyword">false</span></code>. 974 If successful, place the result into <code class="computeroutput"><span class="identifier">n</span></code>. 975 </p> 976 </td> 977</tr> 978</tbody> 979</table></div> 980<p> 981 The <code class="computeroutput"><span class="identifier">parse_nan</span></code> and <code class="computeroutput"><span class="identifier">parse_inf</span></code> functions get called whenever 982 a number to parse does not start with a digit (after having successfully 983 parsed an optional sign). 984 </p> 985<p> 986 The functions should return true if a Nan or Inf has been found. In this 987 case the attribute <code class="computeroutput"><span class="identifier">n</span></code> 988 should be set to the matched value (NaN or Inf). The optional sign will 989 be automatically applied afterwards. 990 </p> 991<h6> 992<a name="spirit.qi.reference.numeric.real.h12"></a> 993 <span class="phrase"><a name="spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__specializations"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real._code__phrase_role__identifier__realpolicies__phrase___code__specializations"><code class="computeroutput"><span class="identifier">RealPolicies</span></code> Specializations</a> 994 </h6> 995<p> 996 The easiest way to implement a proper real parsing policy is to derive 997 a new type from the type <code class="computeroutput"><span class="identifier">real_policies</span></code> 998 while overriding the aspects of the parsing which need to be changed. 999 For example, here's the implementation of the predefined <code class="computeroutput"><span class="identifier">strict_real_policies</span></code>: 1000 </p> 1001<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 1002<span class="keyword">struct</span> <span class="identifier">strict_real_policies</span> <span class="special">:</span> <span class="identifier">real_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> 1003<span class="special">{</span> 1004 <span class="keyword">static</span> <span class="keyword">bool</span> <span class="keyword">const</span> <span class="identifier">expect_dot</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> 1005<span class="special">};</span> 1006</pre> 1007<h6> 1008<a name="spirit.qi.reference.numeric.real.h13"></a> 1009 <span class="phrase"><a name="spirit.qi.reference.numeric.real.example"></a></span><a class="link" href="real.html#spirit.qi.reference.numeric.real.example">Example</a> 1010 </h6> 1011<div class="note"><table border="0" summary="Note"> 1012<tr> 1013<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td> 1014<th align="left">Note</th> 1015</tr> 1016<tr><td align="left" valign="top"><p> 1017 The test harness for the example(s) below is presented in the <a class="link" href="../basics.html#spirit.qi.reference.basics.examples">Basics Examples</a> 1018 section. 1019 </p></td></tr> 1020</table></div> 1021<p> 1022 Some using declarations: 1023 </p> 1024<p> 1025</p> 1026<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">::</span><span class="identifier">val</span><span class="special">;</span> 1027<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">qi</span><span class="special">::</span><span class="identifier">double_</span><span class="special">;</span> 1028<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">qi</span><span class="special">::</span><span class="identifier">real_parser</span><span class="special">;</span> 1029<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">qi</span><span class="special">::</span><span class="identifier">lit</span><span class="special">;</span> 1030</pre> 1031<p> 1032 </p> 1033<p> 1034 Basic real number parsing: 1035 </p> 1036<p> 1037</p> 1038<pre class="programlisting"><span class="comment">// double</span> 1039<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">);</span> 1040<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">);</span> 1041<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(</span><span class="number">12345e6</span><span class="special">));</span> 1042<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">));</span> 1043<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="number">12345e6</span><span class="special">)));</span> 1044<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">double_</span><span class="special">(</span><span class="identifier">val</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">)));</span> 1045 1046<span class="comment">// literals</span> 1047<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(</span><span class="number">12345e6</span><span class="special">));</span> 1048<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">));</span> 1049<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"+12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">val</span><span class="special">(</span><span class="number">12345e6</span><span class="special">)));</span> 1050<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"-12345e6"</span><span class="special">,</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">val</span><span class="special">(-</span><span class="number">123456e6</span><span class="special">)));</span> 1051</pre> 1052<p> 1053 </p> 1054<p> 1055 A custom real number policy: 1056 </p> 1057<p> 1058</p> 1059<pre class="programlisting"><span class="comment">///////////////////////////////////////////////////////////////////////////////</span> 1060<span class="comment">// These policies can be used to parse thousand separated</span> 1061<span class="comment">// numbers with at most 2 decimal digits after the decimal</span> 1062<span class="comment">// point. e.g. 123,456,789.01</span> 1063<span class="comment">///////////////////////////////////////////////////////////////////////////////</span> 1064<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 1065<span class="keyword">struct</span> <span class="identifier">ts_real_policies</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">qi</span><span class="special">::</span><span class="identifier">ureal_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> 1066<span class="special">{</span> 1067 <span class="comment">// 2 decimal places Max</span> 1068 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attribute</span><span class="special">></span> 1069 <span class="keyword">static</span> <span class="keyword">bool</span> 1070 <span class="identifier">parse_frac_n</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Attribute</span><span class="special">&</span> <span class="identifier">attr</span><span class="special">,</span> 1071 <span class="keyword">int</span><span class="special">&</span> <span class="identifier">frac_digits</span><span class="special">)</span> 1072 <span class="special">{</span> 1073 <span class="identifier">Iterator</span> <span class="identifier">savef</span> <span class="special">=</span> <span class="identifier">first</span><span class="special">;</span> 1074 <span class="keyword">bool</span> <span class="identifier">r</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">qi</span><span class="special">::</span> 1075 <span class="identifier">extract_uint</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="keyword">true</span><span class="special">>::</span><span class="identifier">call</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">attr</span><span class="special">);</span> 1076 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">r</span><span class="special">)</span> <span class="special">{</span> 1077 <span class="comment">// Optimization note: don't compute frac_digits if T is</span> 1078 <span class="comment">// an unused_type. This should be optimized away by the compiler.</span> 1079 <span class="keyword">if</span> <span class="special">(!</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">T</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">unused_type</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span> 1080 <span class="identifier">frac_digits</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">savef</span><span class="special">,</span> <span class="identifier">first</span><span class="special">));</span> 1081 <span class="special">}</span> 1082 <span class="keyword">return</span> <span class="identifier">r</span><span class="special">;</span> 1083 <span class="special">}</span> 1084 1085 <span class="comment">// No exponent</span> 1086 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span> 1087 <span class="keyword">static</span> <span class="keyword">bool</span> 1088 <span class="identifier">parse_exp</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&)</span> 1089 <span class="special">{</span> 1090 <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span> 1091 <span class="special">}</span> 1092 1093 <span class="comment">// No exponent</span> 1094 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Attribute</span><span class="special">></span> 1095 <span class="keyword">static</span> <span class="keyword">bool</span> 1096 <span class="identifier">parse_exp_n</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">Attribute</span><span class="special">&)</span> 1097 <span class="special">{</span> 1098 <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span> 1099 <span class="special">}</span> 1100 1101 <span class="comment">// Thousands separated numbers</span> 1102 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Accumulator</span><span class="special">></span> 1103 <span class="keyword">static</span> <span class="keyword">bool</span> 1104 <span class="identifier">parse_n</span><span class="special">(</span><span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Accumulator</span><span class="special">&</span> <span class="identifier">result</span><span class="special">)</span> 1105 <span class="special">{</span> 1106 <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">qi</span><span class="special">::</span><span class="identifier">uint_parser</span><span class="special">;</span> 1107 <span class="keyword">namespace</span> <span class="identifier">qi</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">qi</span><span class="special">;</span> 1108 1109 <span class="identifier">uint_parser</span><span class="special"><</span><span class="keyword">unsigned</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">uint3</span><span class="special">;</span> 1110 <span class="identifier">uint_parser</span><span class="special"><</span><span class="keyword">unsigned</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">3</span><span class="special">></span> <span class="identifier">uint3_3</span><span class="special">;</span> 1111 1112 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">uint3</span><span class="special">,</span> <span class="identifier">result</span><span class="special">))</span> 1113 <span class="special">{</span> 1114 <span class="identifier">Accumulator</span> <span class="identifier">n</span><span class="special">;</span> 1115 <span class="identifier">Iterator</span> <span class="identifier">iter</span> <span class="special">=</span> <span class="identifier">first</span><span class="special">;</span> 1116 1117 <span class="keyword">while</span> <span class="special">(</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">iter</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="char">','</span><span class="special">)</span> <span class="special">&&</span> <span class="identifier">qi</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">iter</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">uint3_3</span><span class="special">,</span> <span class="identifier">n</span><span class="special">))</span> 1118 <span class="special">{</span> 1119 <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">result</span> <span class="special">*</span> <span class="number">1000</span> <span class="special">+</span> <span class="identifier">n</span><span class="special">;</span> 1120 <span class="identifier">first</span> <span class="special">=</span> <span class="identifier">iter</span><span class="special">;</span> 1121 <span class="special">}</span> 1122 1123 <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> 1124 <span class="special">}</span> 1125 <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span> 1126 <span class="special">}</span> 1127<span class="special">};</span> 1128</pre> 1129<p> 1130 </p> 1131<p> 1132 And its use: 1133 </p> 1134<p> 1135</p> 1136<pre class="programlisting"><span class="identifier">real_parser</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">ts_real_policies</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> <span class="identifier">ts_real</span><span class="special">;</span> 1137<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"123,456,789.01"</span><span class="special">,</span> <span class="identifier">ts_real</span><span class="special">);</span> 1138<span class="identifier">test_parser</span><span class="special">(</span><span class="string">"123,456,789.01"</span><span class="special">,</span> <span class="identifier">ts_real</span><span class="special">(</span><span class="number">123456789.01</span><span class="special">));</span> 1139</pre> 1140<p> 1141 </p> 1142</div> 1143<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 1144<td align="left"></td> 1145<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p> 1146 Distributed under the Boost Software License, Version 1.0. (See accompanying 1147 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>) 1148 </p> 1149</div></td> 1150</tr></table> 1151<hr> 1152<div class="spirit-nav"> 1153<a accesskey="p" href="int.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../numeric.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="boolean.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a> 1154</div> 1155</body> 1156</html> 1157