• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 [/==============================================================================
2     Copyright (C) 2001-2011 Hartmut Kaiser
3     Copyright (C) 2001-2011 Joel de Guzman
4 
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ===============================================================================/]
8 
9 [section:numeric Numeric Generators]
10 
11 The library includes a couple of predefined objects for generating booleans,
12 signed and unsigned integers, and real numbers. These generators are fully
13 parametric. Most of the important aspects of numeric generation can be
14 finely adjusted to suit. This includes the radix base, the exponent, the
15 fraction etc. Policies control the real number generators' behavior. There are
16 some predefined policies covering the most common real number formats but the
17 user can supply her own when needed.
18 
19 The numeric parsers are fine tuned (employing loop unrolling and
20 extensive template metaprogramming) with exceptional performance that
21 rivals the low level C functions such as `ltoa`, `ssprintf`, and `_gcvt`.
22 Benchmarks reveal up to 2X speed over the C counterparts (see here:
23 __sec_karma_numeric_performance__). This goes to show that you can write
24 extremely tight generic C++ code that rivals, if not surpasses C.
25 
26 [heading Module Header]
27 
28     // forwards to <boost/spirit/home/karma/numeric.hpp>
29     #include <boost/spirit/include/karma_numeric.hpp>
30 
31 Also, see __include_structure__.
32 
33 [/////////////////////////////////////////////////////////////////////////////]
34 [section:unsigned_int Unsigned Integer Number Generators (`uint_`, etc.)]
35 
36 [heading Description]
37 
38 The `uint_generator` class is the simplest among the members of the
39 numerics package. The `uint_generator` can generate unsigned integers of
40 arbitrary length and size. The `uint_generator` generator can be used to
41 generate ordinary primitive C/C++ integers or even user defined scalars such as
42 bigints (unlimited precision integers) if the type follows
43 certain expression requirements (for more information about the requirements, see
44 [link spirit.karma.reference.numeric.unsigned_int.additional_requirements below])).
45 The `uint_generator` is a template class. Template parameters fine tune its behavior.
46 
47 [heading Header]
48 
49     // forwards to <boost/spirit/home/karma/numeric/uint.hpp>
50     #include <boost/spirit/include/karma_uint.hpp>
51 
52 Also, see __include_structure__.
53 
54 [heading Namespace]
55 
56 [table
57     [[Name]]
58     [[`boost::spirit::lit           // alias: boost::spirit::karma::lit`]]
59     [[`boost::spirit::bin           // alias: boost::spirit::karma::bin`]]
60     [[`boost::spirit::oct           // alias: boost::spirit::karma::oct`]]
61     [[`boost::spirit::hex           // alias: boost::spirit::karma::hex`]]
62     [[`boost::spirit::ushort_       // alias: boost::spirit::karma::ushort_`]]
63     [[`boost::spirit::ulong_        // alias: boost::spirit::karma::ulong_`]]
64     [[`boost::spirit::uint_         // alias: boost::spirit::karma::uint_`]]
65     [[`boost::spirit::ulong_long    // alias: boost::spirit::karma::ulong_long`]]
66 ]
67 
68 [note The generators `ulong_long` and `ulong_long(num)` are only available on
69         platforms where the preprocessor constant `BOOST_HAS_LONG_LONG` is
70         defined (i.e. on platforms having native support for `unsigned long long`
71         (64 bit) unsigned integer types).]
72 
73 [note `lit` is reused by the [karma_string String Generators], the
74       __karma_char__, and the Numeric Generators. In
75       general, a char generator is created when you pass in a
76       character, a string generator is created when you pass in a string, and a
77       numeric generator is created when you use a numeric literal.]
78 
79 [heading Synopsis]
80 
81     template <
82         typename Num
83       , unsigned Radix>
84     struct uint_generator;
85 
86 [heading Template parameters]
87 
88 [table
89     [[Parameter]    [Description]                       [Default]]
90     [[`Num`]        [The numeric base type of the
91                      numeric generator.]                [`unsigned int`]]
92     [[`Radix`]      [The radix base. This can be
93                      any value in the (inclusive) range from `2` .. `36`.]  [`10`]]
94 ]
95 
96 [heading Model of]
97 
98 [:__primitive_generator_concept__]
99 
100 [variablelist Notation
101     [[`num`]            [Numeric literal, any unsigned integer value, or
102                          a __karma_lazy_argument__ that evaluates to an
103                          unsigned integer value of type `Num`]]
104     [[`Num`]            [Type of `num`: any unsigned integer type, or in case
105                          of a __karma_lazy_argument__, its return value]]
106     [[`Radix`]          [An integer literal specifying the required radix for
107                          the output conversion. Valid values are from the
108                          (inclusive) range `2` .. `36`.]]
109 ]
110 
111 [heading Expression Semantics]
112 
113 Semantics of an expression is defined only where it differs from, or is
114 not defined in __primitive_generator_concept__.
115 
116 [table
117     [[Expression]       [Semantics]]
118     [[`lit(num)`]       [Generate the unsigned integer literal `num` using the
119                          default formatting (radix is `10`). This generator never
120                          fails (unless the underlying output stream reports
121                          an error).]]
122     [
123 [``ushort_
124 uint_
125 ulong_
126 ulong_long``]           [Generate the unsigned integer provided by a mandatory
127                          attribute using the default formatting (radix is `10`).
128                          This generator never fails (unless the underlying
129                          output stream reports an error).]]
130     [
131 [``ushort_(num)
132 uint_(num)
133 ulong_(num)
134 ulong_long(num)``]      [Generate the unsigned integer provided by the
135                          immediate literal value the generator is initialized
136                          from using the default formatting (radix is `10`). If
137                          this generator has an associated attribute it succeeds
138                          only if the attribute is equal to the
139                          immediate literal (unless the underlying output
140                          stream reports an error). Otherwise this generator
141                          fails and does not generate any output.]]
142     [
143 [``bin
144 oct
145 hex``]                  [Generate the unsigned integer provided by a mandatory
146                          attribute using the default formatting and the
147                          corresponding radix (`bin`: radix is `2`, `oct`: radix is `8`,
148                          `hex`: radix is `16`). This generator never fails (unless
149                          the underlying output stream reports an error).]]
150     [
151 [``bin(num)
152 oct(num)
153 hex(num)``]             [Generate the unsigned integer provided by the
154                          immediate literal value the generator is initialized
155                          from using the default formatting and the
156                          corresponding radix (`bin`: radix is `2`, `oct`:
157                          radix is `8`, `hex`: radix is `16`). If
158                          this generator has an associated attribute it succeeds
159                          only if the attribute is equal to the
160                          immediate literal (unless the underlying output
161                          stream reports an error). Otherwise this generator
162                          fails and does not generate any output.]]
163 ]
164 
165 All generators listed in the table above (except `lit(num)`) are predefined
166 specializations of the `uint_generator<Num, Radix>` basic unsigned integer
167 number generator type described below. It is possible to directly use this
168 type to create unsigned integer generators using a wide range of formatting
169 options.
170 
171 [table
172     [[Expression]       [Semantics]]
173     [
174 [``uint_generator<
175     Num, Radix
176 >()``]
177                         [Generate the unsigned integer of type `Num` provided
178                          by a mandatory attribute using the specified `Radix`
179                          (allowed values are from the (inclusive) range from
180                          `2` .. `36`, the
181                          default value is `10`).This generator never fails
182                          (unless the underlying output stream reports an
183                          error).]]
184     [
185 [``uint_generator<
186     Num, Radix
187 >()(num)``]
188                         [Generate the unsigned integer of type `Num` provided
189                          by the immediate literal value the generator is
190                          initialized from, using the specified `Radix`
191                          (allowed values are from the (inclusive) range from
192                          `2` .. `36`, the
193                          default value is `10`). If this generator has an
194                          associated attribute it succeeds only if the
195                          attribute is equal to the immediate literal (unless
196                          the underlying output stream reports an error).
197                          Otherwise this generator fails and does not generate
198                          any output.]]
199 ]
200 
201 [heading Additional Requirements]
202 
203 The following lists enumerate the requirements which must be met in order to
204 use a certain type `Num` to instantiate and use a
205 `uint_generator<Num, Radix>`.
206 
207 If `boost::is_integral<Num>::value` is `true` the type `Num` must have defined:
208 
209 * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=`
210 * numeric operators for: `+`, `-`, `/`, `*`, and `%`
211 
212 If `boost::is_integral<Num>::value` is `false` the type `Num` must have defined:
213 
214 * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=`
215 * numeric operators for: `+`, `-`, `/`, `*`, and `%`
216 * helper functions implementing the interface and the semantics of: `std::fmod`,
217   `std::pow`, `std::lround`, `std::ltrunc`, `std::floor`, and `std::ceil`.
218   These need to be defined in a way so that they will be found using argument
219   dependent lookup (ADL).
220 
221 [heading Attributes]
222 
223 [table
224     [[Expression]       [Attribute]]
225     [[`lit(num)`]       [__unused__]]
226     [[`ushort_`]         [`unsigned short`, attribute is mandatory (otherwise
227                          compilation will fail)]]
228     [[`ushort_(num)`]    [`unsigned short`, attribute is optional, if it is
229                          supplied, the generator compares the attribute with
230                          `num` and succeeds only if both are equal, failing
231                          otherwise.]]
232 
233     [[`uint_`]           [`unsigned int`, attribute is mandatory (otherwise
234                          compilation will fail)]]
235     [[`uint_(num)`]      [`unsigned int`, attribute is optional, if it is
236                          supplied, the generator compares the attribute with
237                          `num` and succeeds only if both are equal, failing
238                          otherwise.]]
239 
240     [[`ulong_`]          [`unsigned long`, attribute is mandatory (otherwise
241                          compilation will fail)]]
242     [[`ulong_(num)`]     [`unsigned long`, attribute is optional, if it is
243                          supplied, the generator compares the attribute with
244                          `num` and succeeds only if both are equal, failing
245                          otherwise.]]
246 
247     [[`ulong_long`]     [`unsigned long long`, attribute is mandatory
248                          (otherwise compilation will fail)]]
249     [[`ulong_long(num)`][`unsigned long long`, attribute is optional, if it is
250                          supplied, the generator compares the attribute with
251                          `num` and succeeds only if both are equal, failing
252                          otherwise.]]
253 
254     [
255 [``bin
256 oct
257 hex``]                  [`unsigned int`, attribute is mandatory
258                          (otherwise compilation will fail)]]
259     [
260 [``bin(num)
261 oct(num)
262 hex(num)``]             [`unsigned int`, attribute is optional, if it is
263                          supplied, the generator compares the attribute with
264                          `num` and succeeds only if both are equal, failing
265                          otherwise.]]
266 
267     [
268 [``uint_generator<
269     Num, Radix
270 >()``]                  [`Num`, attribute is mandatory (otherwise compilation
271                          will fail)]]
272     [
273 [``uint_generator<
274     Num, Radix
275 >()(num)``]             [`Num`, attribute is optional, if it is supplied, the
276                          generator compares the attribute with `num` and
277                          succeeds only if both are equal, failing otherwise.]]
278 ]
279 
280 [note  In addition to their usual attribute of type `Num` all listed generators
281        accept an instance of a `boost::optional<Num>` as well. If the
282        `boost::optional<>` is initialized (holds a value) the generators behave
283        as if their attribute was an instance of `Num` and emit the value stored
284        in the `boost::optional<>`. Otherwise the generators will fail.]
285 
286 [heading Complexity]
287 
288 [:O(N), where `N` is the number of digits needed to represent the generated
289  integer number]
290 
291 [heading Example]
292 
293 [note The test harness for the example(s) below is presented in the
294       __karma_basics_examples__ section.]
295 
296 Some includes:
297 
298 [reference_karma_includes]
299 
300 Some using declarations:
301 
302 [reference_karma_using_declarations_uint]
303 
304 Basic usage of an `uint` generator:
305 
306 [reference_karma_uint]
307 
308 [endsect]
309 
310 [/////////////////////////////////////////////////////////////////////////////]
311 [section:signed_int Signed Integer Number Generators (`int_`, etc.)]
312 
313 [heading Description]
314 
315 The `int_generator` can generate signed integers of arbitrary length and size.
316 This is almost the same as the `uint_generator`. The only difference is the
317 additional task of generating the `'+'` or `'-'` sign preceding the number.
318 The class interface is the same as that of the `uint_generator`.
319 
320 The `int_generator` generator can be used to emit ordinary primitive C/C++
321 integers or even user defined scalars such as bigints (unlimited
322 precision integers) if the type follows certain expression
323 requirements (for more information about the requirements, see
324 [link spirit.karma.reference.numeric.signed_int.additional_requirements below]).
325 
326 [heading Header]
327 
328     // forwards to <boost/spirit/home/karma/numeric/int.hpp>
329     #include <boost/spirit/include/karma_int.hpp>
330 
331 Also, see __include_structure__.
332 
333 [heading Namespace]
334 
335 [table
336     [[Name]]
337     [[`boost::spirit::lit           // alias: boost::spirit::karma::lit`]]
338     [[`boost::spirit::short_        // alias: boost::spirit::karma::short_`]]
339     [[`boost::spirit::int_          // alias: boost::spirit::karma::int_`]]
340     [[`boost::spirit::long_         // alias: boost::spirit::karma::long_`]]
341     [[`boost::spirit::long_long     // alias: boost::spirit::karma::long_long`]]
342 ]
343 
344 [note The generators `long_long` and `long_long(num)` are only available on
345         platforms where the preprocessor constant `BOOST_HAS_LONG_LONG` is
346         defined (i.e. on platforms having native support for `long long`
347         (64 bit) integer types).]
348 
349 [note `lit` is reused by the [karma_string String Generators], the
350       __karma_char__, and the Numeric Generators. In
351       general, a char generator is created when you pass in a
352       character, a string generator is created when you pass in a string, and a
353       numeric generator is created when you use a numeric literal.]
354 
355 [heading Synopsis]
356 
357     template <
358         typename T
359       , unsigned Radix
360       , bool force_sign>
361     struct int_generator;
362 
363 [heading Template parameters]
364 
365 [table
366     [[Parameter]    [Description]                        [Default]]
367     [[`T`]          [The numeric base type of the
368                      numeric parser.]                    [`int`]]
369     [[`Radix`]      [The radix base. This can be
370                      either 2: binary, 8: octal,
371                      10: decimal and 16: hexadecimal.]   [`10`]]
372     [[`force_sign`] [If `true`, all numbers will
373                      have a sign (space for zero)]       [`false`]]
374 ]
375 
376 [heading Model of]
377 
378 [:__primitive_generator_concept__]
379 
380 [variablelist Notation
381     [[`num`]            [Numeric literal, any signed integer value, or
382                          a __karma_lazy_argument__ that evaluates to a signed
383                          integer value of type `Num`]]
384     [[`Num`]            [Type of `num`: any signed integer type]]
385     [[`Radix`]          [A constant integer literal specifying the required
386                          radix for the output conversion. Valid values are `2`,
387                          `8`, `10`, and `16`.]]
388     [[`force_sign`]     [A constant boolean literal specifying whether the
389                          generated number should always have a sign (`'+'` for
390                          positive numbers, `'-'` for negative numbers and a
391                          '` `' for zero).]]
392     ]
393 
394 [heading Expression Semantics]
395 
396 Semantics of an expression is defined only where it differs from, or is
397 not defined in __primitive_generator_concept__.
398 
399 [table
400     [[Expression]       [Semantics]]
401     [[`lit(num)`]       [Generate the integer literal `num` using the default
402                          formatting (radix is `10`, sign is only printed for
403                          negative literals). This generator never fails (unless
404                          the underlying output stream reports an error).]]
405     [
406 [``short_
407 int_
408 long_
409 long_long``]            [Generate the integer provided by a mandatory attribute
410                          using the default formatting (radix is `10`, sign is
411                          only printed for negative literals). This generator
412                          never fails (unless the underlying output stream
413                          reports an error).]]
414     [
415 [``short_(num)
416 int_(num)
417 long_(num)
418 long_long(num)``]       [Generate the integer provided by the immediate literal
419                          value the generator is initialized from using the
420                          default formatting (radix is `10`, sign is only printed
421                          for negative literals). If this generator has an
422                          associated attribute it succeeds only if the
423                          attribute is equal to the immediate literal (unless
424                          the underlying output stream reports an error).
425                          Otherwise this generator fails and does not generate
426                          any output.]]
427 ]
428 
429 All generators listed in the table above (except `lit(num)`) are predefined
430 specializations of the `int_generator<Num, Radix, force_sign>` basic integer
431 number generator type described below. It is possible to directly use this
432 type to create integer generators using a wide range of formatting options.
433 
434 [table
435     [[Expression]       [Semantics]]
436     [
437 [``int_generator<
438     Num, Radix, force_sign
439 >()``]
440                         [Generate the integer of type `Num` provided by a
441                          mandatory attribute using the specified `Radix`
442                          (possible values are `2`, `8`, `10`, and `16`, the
443                          default value is `10`). If `force_sign` is `false`
444                          (the default), a sign is only printed for negative
445                          literals. If `force_sign` is `true`, all numbers will
446                          be printed using a sign, i.e. `'-'` for negative
447                          numbers, `'+'` for positive numbers, and `' '` for
448                          zeros. This generator never fails (unless the
449                          underlying output stream reports an error).]]
450     [
451 [``int_generator<
452     Num, Radix, force_sign
453 >()(num)``]
454                         [Generate the integer of type `Num` provided by the
455                          immediate literal value the generator is initialized
456                          from, using the specified `Radix` (possible values are
457                          `2`, `8`, `10`, and `16`, the default value is `10`).
458                          If `force_sign` is `false` (the default), a sign is
459                          only printed for negative literals. If `force_sign` is
460                          `true`, all numbers will be printed using a sign, i.e.
461                          `'-'` for negative numbers, `'+'` for positive numbers,
462                          and `' '` for zeros. If this generator has an
463                          associated attribute it succeeds only if the
464                          attribute is equal to the immediate literal (unless
465                          the underlying output stream reports an error).
466                          Otherwise this generator fails and does not generate
467                          any output.]]
468 ]
469 
470 [heading Additional Requirements]
471 
472 The following lists enumerate the requirements which must be met in order to
473 use a certain type `Num` to instantiate and use a
474 `int_generator<Num, Radix, force_sign>`.
475 
476 If `boost::is_integral<Num>::value` is `true` the type `Num` must have defined:
477 
478 * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=`
479 * numeric operators for: `+`, `-`, `/`, `*`, `%`, and unary `-`
480 
481 If `boost::is_integral<Num>::value` is `false` the type `Num` must have defined:
482 
483 * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=`
484 * numeric operators for: `+`, `-`, `/`, `*`, `%`, and unary `-`
485 * helper functions implementing the interface and the semantics of: `std::fmod`,
486   `std::fabs`, `std::pow`, `std::lround`, `std::ltrunc`, `std::floor`, and
487   `std::ceil`. These need to be defined in a way so that they will be found
488   using argument dependent lookup (ADL).
489 
490 [heading Attributes]
491 
492 [table
493     [[Expression]       [Attribute]]
494     [[`lit(num)`]       [__unused__]]
495     [[`short_`]         [`short`, attribute is mandatory (otherwise compilation
496                          will fail)]]
497     [[`short_(num)`]    [`short`, attribute is optional, if it is supplied, the
498                          generator compares the attribute with `num` and
499                          succeeds only if both are equal, failing otherwise.]]
500 
501     [[`int_`]           [`int`, attribute is mandatory (otherwise compilation
502                          will fail)]]
503     [[`int_(num)`]      [`int`, attribute is optional, if it is supplied, the
504                          generator compares the attribute with `num` and
505                          succeeds only if both are equal, failing otherwise.]]
506 
507     [[`long_`]          [`long`, attribute is mandatory (otherwise compilation
508                          will fail)]]
509     [[`long_(num)`]     [`long`, attribute is optional, if it is supplied, the
510                          generator compares the attribute with `num` and
511                          succeeds only if both are equal, failing otherwise.]]
512 
513     [[`long_long`]      [`long long`, attribute is mandatory (otherwise compilation
514                          will fail)]]
515     [[`long_long(num)`] [`long long`, attribute is optional, if it is supplied, the
516                          generator compares the attribute with `num` and
517                          succeeds only if both are equal, failing otherwise.]]
518 
519     [
520 [``int_generator<
521     Num, Radix, force_sign
522 >()``]                  [`Num`, attribute is mandatory (otherwise compilation
523                          will fail)]]
524     [
525 [``int_generator<
526     Num, Radix, force_sign
527 >()(num)``]             [`Num`, attribute is optional, if it is supplied, the
528                          generator compares the attribute with `num` and
529                          succeeds only if both are equal, failing otherwise.]]
530 ]
531 
532 [note  In addition to their usual attribute of type `Num` all listed generators
533        accept an instance of a `boost::optional<Num>` as well. If the
534        `boost::optional<>` is initialized (holds a value) the generators behave
535        as if their attribute was an instance of `Num` and emit the value stored
536        in the `boost::optional<>`. Otherwise the generators will fail.]
537 
538 [heading Complexity]
539 
540 [:O(N), where `N` is the number of digits needed to represent the generated
541  integer number]
542 
543 [heading Example]
544 
545 [note The test harness for the example(s) below is presented in the
546       __karma_basics_examples__ section.]
547 
548 Some includes:
549 
550 [reference_karma_includes]
551 
552 Some using declarations:
553 
554 [reference_karma_using_declarations_int]
555 
556 Basic usage of an `int_` generator:
557 
558 [reference_karma_int]
559 
560 [endsect]
561 
562 [/////////////////////////////////////////////////////////////////////////////]
563 [section:real_number Real Number Generators (`float_`, `double_`, etc.)]
564 
565 [heading Description]
566 
567 The `real_generator` can generate  real numbers of arbitrary length and size
568 limited by its template parameter, `Num`. The numeric base type `Num` can be
569 a user defined numeric type such as fixed_point (fixed point reals) and
570 bignum (unlimited precision numbers) if the type follows certain
571 expression requirements (for more information about the requirements, see
572 [link spirit.karma.reference.numeric.real_number.additional_requirements below]).
573 
574 [heading Header]
575 
576     // forwards to <boost/spirit/home/karma/numeric/real.hpp>
577     #include <boost/spirit/include/karma_real.hpp>
578 
579 Also, see __include_structure__.
580 
581 [heading Namespace]
582 
583 [table
584     [[Name]]
585     [[`boost::spirit::lit           // alias: boost::spirit::karma::lit`]]
586     [[`boost::spirit::float_        // alias: boost::spirit::karma::float_`]]
587     [[`boost::spirit::double_       // alias: boost::spirit::karma::double_`]]
588     [[`boost::spirit::long_double   // alias: boost::spirit::karma::long_double`]]
589 ]
590 
591 [note `lit` is reused by the [karma_string String Generators], the
592       __karma_char__, and the Numeric Generators. In
593       general, a char generator is created when you pass in a
594       character, a string generator is created when you pass in a string, and a
595       numeric generator is created when you use a numeric literal.]
596 
597 [heading Synopsis]
598 
599     template <typename Num, typename RealPolicies>
600     struct real_generator;
601 
602 [heading Template parameters]
603 
604 [table
605     [[Parameter]        [Description]               [Default]]
606     [[`Num`]            [The type of the real number to generate.]  [`double`]]
607     [[`RealPolicies`]   [The policies to use while
608                          converting the real number.] [`real_policies<Num>`]]
609 ]
610 
611 For more information about the type `RealPolicies` see
612 [link spirit.karma.reference.numeric.real_number.real_number_formatting_policies below].
613 
614 [heading Model of]
615 
616 [:__primitive_generator_concept__]
617 
618 [variablelist Notation
619     [[`num`]            [Numeric literal, any real number value, or
620                          a __karma_lazy_argument__ that evaluates to a real
621                          number value of type `Num`]]
622     [[`Num`]            [Type of `num`: any real number type]]
623 ]
624 
625 [heading Expression Semantics]
626 
627 Semantics of an expression is defined only where it differs from, or is
628 not defined in __primitive_generator_concept__.
629 
630 [table
631     [[Expression]       [Semantics]]
632     [[`lit(num)`]       [Generate the real number literal `num` using the
633                          default formatting (no trailing zeros, `fixed`
634                          representation for numbers `fabs(n) <= 1e5 && fabs(n) > 1e-3`,
635                          scientific representation otherwise, 3 fractional digits,
636                          sign is only printed for negative literals). This
637                          generator never fails (unless the underlying output
638                          stream reports an error).]]
639     [
640 [``float_
641 double_
642 long_double``]          [Generate the real number provided by a
643                          mandatory attribute using the default formatting (no
644                          trailing zeros, `fixed` representation for numbers
645                          `fabs(n) <= 1e5 && fabs(n) > 1e-3`, scientific
646                          representation otherwise, 3 fractional digits,
647                          sign is only printed for negative literals). This
648                          generator never fails (unless the underlying output
649                          stream reports an error).]]
650     [
651 [``float_(num)
652 double_(num)
653 long_double(num)``]     [Generate the real point number provided by the
654                          immediate literal value the generator is initialized
655                          from using the default formatting (no trailing zeros,
656                          `fixed` representation for numbers
657                          `fabs(n) <= 1e5 && fabs(n) > 1e-3`, scientific
658                          representation otherwise, 3 fractional digits, sign is
659                          only printed for negative literals). If this generator
660                          has an associated attribute it succeeds only if
661                          the attribute is equal to the immediate literal (unless
662                          the underlying output stream reports an error).
663                          Otherwise this generator fails and does not generate
664                          any output.]]
665 ]
666 
667 All generators listed in the table above (except `lit(num)`) are predefined
668 specializations of the `real_generator<Num, RealPolicies>` basic real
669 number generator type described below. It is possible to directly use this
670 type to create real number generators using a wide range of formatting
671 options.
672 
673 [table
674     [[Expression]       [Semantics]]
675     [
676 [``real_generator<
677     Num, RealPolicies
678 >()``]
679                         [Generate the real number of type `Num`
680                          provided by a mandatory attribute using the specified
681                          `RealPolicies`. This generator never fails
682                          (unless the underlying output stream reports an
683                          error).]]
684     [
685 [``real_generator<
686     Num, RealPolicies
687 >()(num)``]
688                         [Generate the real number of type `Num` provided by the
689                          immediate literal value the generator is initialized
690                          from  using the specified `RealPolicies`.
691                          If this generator has an associated attribute it
692                          succeeds only if the attribute is equal to the
693                          immediate literal (unless the underlying output stream
694                          reports an error).  Otherwise this generator fails and
695                          does not generate any output.]]
696 ]
697 
698 [heading Additional Requirements]
699 
700 The following list enumerates the requirements which must be met in order to
701 use a certain type `Num` to instantiate a `real_generator<Num, Policies>`.
702 
703 In order to be usable as the first template parameter for `real_generator<>`
704 the type `Num` must have defined:
705 
706 * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=`
707 * numeric operators for: `+`, `-`, `/`, `*`, and `%`
708 * functions implementing the interface and the semantics of: `std::fmod`,
709   `std::pow`, `std::log10`, `std::lround`, `std::ltrunc`, `std::modf`,
710   `std::floor`, and `std::ceil`. These need to be defined in a way so that they
711   will be found using argument dependent lookup (ADL).
712 * a valid specialization of the type `std::numeric_limits<Num>` allowing for
713   numeric property inspection.
714 
715 
716 [heading Attributes]
717 
718 [table
719     [[Expression]       [Attribute]]
720     [[`lit(num)`]       [__unused__]]
721 
722     [[`float_`]         [`float`, attribute is mandatory (otherwise compilation
723                          will fail)]]
724     [[`float_(num)`]    [`float_`, attribute is optional, if it is supplied, the
725                          generator compares the attribute with `num` and
726                          succeeds only if both are equal, failing otherwise.]]
727 
728     [[`double_`]        [`double`, attribute is mandatory (otherwise compilation
729                          will fail)]]
730     [[`double_(num)`]   [`double`, attribute is optional, if it is supplied, the
731                          generator compares the attribute with `num` and
732                          succeeds only if both are equal, failing otherwise.]]
733 
734     [[`long_double`]    [`long double`, attribute is mandatory (otherwise
735                          compilation will fail)]]
736     [[`long_double(num)`][`long double`, attribute is optional, if it is supplied,
737                          the generator compares the attribute with `num` and
738                          succeeds only if both are equal, failing otherwise.]]
739     [
740 [``real_generator<
741     Num, Policies
742 >()``]                  [`Num`, attribute is mandatory (otherwise compilation
743                          will fail)]]
744     [
745 [``real_generator<
746     Num, Policies
747 >()(num)``]             [`Num`, attribute is optional, if it is supplied, the
748                          generator compares the attribute with `num` and
749                          succeeds only if both are equal, failing otherwise.]]
750 ]
751 
752 [note  In addition to their usual attribute of type `Num` all listed generators
753        accept an instance of a `boost::optional<Num>` as well. If the
754        `boost::optional<>` is initialized (holds a value) the generators behave
755        as if their attribute was an instance of `Num` and emit the value stored
756        in the `boost::optional<>`. Otherwise the generators will fail.]
757 
758 [heading Real Number Formatting Policies]
759 
760 If special formatting of a real number is needed, overload
761 the policy class `real_policies<Num>` and use it as a template
762 parameter to the `real_generator<>` real number generator. For instance:
763 
764     // define a new real number formatting policy
765     template <typename Num>
766     struct scientific_policy : real_policies<Num>
767     {
768         // we want the numbers always to be in scientific format
769         static int floatfield(Num n) { return fmtflags::scientific; }
770     };
771 
772     // define a new generator type based on the new policy
773     typedef real_generator<double, scientific_policy<double> > science_type;
774     science_type const scientific = science_type();
775 
776     // use the new generator
777     generate(sink, science_type(), 1.0);  // will output: 1.0e00
778     generate(sink, scientific, 0.1);      // will output: 1.0e-01
779 
780 The template parameter `Num` should be the type to be formatted using the
781 overloaded policy type. At the same time `Num` will be used as the attribute
782 type of the created real number generator.
783 
784 
785 [heading Real Number Formatting Policy Expression Semantics]
786 
787 A real number formatting policy should expose the following variables and
788 functions:
789 
790 [table
791 [[Expression][Description]]
792 [   [``
793         template <typename Inserter
794           , typename OutputIterator
795           , typename Policies>
796         bool call (OutputIterator& sink, Num n
797           , Policies const& p);
798     ``]
799     [This is the main function used to generate the output for a real
800      number. It is called by the real generator in order to perform the
801      conversion. In theory all of the work can be implemented here, but the
802      easiest way is to use existing functionality provided by the type specified
803      by the template parameter `Inserter`. The default implementation of this
804      functions is:
805      ``
806           template <typename Inserter, typename OutputIterator
807             , typename Policies>
808           static bool
809           call (OutputIterator& sink, Num n, Policies const& p)
810           {
811               return Inserter::call_n(sink, n, p);
812           }
813      ``
814       `sink` is the output iterator to use for generation
815 
816       `n` is the real number to convert
817 
818       `p` is the instance of the policy type used to instantiate this real
819            number generator.
820     ]]
821 [   [``
822         bool force_sign(Num n);
823     ``]
824     [The default behavior is to not to require generating a sign. If the function
825      `force_sign()` returns true, then all generated numbers will have a
826      sign (`'+'` or `'-'`, zeros will have a space instead of a sign).
827 
828      `n` is the real number to output. This can be used to
829      adjust the required behavior depending on the value of this number.]]
830 [   [``
831         bool trailing_zeros(Num n);
832     ``]
833     [Return whether trailing zero digits have to be emitted in the fractional
834      part of the output. If set, this flag instructs the real number
835      generator to emit trailing zeros up to the required precision digits (as
836      returned by the `precision()` function).
837 
838      `n` is the real number to output. This can be used to
839      adjust the required behavior depending on the value of this number.]]
840 [   [``
841         int floatfield(Num n);
842     ``]
843     [Decide, which representation type to use in the generated output.
844 
845      By default all numbers having an absolute value of zero or in between
846      `0.001` and `100000` will be generated using the fixed format, all others
847      will be generated using the scientific representation.
848 
849     The `trailing_zeros()` can be used to force the output of trailing zeros
850     in the fractional part up to the number of digits returned by the
851     `precision()` member function. The default is not to generate the trailing
852     zeros.
853 
854     `n` is the real number to output. This can be used to
855           adjust the formatting flags depending on the value of
856           this number.
857 
858     The return value has to be either `fmtflags::scientific` (generate real
859     number values in scientific notation) or `fmtflags::fixed` (generate
860     real number values in fixed-point notation).
861     ]]
862 [   [``
863         unsigned precision(Num n);
864     ``]
865     [Return the maximum number of decimal digits to generate in the
866      fractional part of the output.
867 
868     `n` is the real number to output. This can be used to
869     adjust the required precision depending on the value of this number. If
870     the trailing zeros flag is specified the fractional part of the output will
871     be 'filled' with zeros, if appropriate.
872 
873     *Note:* If the trailing_zeros flag is not in effect additional semantics
874           apply. See the description for the `fraction_part()` function below.
875           Moreover, this precision will be limited to the value of
876           `std::numeric_limits<T>::digits10 + 1`.]]
877 [   [``
878         template <typename OutputIterator>
879         bool integer_part(OutputIterator& sink
880           , Num n, bool sign, bool force_sign);
881     ``]
882     [This function is called to generate the integer part of the real
883       number.
884 
885       `sink` is the output iterator to use for generation
886 
887       `n` is the absolute value of the integer part of the real
888            number to convert (always non-negative)
889 
890       `sign` is the sign of the overall real number to convert.
891 
892       `force_sign` is a flag indicating whether a sign has to be generated even for
893                    non-negative numbers (this is the same as has been returned
894                    from the function `force_sign()` described above)
895 
896       The return value defines the outcome of the whole generator. If it is
897       `false`, no further output is generated, immediately returning `false` from
898       the calling `real_generator` as well. If it is `true`, normal output
899       generation continues.]]
900 [   [``
901         template <typename OutputIterator>
902         bool dot(OutputIterator& sink, Num n,
903           unsigned precision);
904     ``]
905     [This function is called to generate the decimal point.
906 
907      `sink` is the output iterator to use for generation
908 
909      `n` is the fractional part of the real number to convert. Note
910       that this number is scaled such, that it represents the number of units
911       which correspond to the value returned from the `precision()` function
912       earlier. I.e. a fractional part of `0.01234` is represented as `1234`
913       when the function `precision()` returned `5`.
914 
915       `precision` is the number of digits to emit as returned by the function
916                    `precision()` described above
917 
918       This is given to allow to decide, whether a decimal point has to be
919       generated at all.
920 
921       *Note:* If the `trailing_zeros` flag is not in effect additional comments
922       apply. See the description for the `fraction_part()` function below.
923 
924       The return value defines the outcome of the whole generator. If it is
925       `false`, no further output is generated, immediately returning `false` from
926       the calling `real_generator` as well. If it is `true`, normal output
927       generation continues.]]
928 [   [``
929         template <typename OutputIterator>
930         bool fraction_part(OutputIterator& sink, Num n
931           , unsigned adjprec, unsigned precision);
932     ``]
933     [This function is called to generate the fractional part of the number.
934 
935       `sink` is the output iterator to use for generation
936 
937       `n` is the fractional part of the real number to convert. Note
938       that this number is scaled such, that it represents the number of units
939       which correspond to the value returned from the `precision()` function
940       earlier. I.e. a fractional part of `0.01234` is represented as `1234`
941       when the function `precision()` returned `5`.
942 
943       `adjprec` is the corrected number of digits to emit (see note below)
944 
945       `precision` is the number of digits to emit as returned by the function
946                    `precision()` described above
947 
948       *Note:* If `trailing_zeros()` returns `false` the `adjprec`
949       parameter will have been corrected from the value the `precision()`
950       function returned earlier (defining the maximal number of fractional
951       digits) in the sense, that it takes into account trailing zeros. I.e. a
952       real number `0.0123` and a value of `5` returned from
953       `precision()` will result in:
954 
955       `trailing_zeros()` returned `false`: `n` will be `123`, and `adjprec`
956       will be `4` (as we need to print `0123`)
957 
958       `trailing_zeros()` returned `true`: `n` will be `1230`, and `adjprec`
959       will be `5` (as we need to print `01230`)
960 
961       The missing preceding zeros in the fractional part have to be supplied
962       by the implementation of this policy function.
963 
964       The return value defines the outcome of the whole generator. If it is
965       `false`, no further output is generated, immediately returning `false` from
966       the calling `real_generator` as well. If it is `true`, normal output
967       generation continues.]]
968 [   [``
969         template <typename CharEncoding,
970             typename Tag, typename OutputIterator>
971         bool exponent(
972             OutputIterator& sink, long n);
973     ``]
974     [This function is called to generate the exponential part of the number
975      (this is called only if the `floatfield()` function returned the
976      `fmtflags::scientific` flag).
977 
978      `sink` is the output iterator to use for generation
979 
980      `n` is the (signed) exponential part of the real number to convert.
981 
982      The template parameters `CharEncoding` and `Tag` are either of the type
983      `unused_type` or describe the character class and conversion to be
984      applied to any output possibly influenced by either the `lower[]` or
985      `upper[]` directives.
986 
987       The return value defines the outcome of the whole generator. If it is
988       `false`, no further output is generated, immediately returning `false` from
989       the calling `real_generator` as well. If it is `true`, normal output
990       generation continues.]]
991 [   [``
992         template <typename CharEncoding
993           , typename Tag, typename OutputIterator>
994         bool nan (OutputIterator& sink, Num n
995           , bool force_sign);
996     ``]
997     [This function is called whenever the number to print is a non-normal
998      real number of type `NaN`.
999 
1000      `sink` is the output iterator to use for generation
1001 
1002      `n` is the (signed) real number to convert
1003 
1004     `force_sign` is a flag indicating whether a sign has to be generated even for
1005                  non-negative numbers (this is the same as has been returned from
1006                  the function `force_sign()` described above)
1007 
1008      The template parameters `CharEncoding` and `Tag` are either of the type
1009      `unused_type` or describe the character class and conversion to be
1010      applied to any output possibly influenced by either the `lower[]` or
1011      `upper[]` directives.
1012 
1013       The return value defines the outcome of the whole generator. If it is
1014       `false`, no further output is generated, immediately returning `false` from
1015       the calling `real_generator` as well. If it is `true`, normal output
1016       generation continues.]]
1017 [   [``
1018         template <typename CharEncoding
1019           , typename Tag, typename OutputIterator>
1020         bool inf (OutputIterator& sink, Num n
1021           , bool force_sign);
1022     ``]
1023     [This function is called whenever the number to print is a non-normal
1024      real number of type `Inf`.
1025 
1026      `sink` is the output iterator to use for generation
1027 
1028      `n` is the (signed) real number to convert
1029 
1030     `force_sign` is a flag indicating whether a sign has to be generated even for
1031                  non-negative numbers (this is the same as has been returned from
1032                  the function `force_sign()` described above)
1033 
1034      The template parameters `CharEncoding` and `Tag` are either of the type
1035      `unused_type` or describe the character class and conversion to be
1036       applied to any output possibly influenced by either the `lower[]` or
1037       `upper[]` directives.
1038 
1039       The return value defines the outcome of the whole generator. If it is
1040       `false`, no further output is generated, immediately returning `false` from
1041       the calling `real_generator` as well. If it is `true`, normal output
1042       generation continues.]]
1043 ]
1044 
1045 [tip  The easiest way to implement a proper real number formatting policy is
1046       to derive a new type from the type `real_policies<>` while overriding
1047       the aspects of the formatting which need to be changed.]
1048 
1049 
1050 [heading Complexity]
1051 
1052 [:O(N), where `N` is the number of digits needed to represent the generated
1053         real number.]
1054 
1055 [heading Example]
1056 
1057 [note The test harness for the example(s) below is presented in the
1058       __karma_basics_examples__ section.]
1059 
1060 Some includes:
1061 
1062 [reference_karma_includes]
1063 
1064 Some using declarations:
1065 
1066 [reference_karma_using_declarations_real]
1067 
1068 Basic usage of an `double_` generator:
1069 
1070 [reference_karma_real]
1071 
1072 [endsect]
1073 
1074 [/////////////////////////////////////////////////////////////////////////////]
1075 [section:boolean Boolean Generators (`bool_`)]
1076 
1077 [heading Description]
1078 
1079 As you might expect, the `bool_generator` can generate output from boolean
1080 values. The `bool_generator` generator can be used to generate output from
1081 ordinary primitive C/C++ `bool` values or user defined boolean types if
1082 the type follows certain expression requirements (for more information about
1083 the requirements, see
1084 [link spirit.karma.reference.numeric.boolean.additional_requirements below])).
1085 The `bool_generator` is a template class. Template parameters fine tune its
1086 behavior.
1087 
1088 [heading Header]
1089 
1090     // forwards to <boost/spirit/home/karma/numeric/bool.hpp>
1091     #include <boost/spirit/include/karma_bool.hpp>
1092 
1093 Also, see __include_structure__.
1094 
1095 [heading Namespace]
1096 
1097 [table
1098     [[Name]]
1099     [[`boost::spirit::lit           // alias: boost::spirit::karma::lit`]]
1100     [[`boost::spirit::bool_         // alias: boost::spirit::karma::bool_`]]
1101     [[`boost::spirit::true_         // alias: boost::spirit::karma::true_`]]
1102     [[`boost::spirit::false_        // alias: boost::spirit::karma::false_`]]
1103 ]
1104 
1105 [note `lit` is reused by the [karma_string String Generators], the
1106       __karma_char__, and the Numeric Generators. In
1107       general, a char generator is created when you pass in a
1108       character, a string generator is created when you pass in a string, and a
1109       numeric generator is created when you use a numeric (boolean) literal.]
1110 
1111 [heading Synopsis]
1112 
1113     template <
1114         typename B
1115       , unsigned Policies>
1116     struct bool_generator;
1117 
1118 [heading Template parameters]
1119 
1120 [table
1121     [[Parameter]    [Description]                       [Default]]
1122     [[`B`]          [The boolean base type of the
1123                      boolean generator.]                [`bool`]]
1124     [[`Policies`]   [The policies to use while
1125                      converting the boolean.]           [`bool_policies<B>`]]
1126 ]
1127 
1128 [heading Model of]
1129 
1130 [:__primitive_generator_concept__]
1131 
1132 [variablelist Notation
1133     [[`b`]              [Boolean literal, or a __karma_lazy_argument__ that
1134                          evaluates to a boolean value of type `B`]]
1135     [[`B`]              [Type of `b`: any type usable as a boolean, or in case
1136                          of a __karma_lazy_argument__, its return value]]
1137 ]
1138 
1139 [heading Expression Semantics]
1140 
1141 Semantics of an expression is defined only where it differs from, or is
1142 not defined in __primitive_generator_concept__.
1143 
1144 [table
1145     [[Expression]       [Semantics]]
1146     [[`lit(b)`]         [Generate the boolean literal `b` using the default
1147                          formatting (`false` is generated as `"false"`, and
1148                          `true` is generated as `"true"`). This generator never
1149                          fails (unless the underlying output stream reports an error).]]
1150     [[`bool_`]          [Generate the boolean value provided by a mandatory
1151                          attribute using the default formatting (`false` is
1152                          generated as `"false"`, and `true` is generated as
1153                          `"true"`). This generator never fails (unless the
1154                          underlying output stream reports an error).]]
1155     [[`bool_(b)`]       [Generate the boolean value provided by the
1156                          immediate literal value the generator is initialized
1157                          from using the default formatting (`false` is
1158                          generated as `"false"`, and `true` is generated as
1159                          `"true"`). If this generator has an associated
1160                          attribute it succeeds only if the attribute
1161                          is equal to the immediate literal (unless the
1162                          underlying output stream reports an error). Otherwise
1163                          this generator fails and does not generate any output.]]
1164     [[`true_`]          [Generate `"true"`. If this generator has an associated
1165                          attribute it succeeds only if the attribute
1166                          is `true` as well (unless the underlying output stream
1167                          reports an error).]]
1168     [[`false_`]         [Generate `"false"`. If this generator has an associated
1169                          attribute it succeeds only if the attribute
1170                          is `false` as well (unless the underlying output stream
1171                          reports an error).]]
1172 ]
1173 
1174 All generators listed in the table above (except `lit(num)`) are predefined
1175 specializations of the `bool_generator<B, Policies>` basic boolean generator
1176 type described below. It is possible to directly use this type to create
1177 boolean generators using a wide range of formatting options.
1178 
1179 [table
1180     [[Expression]       [Semantics]]
1181     [
1182 [``bool_generator<
1183     B, Policies
1184 >()``]                  [Generate the boolean of type `B` provided
1185                          by a mandatory attribute using the specified `Policies`
1186                          This generator never fails (unless the underlying
1187                          output stream reports an error).]]
1188     [
1189 [``bool_generator<
1190     B, Policies
1191 >()(b)``]               [Generate the boolean of type `B` provided
1192                          by the immediate literal value the generator is
1193                          initialized from, using the specified `Policies`. If
1194                          this generator has an associated attribute it succeeds
1195                          only if the attribute is equal to the
1196                          immediate literal (unless the underlying output
1197                          stream reports an error). Otherwise this generator
1198                          fails and does not generate any output.]]
1199 ]
1200 
1201 [note   All boolean generators properly respect the [karma_upperlower `upper`]
1202         and [karma_upperlower `lower`] directives.]
1203 
1204 [heading Additional Requirements]
1205 
1206 The following lists enumerate the requirements which must be met in order to
1207 use a certain type `B` to instantiate and use a `bool_generator<B, Policies>`.
1208 
1209 The type `B`:
1210 
1211 * must be (safely) convertible to `bool`
1212 
1213 [heading Attributes]
1214 
1215 [table
1216     [[Expression]       [Attribute]]
1217     [[`bool_(b)`]       [__unused__]]
1218     [[`bool_`]          [`bool`, attribute is mandatory (otherwise
1219                          compilation will fail)]]
1220     [[`bool_(b)`]       [`bool`, attribute is optional, if it is
1221                          supplied, the generator compares the attribute with
1222                          `b` and succeeds only if both are equal, failing
1223                          otherwise.]]
1224 
1225     [
1226 [``bool_generator<
1227     B, Policies
1228 >()``]                  [`B`, attribute is mandatory (otherwise compilation
1229                          will fail)]]
1230     [
1231 [``bool_generator<
1232     B, Policies
1233 >()(b)``]               [`B`, attribute is optional, if it is supplied, the
1234                          generator compares the attribute with `b` and
1235                          succeeds only if both are equal, failing otherwise.]]
1236 ]
1237 
1238 [note  In addition to their usual attribute of type `B` all listed generators
1239        accept an instance of a `boost::optional<B>` as well. If the
1240        `boost::optional<>` is initialized (holds a value) the generators behave
1241        as if their attribute was an instance of `B` and emit the value stored
1242        in the `boost::optional<>`. Otherwise the generators will fail.]
1243 
1244 [heading Boolean Formatting Policies]
1245 
1246 If special formatting of a boolean is needed, overload
1247 the policy class `bool_policies<B>` and use it as a template
1248 parameter to the `bool_generator<>` boolean generator. For instance:
1249 
1250     struct special_bool_policy : karma::bool_policies<>
1251     {
1252         template <typename CharEncoding, typename Tag
1253           , typename OutputIterator>
1254         static bool generate_false(OutputIterator& sink, bool b)
1255         {
1256             // we want to spell the names of false as eurt (true backwards)
1257             return string_inserter<CharEncoding, Tag>::call(sink, "eurt");
1258         }
1259     };
1260 
1261     typedef karma::bool_generator<special_bool_policy> backwards_bool_type;
1262     backwards_bool_type const backwards_bool;
1263 
1264     karma::generate(sink, backwards_bool, true);    // will output: true
1265     karma::generate(sink, backwards_bool(false));   // will output: uert
1266 
1267 The template parameter `B` should be the type to be formatted using the
1268 overloaded policy type. At the same time `B` will be used as the attribute
1269 type of the created real number generator. The default for `B` is `bool`.
1270 
1271 
1272 [heading Boolean Formatting Policy Expression Semantics]
1273 
1274 A boolean formatting policy should expose the following:
1275 
1276 [table
1277 [[Expression][Description]]
1278 [   [``
1279         template <typename Inserter
1280           , typename OutputIterator
1281           , typename Policies>
1282         bool call (OutputIterator& sink, Num n
1283           , Policies const& p);
1284     ``]
1285     [This is the main function used to generate the output for a boolean.
1286      It is called by the boolean generator in order to perform the
1287      conversion. In theory all of the work can be implemented here, but the
1288      easiest way is to use existing functionality provided by the type specified
1289      by the template parameter `Inserter`. The default implementation of this
1290      functions is:
1291      ``
1292           template <typename Inserter, typename OutputIterator
1293             , typename Policies>
1294           static bool
1295           call (OutputIterator& sink, B b, Policies const& p)
1296           {
1297               return Inserter::call_n(sink, b, p);
1298           }
1299      ``
1300       `sink` is the output iterator to use for generation
1301 
1302       `b` is the boolean to convert
1303 
1304       `p` is the instance of the policy type used to instantiate this real
1305            number generator.
1306     ]]
1307 [   [``
1308         template <typename CharEncoding,
1309             typename Tag, typename OutputIterator>
1310         bool generate_false(
1311             OutputIterator& sink, B b);
1312     ``]
1313     [This function is called to generate the boolean if it is `false`.
1314 
1315      `sink` is the output iterator to use for generation
1316 
1317      `b` is the boolean to convert (the value is `false`).
1318 
1319      The template parameters `CharEncoding` and `Tag` are either of the type
1320      `unused_type` or describe the character class and conversion to be
1321      applied to any output possibly influenced by either the `lower[]` or
1322      `upper[]` directives.
1323 
1324       The return value defines the outcome of the whole generator. ]]
1325 [   [``
1326         template <typename CharEncoding,
1327             typename Tag, typename OutputIterator>
1328         bool generate_true(
1329             OutputIterator& sink, B b);
1330     ``]
1331     [This function is called to generate the boolean if it is `true`.
1332 
1333      `sink` is the output iterator to use for generation
1334 
1335      `b` is the boolean to convert (the value is `true`).
1336 
1337      The template parameters `CharEncoding` and `Tag` are either of the type
1338      `unused_type` or describe the character class and conversion to be
1339      applied to any output possibly influenced by either the `lower[]` or
1340      `upper[]` directives.
1341 
1342       The return value defines the outcome of the whole generator. ]]
1343 ]
1344 
1345 [heading Complexity]
1346 
1347 [:O(N), where `N` is the number of characters needed to represent the generated
1348  boolean.]
1349 
1350 [heading Example]
1351 
1352 [note The test harness for the example(s) below is presented in the
1353       __karma_basics_examples__ section.]
1354 
1355 Some includes:
1356 
1357 [reference_karma_includes]
1358 
1359 Some using declarations:
1360 
1361 [reference_karma_using_declarations_bool]
1362 
1363 Basic usage of an `bool_` generator:
1364 
1365 [reference_karma_bool]
1366 
1367 [endsect]
1368 
1369 [endsect]
1370