| [/============================================================================== |
| Copyright (C) 2001-2010 Hartmut Kaiser |
| Copyright (C) 2001-2010 Joel de Guzman |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| ===============================================================================/] |
| |
| [section:numeric Numeric] |
| |
| The library includes a couple of predefined objects for generating booleans, |
| signed and unsigned integers, and real numbers. These generators are fully |
| parametric. Most of the important aspects of numeric generation can be |
| finely adjusted to suit. This includes the radix base, the exponent, the |
| fraction etc. Policies control the real number generators' behavior. There are |
| some predefined policies covering the most common real number formats but the |
| user can supply her own when needed. |
| |
| The numeric parsers are fine tuned (employing loop unrolling and |
| extensive template metaprogramming) with exceptional performance that |
| rivals the low level C functions such as `ltoa`, `ssprintf`, and `_gcvt`. |
| Benchmarks reveal up to 2X speed over the C counterparts (see here: |
| __sec_karma_numeric_performance__). This goes to show that you can write |
| extremely tight generic C++ code that rivals, if not surpasses C. |
| |
| [heading Module Header] |
| |
| // forwards to <boost/spirit/home/karma/numeric.hpp> |
| #include <boost/spirit/include/karma_numeric.hpp> |
| |
| Also, see __include_structure__. |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:unsigned_int Unsigned Integer Number Generators (`uint_`, etc.)] |
| |
| [heading Description] |
| |
| The `uint_generator` class is the simplest among the members of the |
| numerics package. The `uint_generator` can generate unsigned integers of |
| arbitrary length and size. The `uint_generator` generator can be used to |
| generate ordinary primitive C/C++ integers or even user defined scalars such as |
| bigints (unlimited precision integers) if the type follows |
| certain expression requirements (for more information about the requirements, see |
| [link spirit.karma.reference.numeric.unsigned_int.additional_requirements below])). |
| The `uint_generator` is a template class. Template parameters fine tune its behavior. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/numeric/uint.hpp> |
| #include <boost/spirit/include/karma_uint.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::lit // alias: boost::spirit::karma::lit`]] |
| [[`boost::spirit::bin // alias: boost::spirit::karma::bin`]] |
| [[`boost::spirit::oct // alias: boost::spirit::karma::oct`]] |
| [[`boost::spirit::hex // alias: boost::spirit::karma::hex`]] |
| [[`boost::spirit::ushort_ // alias: boost::spirit::karma::ushort_`]] |
| [[`boost::spirit::ulong_ // alias: boost::spirit::karma::ulong_`]] |
| [[`boost::spirit::uint_ // alias: boost::spirit::karma::uint_`]] |
| [[`boost::spirit::ulong_long // alias: boost::spirit::karma::ulong_long`]] |
| ] |
| |
| [note The generators `ulong_long` and `ulong_long(num)` are only available on |
| platforms where the preprocessor constant `BOOST_HAS_LONG_LONG` is |
| defined (i.e. on platforms having native support for `unsigned long long` |
| (64 bit) unsigned integer types).] |
| |
| [note `lit` is reused by the [karma_string String Generators], the |
| __karma_char__, and the Numeric Generators. In |
| general, a char generator is created when you pass in a |
| character, a string generator is created when you pass in a string, and a |
| numeric generator is created when you use a numeric literal.] |
| |
| [heading Synopsis] |
| |
| template < |
| typename Num |
| , unsigned Radix> |
| struct uint_generator; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Num`] [The numeric base type of the |
| numeric generator.] [`unsigned int`]] |
| [[`Radix`] [The radix base. This can be |
| either 2: binary, 8: octal, |
| 10: decimal and 16: hexadecimal.] [10]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`num`] [Numeric literal, any unsigned integer value, or |
| a __karma_lazy_argument__ that evaluates to an |
| unsigned integer value of type `Num`]] |
| [[`Num`] [Type of `num`: any unsigned integer type, or in case |
| of a __karma_lazy_argument__, its return value]] |
| [[`Radix`] [An integer literal specifying the required radix for |
| the output conversion. Valid values are `2`, `8`, `10`, |
| and `16`.]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`lit(num)`] [Generate the unsigned integer literal `num` using the |
| default formatting (radix is 10). This generator never |
| fails (unless the underlying output stream reports |
| an error).]] |
| [ |
| [``ushort |
| uint |
| ulong |
| ulong_long``] [Generate the unsigned integer provided by a mandatory |
| attribute using the default formatting (radix is 10). |
| This generator never fails (unless the underlying |
| output stream reports an error).]] |
| [ |
| [``ushort(num) |
| uint(num) |
| ulong(num) |
| ulong_long(num)``] [Generate the unsigned integer provided by the |
| immediate literal value the generator is initialized |
| from using the default formatting (radix is 10). If |
| this generator has an associated attribute it succeeds |
| only if the attribute is equal to the |
| immediate literal (unless the underlying output |
| stream reports an error). Otherwise this generator |
| fails and does not generate any output.]] |
| [ |
| [``bin |
| oct |
| hex``] [Generate the unsigned integer provided by a mandatory |
| attribute using the default formatting and the |
| corresponding radix (`bin`: radix is 2, `oct`: radix is 8, |
| `hex`: radix is 16). This generator never fails (unless |
| the underlying output stream reports an error).]] |
| [ |
| [``bin(num) |
| oct(num) |
| hex(num)``] [Generate the unsigned integer provided by the |
| immediate literal value the generator is initialized |
| from using the default formatting and the |
| corresponding radix (`bin`: radix is 2, `oct`: |
| radix is 8, `hex`: radix is 16). If |
| this generator has an associated attribute it succeeds |
| only if the attribute is equal to the |
| immediate literal (unless the underlying output |
| stream reports an error). Otherwise this generator |
| fails and does not generate any output.]] |
| ] |
| |
| All generators listed in the table above (except `lit(num)`) are predefined |
| specializations of the `uint_generator<Num, Radix>` basic unsigned integer |
| number generator type described below. It is possible to directly use this |
| type to create unsigned integer generators using a wide range of formatting |
| options. |
| |
| [table |
| [[Expression] [Semantics]] |
| [ |
| [``uint_generator< |
| Num, Radix |
| >()``] |
| [Generate the unsigned integer of type `Num` provided |
| by a mandatory attribute using the specified `Radix` |
| (possible values are `2`, `8`, `10`, and `16`, the |
| default value is `10`).This generator never fails |
| (unless the underlying output stream reports an |
| error).]] |
| [ |
| [``uint_generator< |
| Num, Radix |
| >()(num)``] |
| [Generate the unsigned integer of type `Num` provided |
| by the immediate literal value the generator is |
| initialized from, using the specified `Radix` |
| (possible values are `2`, `8`, `10`, and `16`, the |
| default value is `10`). If this generator has an |
| associated attribute it succeeds only if the |
| attribute is equal to the immediate literal (unless |
| the underlying output stream reports an error). |
| Otherwise this generator fails and does not generate |
| any output.]] |
| ] |
| |
| [heading Additional Requirements] |
| |
| The following lists enumerate the requirements which must be met in order to |
| use a certain type `Num` to instantiate and use a |
| `uint_generator<Num, Radix>`. |
| |
| If `boost::is_integral<Num>::value` is `true` the type `Num` must have defined: |
| |
| * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=` |
| * numeric operators for: `+`, `-`, `/`, `*`, and `%` |
| |
| If `boost::is_integral<Num>::value` is `false` the type `Num` must have defined: |
| |
| * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=` |
| * numeric operators for: `+`, `-`, `/`, `*`, and `%` |
| * helper functions implementing the interface and the semantics of: `std::fmod`, |
| `std::pow`, `std::lround`, `std::ltrunc`, `std::floor`, and `std::ceil`. |
| These need to be defined in a way so that they will be found using argument |
| dependent lookup (ADL). |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`lit(num)`] [__unused__]] |
| [[`ushort`] [`unsigned short`, attribute is mandatory (otherwise |
| compilation will fail)]] |
| [[`ushort(num)`] [`unsigned short`, attribute is optional, if it is |
| supplied, the generator compares the attribute with |
| `num` and succeeds only if both are equal, failing |
| otherwise.]] |
| |
| [[`uint`] [`unsigned int`, attribute is mandatory (otherwise |
| compilation will fail)]] |
| [[`uint(num)`] [`unsigned int`, attribute is optional, if it is |
| supplied, the generator compares the attribute with |
| `num` and succeeds only if both are equal, failing |
| otherwise.]] |
| |
| [[`ulong`] [`unsigned long`, attribute is mandatory (otherwise |
| compilation will fail)]] |
| [[`ulong(num)`] [`unsigned long`, attribute is optional, if it is |
| supplied, the generator compares the attribute with |
| `num` and succeeds only if both are equal, failing |
| otherwise.]] |
| |
| [[`ulong_long`] [`unsigned long long`, attribute is mandatory |
| (otherwise compilation will fail)]] |
| [[`ulong_long(num)`][`unsigned long long`, attribute is optional, if it is |
| supplied, the generator compares the attribute with |
| `num` and succeeds only if both are equal, failing |
| otherwise.]] |
| |
| [ |
| [``bin |
| oct |
| hex``] [`unsigned int`, attribute is mandatory |
| (otherwise compilation will fail)]] |
| [ |
| [``bin(num) |
| oct(num) |
| hex(num)``] [`unsigned int`, attribute is optional, if it is |
| supplied, the generator compares the attribute with |
| `num` and succeeds only if both are equal, failing |
| otherwise.]] |
| |
| [ |
| [``uint_generator< |
| Num, Radix |
| >()``] [`Num`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [ |
| [``uint_generator< |
| Num, Radix |
| >()(num)``] [`Num`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| ] |
| |
| [note In addition to their usual attribute of type `Num` all listed generators |
| accept an instance of a `boost::optional<Num>` as well. If the |
| `boost::optional<>` is initialized (holds a value) the generators behave |
| as if their attribute was an instance of `Num` and emit the value stored |
| in the `boost::optional<>`. Otherwise the generators will fail.] |
| |
| [heading Complexity] |
| |
| [:O(N), where `N` is the number of digits needed to represent the generated |
| integer number] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_uint] |
| |
| Basic usage of an `uint` generator: |
| |
| [reference_karma_uint] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:signed_int Signed Integer Number Generators (`int_`, etc.)] |
| |
| [heading Description] |
| |
| The `int_generator` can generate signed integers of arbitrary length and size. |
| This is almost the same as the `uint_generator`. The only difference is the |
| additional task of generating the `'+'` or `'-'` sign preceding the number. |
| The class interface is the same as that of the `uint_generator`. |
| |
| The `int_generator` generator can be used to emit ordinary primitive C/C++ |
| integers or even user defined scalars such as bigints (unlimited |
| precision integers) if the type follows certain expression |
| requirements (for more information about the requirements, see |
| [link spirit.karma.reference.numeric.signed_int.additional_requirements below]). |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/numeric/int.hpp> |
| #include <boost/spirit/include/karma_int.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::lit // alias: boost::spirit::karma::lit`]] |
| [[`boost::spirit::short_ // alias: boost::spirit::karma::short_`]] |
| [[`boost::spirit::int_ // alias: boost::spirit::karma::int_`]] |
| [[`boost::spirit::long_ // alias: boost::spirit::karma::long_`]] |
| [[`boost::spirit::long_long // alias: boost::spirit::karma::long_long`]] |
| ] |
| |
| [note The generators `long_long` and `long_long(num)` are only available on |
| platforms where the preprocessor constant `BOOST_HAS_LONG_LONG` is |
| defined (i.e. on platforms having native support for `long long` |
| (64 bit) integer types).] |
| |
| [note `lit` is reused by the [karma_string String Generators], the |
| __karma_char__, and the Numeric Generators. In |
| general, a char generator is created when you pass in a |
| character, a string generator is created when you pass in a string, and a |
| numeric generator is created when you use a numeric literal.] |
| |
| [heading Synopsis] |
| |
| template < |
| typename T |
| , unsigned Radix |
| , bool force_sign> |
| struct int_generator; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`T`] [The numeric base type of the |
| numeric parser.] [`int`]] |
| [[`Radix`] [The radix base. This can be |
| either 2: binary, 8: octal, |
| 10: decimal and 16: hexadecimal.] [10]] |
| [[`force_sign`] [If `true`, all numbers will |
| have a sign (space for zero)] [`false`]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`num`] [Numeric literal, any signed integer value, or |
| a __karma_lazy_argument__ that evaluates to a signed |
| integer value of type `Num`]] |
| [[`Num`] [Type of `num`: any signed integer type]] |
| [[`Radix`] [A constant integer literal specifying the required |
| radix for the output conversion. Valid values are `2`, |
| `8`, `10`, and `16`.]] |
| [[`force_sign`] [A constant boolean literal specifying whether the |
| generated number should always have a sign (`'+'` for |
| positive numbers, `'-'` for negative numbers and a |
| '` `' for zero).]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`lit(num)`] [Generate the integer literal `num` using the default |
| formatting (radix is 10, sign is only printed for |
| negative literals). This generator never fails (unless |
| the underlying output stream reports an error).]] |
| [ |
| [``short_ |
| int_ |
| long_ |
| long_long``] [Generate the integer provided by a mandatory attribute |
| using the default formatting (radix is 10, sign is |
| only printed for negative literals). This generator |
| never fails (unless the underlying output stream |
| reports an error).]] |
| [ |
| [``short_(num) |
| int_(num) |
| long_(num) |
| long_long(num)``] [Generate the integer provided by the immediate literal |
| value the generator is initialized from using the |
| default formatting (radix is 10, sign is only printed |
| for negative literals). If this generator has an |
| associated attribute it succeeds only if the |
| attribute is equal to the immediate literal (unless |
| the underlying output stream reports an error). |
| Otherwise this generator fails and does not generate |
| any output.]] |
| ] |
| |
| All generators listed in the table above (except `lit(num)`) are predefined |
| specializations of the `int_generator<Num, Radix, force_sign>` basic integer |
| number generator type described below. It is possible to directly use this |
| type to create integer generators using a wide range of formatting options. |
| |
| [table |
| [[Expression] [Semantics]] |
| [ |
| [``int_generator< |
| Num, Radix, force_sign |
| >()``] |
| [Generate the integer of type `Num` provided by a |
| mandatory attribute using the specified `Radix` |
| (possible values are `2`, `8`, `10`, and `16`, the |
| default value is `10`). If `force_sign` is `false` |
| (the default), a sign is only printed for negative |
| literals. If `force_sign` is `true`, all numbers will |
| be printed using a sign, i.e. `'-'` for negative |
| numbers, `'+'` for positive numbers, and `' '` for |
| zeros. This generator never fails (unless the |
| underlying output stream reports an error).]] |
| [ |
| [``int_generator< |
| Num, Radix, force_sign |
| >()(num)``] |
| [Generate the integer of type `Num` provided by the |
| immediate literal value the generator is initialized |
| from, using the specified `Radix` (possible values are |
| `2`, `8`, `10`, and `16`, the default value is `10`). |
| If `force_sign` is `false` (the default), a sign is |
| only printed for negative literals. If `force_sign` is |
| `true`, all numbers will be printed using a sign, i.e. |
| `'-'` for negative numbers, `'+'` for positive numbers, |
| and `' '` for zeros. If this generator has an |
| associated attribute it succeeds only if the |
| attribute is equal to the immediate literal (unless |
| the underlying output stream reports an error). |
| Otherwise this generator fails and does not generate |
| any output.]] |
| ] |
| |
| [heading Additional Requirements] |
| |
| The following lists enumerate the requirements which must be met in order to |
| use a certain type `Num` to instantiate and use a |
| `int_generator<Num, Radix, force_sign>`. |
| |
| If `boost::is_integral<Num>::value` is `true` the type `Num` must have defined: |
| |
| * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=` |
| * numeric operators for: `+`, `-`, `/`, `*`, `%`, and unary `-` |
| |
| If `boost::is_integral<Num>::value` is `false` the type `Num` must have defined: |
| |
| * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=` |
| * numeric operators for: `+`, `-`, `/`, `*`, `%`, and unary `-` |
| * helper functions implementing the interface and the semantics of: `std::fmod`, |
| `std::fabs`, `std::pow`, `std::lround`, `std::ltrunc`, `std::floor`, and |
| `std::ceil`. These need to be defined in a way so that they will be found |
| using argument dependent lookup (ADL). |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`lit(num)`] [__unused__]] |
| [[`short_`] [`short`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`short_(num)`] [`short`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| |
| [[`int_`] [`int`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`int_(num)`] [`int`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| |
| [[`long_`] [`long`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`long_(num)`] [`long`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| |
| [[`long_long`] [`long long`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`long_long(num)`] [`long long`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| |
| [ |
| [``int_generator< |
| Num, Radix, force_sign |
| >()``] [`Num`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [ |
| [``int_generator< |
| Num, Radix, force_sign |
| >()(num)``] [`Num`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| ] |
| |
| [note In addition to their usual attribute of type `Num` all listed generators |
| accept an instance of a `boost::optional<Num>` as well. If the |
| `boost::optional<>` is initialized (holds a value) the generators behave |
| as if their attribute was an instance of `Num` and emit the value stored |
| in the `boost::optional<>`. Otherwise the generators will fail.] |
| |
| [heading Complexity] |
| |
| [:O(N), where `N` is the number of digits needed to represent the generated |
| integer number] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_int] |
| |
| Basic usage of an `int_` generator: |
| |
| [reference_karma_int] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:real_number Real Number Generators (`float_`, `double_`, etc.)] |
| |
| [heading Description] |
| |
| The `real_generator` can generate real numbers of arbitrary length and size |
| limited by its template parameter, `Num`. The numeric base type `Num` can be |
| a user defined numeric type such as fixed_point (fixed point reals) and |
| bignum (unlimited precision numbers) if the type follows certain |
| expression requirements (for more information about the requirements, see |
| [link spirit.karma.reference.numeric.real_number.additional_requirements below]). |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/numeric/real.hpp> |
| #include <boost/spirit/include/karma_real.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::lit // alias: boost::spirit::karma::lit`]] |
| [[`boost::spirit::float_ // alias: boost::spirit::karma::float_`]] |
| [[`boost::spirit::double_ // alias: boost::spirit::karma::double_`]] |
| [[`boost::spirit::long_double // alias: boost::spirit::karma::long_double`]] |
| ] |
| |
| [note `lit` is reused by the [karma_string String Generators], the |
| __karma_char__, and the Numeric Generators. In |
| general, a char generator is created when you pass in a |
| character, a string generator is created when you pass in a string, and a |
| numeric generator is created when you use a numeric literal.] |
| |
| [heading Synopsis] |
| |
| template <typename Num, typename RealPolicies> |
| struct real_generator; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Num`] [The type of the real number to generate.] [`double`]] |
| [[`RealPolicies`] [The policies to use while |
| converting the real number.] [`real_policies<Num>`]] |
| ] |
| |
| For more information about the type `RealPolicies` see |
| [link spirit.karma.reference.numeric.real_number.real_number_formatting_policies below]. |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`num`] [Numeric literal, any real number value, or |
| a __karma_lazy_argument__ that evaluates to a real |
| number value of type `Num`]] |
| [[`Num`] [Type of `num`: any real number type]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`lit(num)`] [Generate the real number literal `num` using the |
| default formatting (no trailing zeros, `fixed` |
| representation for numbers `fabs(n) <= 1e5 && fabs(n) > 1e-3`, |
| scientific representation otherwise, 3 fractional digits, |
| sign is only printed for negative literals). This |
| generator never fails (unless the underlying output |
| stream reports an error).]] |
| [ |
| [``float_ |
| double_ |
| long_double``] [Generate the real number provided by a |
| mandatory attribute using the default formatting (no |
| trailing zeros, `fixed` representation for numbers |
| `fabs(n) <= 1e5 && fabs(n) > 1e-3`, scientific |
| representation otherwise, 3 fractional digits, |
| sign is only printed for negative literals). This |
| generator never fails (unless the underlying output |
| stream reports an error).]] |
| [ |
| [``float_(num) |
| double_(num) |
| long_double(num)``] [Generate the real point number provided by the |
| immediate literal value the generator is initialized |
| from using the default formatting (no trailing zeros, |
| `fixed` representation for numbers |
| `fabs(n) <= 1e5 && fabs(n) > 1e-3`, scientific |
| representation otherwise, 3 fractional digits, sign is |
| only printed for negative literals). If this generator |
| has an associated attribute it succeeds only if |
| the attribute is equal to the immediate literal (unless |
| the underlying output stream reports an error). |
| Otherwise this generator fails and does not generate |
| any output.]] |
| ] |
| |
| All generators listed in the table above (except `lit(num)`) are predefined |
| specializations of the `real_generator<Num, RealPolicies>` basic real |
| number generator type described below. It is possible to directly use this |
| type to create real number generators using a wide range of formatting |
| options. |
| |
| [table |
| [[Expression] [Semantics]] |
| [ |
| [``real_generator< |
| Num, RealPolicies |
| >()``] |
| [Generate the real number of type `Num` |
| provided by a mandatory attribute using the specified |
| `RealPolicies`. This generator never fails |
| (unless the underlying output stream reports an |
| error).]] |
| [ |
| [``real_generator< |
| Num, RealPolicies |
| >()(num)``] |
| [Generate the real number of type `Num` provided by the |
| immediate literal value the generator is initialized |
| from using the specified `RealPolicies`. |
| If this generator has an associated attribute it |
| succeeds only if the attribute is equal to the |
| immediate literal (unless the underlying output stream |
| reports an error). Otherwise this generator fails and |
| does not generate any output.]] |
| ] |
| |
| [heading Additional Requirements] |
| |
| The following list enumerates the requirements which must be met in order to |
| use a certain type `Num` to instantiate a `real_generator<Num, Policies>`. |
| |
| In order to be usable as the first template parameter for `real_generator<>` |
| the type `Num` must have defined: |
| |
| * comparison operators for: `<`, `<=`, `==`, `!=`, `>`, and `>=` |
| * numeric operators for: `+`, `-`, `/`, `*`, and `%` |
| * functions implementing the interface and the semantics of: `std::fmod`, |
| `std::pow`, `std::log10`, `std::lround`, `std::ltrunc`, `std::modf`, |
| `std::floor`, and `std::ceil`. These need to be defined in a way so that they |
| will be found using argument dependent lookup (ADL). |
| * a valid specialization of the type `std::numeric_limits<Num>` allowing for |
| numeric property inspection. |
| |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`lit(num)`] [__unused__]] |
| |
| [[`float_`] [`float`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`float_(num)`] [`float_`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| |
| [[`double_`] [`double`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [[`double_(num)`] [`double`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| |
| [[`long_double`] [`long double`, attribute is mandatory (otherwise |
| compilation will fail)]] |
| [[`long_double(num)`][`long double`, attribute is optional, if it is supplied, |
| the generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| [ |
| [``real_generator< |
| Num, Policies |
| >()``] [`Num`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [ |
| [``real_generator< |
| Num, Policies |
| >()(num)``] [`Num`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `num` and |
| succeeds only if both are equal, failing otherwise.]] |
| ] |
| |
| [note In addition to their usual attribute of type `Num` all listed generators |
| accept an instance of a `boost::optional<Num>` as well. If the |
| `boost::optional<>` is initialized (holds a value) the generators behave |
| as if their attribute was an instance of `Num` and emit the value stored |
| in the `boost::optional<>`. Otherwise the generators will fail.] |
| |
| [heading Real Number Formatting Policies] |
| |
| If special formatting of a real number is needed, overload |
| the policy class `real_policies<Num>` and use it as a template |
| parameter to the `real_generator<>` real number generator. For instance: |
| |
| // define a new real number formatting policy |
| template <typename Num> |
| struct scientific_policy : real_policies<Num> |
| { |
| // we want the numbers always to be in scientific format |
| static int floatfield(Num n) { return fmtflags::scientific; } |
| }; |
| |
| // define a new generator type based on the new policy |
| typedef real_generator<double, scientific_policy<double> > science_type; |
| science_type const scientific = science_type(); |
| |
| // use the new generator |
| generate(sink, science_type(), 1.0); // will output: 1.0e00 |
| generate(sink, scientific, 0.1); // will output: 1.0e-01 |
| |
| The template parameter `Num` should be the type to be formatted using the |
| overloaded policy type. At the same time `Num` will be used as the attribute |
| type of the created real number generator. |
| |
| |
| [heading Real Number Formatting Policy Expression Semantics] |
| |
| A real number formatting policy should expose the following variables and |
| functions: |
| |
| [table |
| [[Expression][Description]] |
| [ [`` |
| template <typename Inserter |
| , typename OutputIterator |
| , typename Policies> |
| bool call (OutputIterator& sink, Num n |
| , Policies const& p); |
| ``] |
| [This is the main function used to generate the output for a real |
| number. It is called by the real generator in order to perform the |
| conversion. In theory all of the work can be implemented here, but the |
| easiest way is to use existing functionality provided by the type specified |
| by the template parameter `Inserter`. The default implementation of this |
| functions is: |
| `` |
| template <typename Inserter, typename OutputIterator |
| , typename Policies> |
| static bool |
| call (OutputIterator& sink, Num n, Policies const& p) |
| { |
| return Inserter::call_n(sink, n, p); |
| } |
| `` |
| `sink` is the output iterator to use for generation |
| |
| `n` is the real number to convert |
| |
| `p` is the instance of the policy type used to instantiate this real |
| number generator. |
| ]] |
| [ [`` |
| bool force_sign(Num n); |
| ``] |
| [The default behavior is to not to require generating a sign. If the function |
| `force_sign()` returns true, then all generated numbers will have a |
| sign (`'+'` or `'-'`, zeros will have a space instead of a sign). |
| |
| `n` is the real number to output. This can be used to |
| adjust the required behavior depending on the value of this number.]] |
| [ [`` |
| bool trailing_zeros(Num n); |
| ``] |
| [Return whether trailing zero digits have to be emitted in the fractional |
| part of the output. If set, this flag instructs the real number |
| generator to emit trailing zeros up to the required precision digits (as |
| returned by the `precision()` function). |
| |
| `n` is the real number to output. This can be used to |
| adjust the required behavior depending on the value of this number.]] |
| [ [`` |
| int floatfield(Num n); |
| ``] |
| [Decide, which representation type to use in the generated output. |
| |
| By default all numbers having an absolute value of zero or in between |
| `0.001` and `100000` will be generated using the fixed format, all others |
| will be generated using the scientific representation. |
| |
| The `trailing_zeros()` can be used to force the output of trailing zeros |
| in the fractional part up to the number of digits returned by the |
| `precision()` member function. The default is not to generate the trailing |
| zeros. |
| |
| `n` is the real number to output. This can be used to |
| adjust the formatting flags depending on the value of |
| this number. |
| |
| The return value has to be either `fmtflags::scientific` (generate real |
| number values in scientific notation) or `fmtflags::fixed` (generate |
| real number values in fixed-point notation). |
| ]] |
| [ [`` |
| unsigned precision(Num n); |
| ``] |
| [Return the maximum number of decimal digits to generate in the |
| fractional part of the output. |
| |
| `n` is the real number to output. This can be used to |
| adjust the required precision depending on the value of this number. If |
| the trailing zeros flag is specified the fractional part of the output will |
| be 'filled' with zeros, if appropriate. |
| |
| *Note:* If the trailing_zeros flag is not in effect additional semantics |
| apply. See the description for the `fraction_part()` function below. |
| Moreover, this precision will be limited to the value of |
| `std::numeric_limits<T>::digits10 + 1`.]] |
| [ [`` |
| template <bool ForceSign, |
| typename OutputIterator> |
| bool integer_part(OutputIterator& sink |
| , Num n, bool sign, bool force_sign); |
| ``] |
| [This function is called to generate the integer part of the real |
| number. |
| |
| `sink` is the output iterator to use for generation |
| |
| `n` is the absolute value of the integer part of the real |
| number to convert (always non-negative) |
| |
| `sign` is the sign of the overall real number to convert. |
| |
| `force_sign` is a flag indicating whether a sign has to be generated even for |
| non-negative numbers (this is the same as has been returned |
| from the function `force_sign()` described above) |
| |
| The return value defines the outcome of the whole generator. If it is |
| `false`, no further output is generated, immediately returning `false` from |
| the calling `real_generator` as well. If it is `true`, normal output |
| generation continues.]] |
| [ [`` |
| template <typename OutputIterator> |
| bool dot(OutputIterator& sink, Num n, |
| unsigned precision); |
| ``] |
| [This function is called to generate the decimal point. |
| |
| `sink` is the output iterator to use for generation |
| |
| `n` is the fractional part of the real number to convert. Note |
| that this number is scaled such, that it represents the number of units |
| which correspond to the value returned from the `precision()` function |
| earlier. I.e. a fractional part of `0.01234` is represented as `1234` |
| when the function `precision()` returned `5`. |
| |
| `precision` is the number of digits to emit as returned by the function |
| `precision()` described above |
| |
| This is given to allow to decide, whether a decimal point has to be |
| generated at all. |
| |
| *Note:* If the `trailing_zeros` flag is not in effect additional comments |
| apply. See the description for the `fraction_part()` function below. |
| |
| The return value defines the outcome of the whole generator. If it is |
| `false`, no further output is generated, immediately returning `false` from |
| the calling `real_generator` as well. If it is `true`, normal output |
| generation continues.]] |
| [ [`` |
| template <typename OutputIterator> |
| bool fraction_part(OutputIterator& sink, Num n |
| , unsigned adjprec, unsigned precision); |
| ``] |
| [This function is called to generate the fractional part of the number. |
| |
| `sink` is the output iterator to use for generation |
| |
| `n` is the fractional part of the real number to convert. Note |
| that this number is scaled such, that it represents the number of units |
| which correspond to the value returned from the `precision()` function |
| earlier. I.e. a fractional part of `0.01234` is represented as `1234` |
| when the function `precision()` returned `5`. |
| |
| `adjprec` is the corrected number of digits to emit (see note below) |
| |
| `precision` is the number of digits to emit as returned by the function |
| `precision()` described above |
| |
| *Note:* If `trailing_zeros()` returns `false` the `adjprec` |
| parameter will have been corrected from the value the `precision()` |
| function returned earlier (defining the maximal number of fractional |
| digits) in the sense, that it takes into account trailing zeros. I.e. a |
| real number `0.0123` and a value of `5` returned from |
| `precision()` will result in: |
| |
| `trailing_zeros()` returned `false`: `n` will be `123`, and `adjprec` |
| will be `4` (as we need to print `0123`) |
| |
| `trailing_zeros()` returned `true`: `n` will be `1230`, and `adjprec` |
| will be `5` (as we need to print `01230`) |
| |
| The missing preceding zeros in the fractional part have to be supplied |
| by the implementation of this policy function. |
| |
| The return value defines the outcome of the whole generator. If it is |
| `false`, no further output is generated, immediately returning `false` from |
| the calling `real_generator` as well. If it is `true`, normal output |
| generation continues.]] |
| [ [`` |
| template <typename CharEncoding, |
| typename Tag, typename OutputIterator> |
| bool exponent( |
| OutputIterator& sink, long n); |
| ``] |
| [This function is called to generate the exponential part of the number |
| (this is called only if the `floatfield()` function returned the |
| `fmtflags::scientific` flag). |
| |
| `sink` is the output iterator to use for generation |
| |
| `n` is the (signed) exponential part of the real number to convert. |
| |
| The template parameters `CharEncoding` and `Tag` are either of the type |
| `unused_type` or describe the character class and conversion to be |
| applied to any output possibly influenced by either the `lower[]` or |
| `upper[]` directives. |
| |
| The return value defines the outcome of the whole generator. If it is |
| `false`, no further output is generated, immediately returning `false` from |
| the calling `real_generator` as well. If it is `true`, normal output |
| generation continues.]] |
| [ [`` |
| template <typename CharEncoding |
| , typename Tag, typename OutputIterator> |
| bool nan (OutputIterator& sink, Num n |
| , bool force_sign); |
| ``] |
| [This function is called whenever the number to print is a non-normal |
| real number of type `NaN`. |
| |
| `sink` is the output iterator to use for generation |
| |
| `n` is the (signed) real number to convert |
| |
| `force_sign` is a flag indicating whether a sign has to be generated even for |
| non-negative numbers (this is the same as has been returned from |
| the function `force_sign()` described above) |
| |
| The template parameters `CharEncoding` and `Tag` are either of the type |
| `unused_type` or describe the character class and conversion to be |
| applied to any output possibly influenced by either the `lower[]` or |
| `upper[]` directives. |
| |
| The return value defines the outcome of the whole generator. If it is |
| `false`, no further output is generated, immediately returning `false` from |
| the calling `real_generator` as well. If it is `true`, normal output |
| generation continues.]] |
| [ [`` |
| template <typename CharEncoding |
| , typename Tag, typename OutputIterator> |
| bool inf (OutputIterator& sink, Num n |
| , bool force_sign); |
| ``] |
| [This function is called whenever the number to print is a non-normal |
| real number of type `Inf`. |
| |
| `sink` is the output iterator to use for generation |
| |
| `n` is the (signed) real number to convert |
| |
| `force_sign` is a flag indicating whether a sign has to be generated even for |
| non-negative numbers (this is the same as has been returned from |
| the function `force_sign()` described above) |
| |
| The template parameters `CharEncoding` and `Tag` are either of the type |
| `unused_type` or describe the character class and conversion to be |
| applied to any output possibly influenced by either the `lower[]` or |
| `upper[]` directives. |
| |
| The return value defines the outcome of the whole generator. If it is |
| `false`, no further output is generated, immediately returning `false` from |
| the calling `real_generator` as well. If it is `true`, normal output |
| generation continues.]] |
| ] |
| |
| [tip The easiest way to implement a proper real number formatting policy is |
| to derive a new type from the the type `real_policies<>` while overriding |
| the aspects of the formatting which need to be changed.] |
| |
| |
| [heading Complexity] |
| |
| [:O(N), where `N` is the number of digits needed to represent the generated |
| real number.] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_real] |
| |
| Basic usage of an `double_` generator: |
| |
| [reference_karma_real] |
| |
| [endsect] |
| |
| [/////////////////////////////////////////////////////////////////////////////] |
| [section:boolean Boolean Generators (`bool_`)] |
| |
| [heading Description] |
| |
| As you might expect, the `bool_generator` can generate output from boolean |
| values. The `bool_generator` generator can be used to generate output from |
| ordinary primitive C/C++ `bool` values or user defined boolean types if |
| the type follows certain expression requirements (for more information about |
| the requirements, see |
| [link spirit.karma.reference.numeric.boolean.additional_requirements below])). |
| The `bool_generator` is a template class. Template parameters fine tune its |
| behavior. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/numeric/bool.hpp> |
| #include <boost/spirit/include/karma_bool.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::lit // alias: boost::spirit::karma::lit`]] |
| [[`boost::spirit::bool_ // alias: boost::spirit::karma::bool_`]] |
| [[`boost::spirit::true_ // alias: boost::spirit::karma::true_`]] |
| [[`boost::spirit::false_ // alias: boost::spirit::karma::false_`]] |
| ] |
| |
| [note `lit` is reused by the [karma_string String Generators], the |
| __karma_char__, and the Numeric Generators. In |
| general, a char generator is created when you pass in a |
| character, a string generator is created when you pass in a string, and a |
| numeric generator is created when you use a numeric (boolean) literal.] |
| |
| [heading Synopsis] |
| |
| template < |
| typename B |
| , unsigned Policies> |
| struct bool_generator; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`B`] [The boolean base type of the |
| boolean generator.] [`bool`]] |
| [[`Policies`] [The policies to use while |
| converting the boolean.] [`bool_policies<B>`]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`b`] [Boolean literal, or a __karma_lazy_argument__ that |
| evaluates to a boolean value of type `B`]] |
| [[`B`] [Type of `b`: any type usable as a boolean, or in case |
| of a __karma_lazy_argument__, its return value]] |
| ] |
| |
| [heading Expression Semantics] |
| |
| Semantics of an expression is defined only where it differs from, or is |
| not defined in __primitive_generator_concept__. |
| |
| [table |
| [[Expression] [Semantics]] |
| [[`lit(b)`] [Generate the boolean literal `b` using the default |
| formatting (`false` is generated as `"false"`, and |
| `true` is generated as `"true"`). This generator never |
| fails (unless the underlying output stream reports an error).]] |
| [[`bool_`] [Generate the boolean value provided by a mandatory |
| attribute using the default formatting (`false` is |
| generated as `"false"`, and `true` is generated as |
| `"true"`). This generator never fails (unless the |
| underlying output stream reports an error).]] |
| [[`bool_(b)`] [Generate the boolean value provided by the |
| immediate literal value the generator is initialized |
| from using the default formatting (`false` is |
| generated as `"false"`, and `true` is generated as |
| `"true"`). If this generator has an associated |
| attribute it succeeds only if the attribute |
| is equal to the immediate literal (unless the |
| underlying output stream reports an error). Otherwise |
| this generator fails and does not generate any output.]] |
| [[`true_`] [Generate `"true"`. If this generator has an associated |
| attribute it succeeds only if the attribute |
| is `true` as well (unless the underlying output stream |
| reports an error).]] |
| [[`false_`] [Generate `"false"`. If this generator has an associated |
| attribute it succeeds only if the attribute |
| is `false` as well (unless the underlying output stream |
| reports an error).]] |
| ] |
| |
| All generators listed in the table above (except `lit(num)`) are predefined |
| specializations of the `bool_generator<B, Policies>` basic boolean generator |
| type described below. It is possible to directly use this type to create |
| boolean generators using a wide range of formatting options. |
| |
| [table |
| [[Expression] [Semantics]] |
| [ |
| [``bool_generator< |
| B, Policies |
| >()``] [Generate the boolean of type `B` provided |
| by a mandatory attribute using the specified `Policies` |
| This generator never fails (unless the underlying |
| output stream reports an error).]] |
| [ |
| [``bool_generator< |
| B, Policies |
| >()(b)``] [Generate the boolean of type `B` provided |
| by the immediate literal value the generator is |
| initialized from, using the specified `Policies`. If |
| this generator has an associated attribute it succeeds |
| only if the attribute is equal to the |
| immediate literal (unless the underlying output |
| stream reports an error). Otherwise this generator |
| fails and does not generate any output.]] |
| ] |
| |
| [note All boolean generators properly respect the [karma_upperlower `upper`] |
| and [karma_upperlower `lower`] directives.] |
| |
| [heading Additional Requirements] |
| |
| The following lists enumerate the requirements which must be met in order to |
| use a certain type `B` to instantiate and use a `bool_generator<B, Policies>`. |
| |
| The type `B`: |
| |
| * must be (safely) convertible to `bool` |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`bool_(b)`] [__unused__]] |
| [[`bool_`] [`bool`, attribute is mandatory (otherwise |
| compilation will fail)]] |
| [[`bool_(b)`] [`bool`, attribute is optional, if it is |
| supplied, the generator compares the attribute with |
| `b` and succeeds only if both are equal, failing |
| otherwise.]] |
| |
| [ |
| [``bool_generator< |
| B, Policies |
| >()``] [`B`, attribute is mandatory (otherwise compilation |
| will fail)]] |
| [ |
| [``bool_generator< |
| B, Policies |
| >()(b)``] [`B`, attribute is optional, if it is supplied, the |
| generator compares the attribute with `b` and |
| succeeds only if both are equal, failing otherwise.]] |
| ] |
| |
| [note In addition to their usual attribute of type `B` all listed generators |
| accept an instance of a `boost::optional<B>` as well. If the |
| `boost::optional<>` is initialized (holds a value) the generators behave |
| as if their attribute was an instance of `B` and emit the value stored |
| in the `boost::optional<>`. Otherwise the generators will fail.] |
| |
| [heading Boolean Formatting Policies] |
| |
| If special formatting of a boolean is needed, overload |
| the policy class `bool_policies<B>` and use it as a template |
| parameter to the `bool_generator<>` boolean generator. For instance: |
| |
| struct special_bool_policy : karma::bool_policies<> |
| { |
| template <typename CharEncoding, typename Tag |
| , typename OutputIterator> |
| static bool generate_false(OutputIterator& sink, bool b) |
| { |
| // we want to spell the names of false as eurt (true backwards) |
| return string_inserter<CharEncoding, Tag>::call(sink, "eurt"); |
| } |
| }; |
| |
| typedef karma::bool_generator<special_bool_policy> backwards_bool_type; |
| backwards_bool_type const backwards_bool; |
| |
| karma::generate(sink, backwards_bool, true); // will output: true |
| karma::generate(sink, backwards_bool(false)); // will output: uert |
| |
| The template parameter `B` should be the type to be formatted using the |
| overloaded policy type. At the same time `B` will be used as the attribute |
| type of the created real number generator. The default for `B` is `bool`. |
| |
| |
| [heading Boolean Formatting Policy Expression Semantics] |
| |
| A boolean formatting policy should expose the following: |
| |
| [table |
| [[Expression][Description]] |
| [ [`` |
| template <typename Inserter |
| , typename OutputIterator |
| , typename Policies> |
| bool call (OutputIterator& sink, Num n |
| , Policies const& p); |
| ``] |
| [This is the main function used to generate the output for a boolean. |
| It is called by the boolean generator in order to perform the |
| conversion. In theory all of the work can be implemented here, but the |
| easiest way is to use existing functionality provided by the type specified |
| by the template parameter `Inserter`. The default implementation of this |
| functions is: |
| `` |
| template <typename Inserter, typename OutputIterator |
| , typename Policies> |
| static bool |
| call (OutputIterator& sink, B b, Policies const& p) |
| { |
| return Inserter::call_n(sink, b, p); |
| } |
| `` |
| `sink` is the output iterator to use for generation |
| |
| `b` is the boolean to convert |
| |
| `p` is the instance of the policy type used to instantiate this real |
| number generator. |
| ]] |
| [ [`` |
| template <typename CharEncoding, |
| typename Tag, typename OutputIterator> |
| bool generate_false( |
| OutputIterator& sink, B b); |
| ``] |
| [This function is called to generate the boolean if it is `false`. |
| |
| `sink` is the output iterator to use for generation |
| |
| `b` is the boolean to convert (the value is `false`). |
| |
| The template parameters `CharEncoding` and `Tag` are either of the type |
| `unused_type` or describe the character class and conversion to be |
| applied to any output possibly influenced by either the `lower[]` or |
| `upper[]` directives. |
| |
| The return value defines the outcome of the whole generator. ]] |
| [ [`` |
| template <typename CharEncoding, |
| typename Tag, typename OutputIterator> |
| bool generate_true( |
| OutputIterator& sink, B b); |
| ``] |
| [This function is called to generate the boolean if it is `true`. |
| |
| `sink` is the output iterator to use for generation |
| |
| `b` is the boolean to convert (the value is `true`). |
| |
| The template parameters `CharEncoding` and `Tag` are either of the type |
| `unused_type` or describe the character class and conversion to be |
| applied to any output possibly influenced by either the `lower[]` or |
| `upper[]` directives. |
| |
| The return value defines the outcome of the whole generator. ]] |
| ] |
| |
| [heading Complexity] |
| |
| [:O(N), where `N` is the number of characters needed to represent the generated |
| boolean.] |
| |
| [heading Example] |
| |
| [note The test harness for the example(s) below is presented in the |
| __karma_basics_examples__ section.] |
| |
| Some includes: |
| |
| [reference_karma_includes] |
| |
| Some using declarations: |
| |
| [reference_karma_using_declarations_bool] |
| |
| Basic usage of an `bool_` generator: |
| |
| [reference_karma_bool] |
| |
| [endsect] |
| |
| [endsect] |