12 Compile-time Options
TE_FLOAT
double
is the default data type used for the parser’s variable types, parameters, and return types. Compile with TE_FLOAT
defined to use float
instead.
Refer to floating-point numbers for more information.
This flag will also disable all bitwise functions and operators.
TE_LONG_DOUBLE
Compile with TE_LONG_DOUBLE
defined to use long double
as the default data type.
Depending on the compiler, this may provide support for handling uint64_t
values. Call te_parser::supports_64bit()
(or SUPPORTS64BIT()
in an expression at runtime) to confirm this.
TE_RAND_SEED
Define this as an unsigned integer to seed the random number generator with. This will affect the function RAND()
, causing it to produce a deterministic series of numbers.
TE_RAND_SEED_TIME
Compile with TE_RAND_SEED_TIME
to seed the random number generator with the current time. This is useful if compiling for microcontrollers that do not support entropy devices.
The default is to seed the random number generator with std::random_device
.
TE_BITWISE_OPERATORS
By default, the operators &
, |
, and ^
represent logical AND, logical OR, and exponentiation. If TE_BITWISE_OPERATORS
is defined, then they will represent bitwise AND, OR, and XOR.
TE_BRACKETS_AS_PARENS
Define this flag to treat []
pairs the same as ()
. This can be useful if using the parser for a debugger’s watch window. For example, an expression such as [rsp+1000]
would be evaluated as 1000
being added with the variable rsp
. In this context, rsp
could represent a memory address in the debugger.
TE_NO_BOOKKEEPING
By default, the parser will keep track of all functions and variables used in the last expression it evaluated. From this, the presence of a function or variable in the expression can be verified via is_function_used()
and is_variable_used()
.
Turning this option off can provide a small optimization, as it will result in less heap allocations and search operations. Defining TE_NO_BOOKKEEPING
will disable this feature.
TE_POW_FROM_RIGHT
By default, TinyExpr++ does exponentiation from left to right. For example:
a^b^c == (a^b)^c
and -a^b == (-a)^b
This is by design; it’s the way that spreadsheets do it (e.g., LibreOffice Calc, Excel, Google Sheets).
If you would rather have exponentiation work from right to left, you need to define TE_POW_FROM_RIGHT
when compiling. With TE_POW_FROM_RIGHT
defined, the behavior is:
a^b^c == a^(b^c)
and -a^b == -(a^b)
That will match how many scripting languages do it (e.g., Python, Ruby).
Symbols can be defined by passing them to your compiler’s command line (or in a CMake configuration) as such: -DTE_POW_FROM_RIGHT
C++20 Features
If compiling as C++20 (and TE_FLOAT
is not defined), then the following functions and operators will be available:
BITLROTATE8
BITLROTATE16
BITLROTATE32
BITLROTATE64
BITLROTATE
BITRROTATE8
BITRROTATE16
BITRROTATE32
BITRROTATE64
BITRROTATE
<<<
(unsigned 64-bit left rotation)>>>
(unsigned 64-bit right rotation)