...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
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 below).
// forwards to <boost/spirit/home/karma/numeric/int.hpp> #include <boost/spirit/include/karma_int.hpp>
Also, see Include Structure.
Name |
---|
|
|
|
|
|
Note | |
---|---|
The generators |
Note | |
---|---|
|
template < typename T , unsigned Radix , bool force_sign> struct int_generator;
Parameter |
Description |
Default |
---|---|---|
|
The numeric base type of the numeric parser. |
|
|
The radix base. This can be either 2: binary, 8: octal, 10: decimal and 16: hexadecimal. |
|
|
If |
|
Notation
num
Numeric literal, any signed integer value, or a 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).
Semantics of an expression is defined only where it differs from, or
is not defined in PrimitiveGenerator
.
Expression |
Semantics |
---|---|
|
Generate the integer literal |
short_ int_ long_ long_long
|
Generate the integer provided by a mandatory attribute using
the default formatting (radix is |
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 |
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.
Expression |
Semantics |
---|---|
int_generator< Num, Radix, force_sign >()
|
Generate the integer of type |
int_generator< Num, Radix, force_sign >()(num)
|
Generate the integer of type |
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:
<
,
<=
, ==
, !=
,
>
, and >=
+
,
-
, /
,
*
, %
,
and unary -
If boost::is_integral<Num>::value
is false
the type Num
must have
defined:
<
,
<=
, ==
, !=
,
>
, and >=
+
,
-
, /
,
*
, %
,
and unary -
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).
Expression |
Attribute |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int_generator< Num, Radix, force_sign >()
|
|
int_generator< Num, Radix, force_sign >()(num)
|
|
Note | |
---|---|
In addition to their usual attribute of type |
O(N), where
N
is the number of digits needed to represent the generated integer number
Note | |
---|---|
The test harness for the example(s) below is presented in the Basics Examples section. |
Some includes:
#include <boost/spirit/include/karma.hpp> #include <boost/spirit/include/support_utree.hpp> #include <boost/phoenix/core.hpp> #include <boost/phoenix/operator.hpp> #include <boost/fusion/include/std_pair.hpp> #include <boost/proto/deep_copy.hpp> #include <iostream> #include <string>
Some using declarations:
using boost::spirit::karma::int_; using boost::spirit::karma::lit;
Basic usage of an int_
generator:
test_generator("-2", lit(-2)); test_generator("-2", int_(-2)); test_generator_attr("-2", int_(-2), -2); test_generator_attr("", int_(-2), 3); // fails (as -2 != 3)! test_generator_attr("-2", int_, -2);