C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html

This commit is contained in:
Arash Partow
2017-04-06 08:26:48 +10:00
parent b579791618
commit e7d96c48ef
23 changed files with 85 additions and 47 deletions

View File

@ -409,7 +409,7 @@ namespace exprtk
static const std::string cntrl_struct_list[] = static const std::string cntrl_struct_list[] =
{ {
"if", "switch", "for", "while", "repeat" "if", "switch", "for", "while", "repeat", "return"
}; };
static const std::size_t cntrl_struct_list_size = sizeof(cntrl_struct_list) / sizeof(std::string); static const std::size_t cntrl_struct_list_size = sizeof(cntrl_struct_list) / sizeof(std::string);
@ -4207,11 +4207,13 @@ namespace exprtk
return std::string(view.begin(),view.size()); return std::string(view.begin(),view.size());
} }
#ifndef exprtk_disable_return_statement
namespace details namespace details
{ {
template <typename T> class return_node; template <typename T> class return_node;
template <typename T> class return_envelope_node; template <typename T> class return_envelope_node;
} }
#endif
template <typename T> template <typename T>
class results_context class results_context
@ -4261,8 +4263,10 @@ namespace exprtk
bool results_available_; bool results_available_;
ts_list_t parameter_list_; ts_list_t parameter_list_;
#ifndef exprtk_disable_return_statement
friend class details::return_node<T>; friend class details::return_node<T>;
friend class details::return_envelope_node<T>; friend class details::return_envelope_node<T>;
#endif
}; };
namespace details namespace details
@ -11526,6 +11530,7 @@ namespace exprtk
} }
}; };
#ifndef exprtk_disable_return_statement
template <typename T> template <typename T>
class return_node : public generic_function_node<T,null_igenfunc<T> > class return_node : public generic_function_node<T,null_igenfunc<T> >
{ {
@ -11626,6 +11631,7 @@ namespace exprtk
expression_ptr body_; expression_ptr body_;
bool body_deletable_; bool body_deletable_;
}; };
#endif
#define exprtk_define_unary_op(OpName) \ #define exprtk_define_unary_op(OpName) \
template <typename T> \ template <typename T> \
@ -18889,7 +18895,8 @@ namespace exprtk
e_ctrl_switch, e_ctrl_switch,
e_ctrl_for_loop, e_ctrl_for_loop,
e_ctrl_while_loop, e_ctrl_while_loop,
e_ctrl_repeat_loop e_ctrl_repeat_loop,
e_ctrl_return
}; };
enum settings_logic_opr enum settings_logic_opr
@ -24003,6 +24010,7 @@ namespace exprtk
return result; return result;
} }
#ifndef exprtk_disable_return_statement
inline expression_node_ptr parse_return_statement() inline expression_node_ptr parse_return_statement()
{ {
if (state_.parsing_return_stmt) if (state_.parsing_return_stmt)
@ -24112,6 +24120,12 @@ namespace exprtk
return result; return result;
} }
#else
inline expression_node_ptr parse_return_statement()
{
return error_node();
}
#endif
inline bool post_variable_process(const std::string& symbol) inline bool post_variable_process(const std::string& symbol)
{ {
@ -24522,7 +24536,10 @@ namespace exprtk
{ {
return parse_swap_statement(); return parse_swap_statement();
} }
else if (details::imatch(current_token().value,symbol_return)) else if (
details::imatch(current_token().value,symbol_return) &&
settings_.control_struct_enabled(current_token().value)
)
{ {
return parse_return_statement(); return parse_return_statement();
} }
@ -26522,6 +26539,7 @@ namespace exprtk
} }
#endif #endif
#ifndef exprtk_disable_return_statement
inline expression_node_ptr return_call(std::vector<expression_node_ptr>& arg_list) inline expression_node_ptr return_call(std::vector<expression_node_ptr>& arg_list)
{ {
if (!all_nodes_valid(arg_list)) if (!all_nodes_valid(arg_list))
@ -26565,6 +26583,19 @@ namespace exprtk
return result; return result;
} }
#else
inline expression_node_ptr return_call(std::vector<expression_node_ptr>&)
{
return error_node();
}
inline expression_node_ptr return_envelope(expression_node_ptr,
results_context_t*,
bool*&)
{
return error_node();
}
#endif
inline expression_node_ptr vector_element(const std::string& symbol, inline expression_node_ptr vector_element(const std::string& symbol,
vector_holder_ptr vector_base, vector_holder_ptr vector_base,
@ -33518,6 +33549,7 @@ namespace exprtk
inline void return_cleanup() inline void return_cleanup()
{ {
#ifndef exprtk_disable_return_statement
if (results_context_) if (results_context_)
{ {
delete results_context_; delete results_context_;
@ -33525,6 +33557,7 @@ namespace exprtk
} }
state_.return_stmt_present = false; state_.return_stmt_present = false;
#endif
} }
private: private:
@ -37097,9 +37130,9 @@ namespace exprtk
namespace information namespace information
{ {
static const char* library = "Mathematical Expression Toolkit"; static const char* library = "Mathematical Expression Toolkit";
static const char* version = "2.718281828459045235360287471352662497757247" static const char* version = "2.71828182845904523536028747135266249775724709"
"09369995957496696762772407663035354759457138"; "3699959574966967627724076630353547594571382178";
static const char* date = "20170107"; static const char* date = "20170404";
static inline std::string data() static inline std::string data()
{ {

View File

@ -1316,7 +1316,7 @@ side-effects, however the latter, statement 5, is the final statement
in the expression and hence will be assumed to have a side-effect. in the expression and hence will be assumed to have a side-effect.
During compilation when the DCE optimisation is applied to the above During compilation when the DCE optimisation is applied to the above
expression, statement 2 will be removed from the expression, as it has expression, statement 3 will be removed from the expression, as it has
no bearing on the final result of expression, the rest of the no bearing on the final result of expression, the rest of the
statements will all remain. The optimised form of the expression is as statements will all remain. The optimised form of the expression is as
follows: follows:
@ -1325,7 +1325,7 @@ follows:
var y := x + 2; // Statement 2 var y := x + 2; // Statement 2
y := x + 3y; // Statement 3 y := x + 3y; // Statement 3
x - y; // Statement 4 x - y; // Statement 4
8
(3) Conditional Statements (If-Then-Else) (3) Conditional Statements (If-Then-Else)
ExprTk support two forms of conditional branching or otherwise known ExprTk support two forms of conditional branching or otherwise known
@ -1358,7 +1358,7 @@ most imperative languages. There are two variations of the statement:
(a) If-Statement (a) If-Statement
This version of the conditional statement returns the value of the This version of the conditional statement returns the value of the
consequent expression when the condition expression is true, else it consequent expression when the condition expression is true, else it
will require a quiet NaN value as its result. will return a quiet NaN value as its result.
Example 1: Example 1:
x := if (y < z) y + 3; x := if (y < z) y + 3;
@ -2877,8 +2877,8 @@ simple user defined USR:
In the example above, a user specified USR is defined, and is In the example above, a user specified USR is defined, and is
registered with the parser enabling the USR functionality. The when an registered with the parser enabling the USR functionality. Then when
unknown symbol is encountered during the compilation process, the an unknown symbol is encountered during the compilation process, the
USR's process method will be invoked. The USR in the example will only USR's process method will be invoked. The USR in the example will only
'accept' unknown symbols that have a prefix of 'var_' as being valid 'accept' unknown symbols that have a prefix of 'var_' as being valid
variables, all other unknown symbols will result in a compilation variables, all other unknown symbols will result in a compilation
@ -4338,14 +4338,16 @@ disable certain features and capabilities. The defines can either be
part of a compiler command line switch or scoped around the include to part of a compiler command line switch or scoped around the include to
the ExprTk header. The defines are as follows: the ExprTk header. The defines are as follows:
(1) exprtk_enable_debugging (01) exprtk_enable_debugging
(2) exprtk_disable_comments (02) exprtk_disable_comments
(3) exprtk_disable_break_continue (03) exprtk_disable_break_continue
(4) exprtk_disable_sc_andor (04) exprtk_disable_sc_andor
(5) exprtk_disable_enhanced_features (05) exprtk_disable_return_statement
(6) exprtk_disable_string_capabilities (06) exprtk_disable_enhanced_features
(7) exprtk_disable_superscalar_unroll (07) exprtk_disable_string_capabilities
(8) exprtk_disable_rtl_io_file (08) exprtk_disable_superscalar_unroll
(09) exprtk_disable_rtl_io_file
(10) exprtk_disable_rtl_vecops
(1) exprtk_enable_debugging (1) exprtk_enable_debugging
@ -4366,19 +4368,22 @@ in a compilation failure.
This define will disable the short-circuit '&' (and) and '|' (or) This define will disable the short-circuit '&' (and) and '|' (or)
operators operators
(5) exprtk_disable_enhanced_features (5) exprtk_disable_return_statement
This define will disable use of return statements within expressions.
(6) exprtk_disable_enhanced_features
This define will disable all enhanced features such as strength This define will disable all enhanced features such as strength
reduction and special function optimisations and expression specific reduction and special function optimisations and expression specific
type instantiations. This feature will reduce compilation times and type instantiations. This feature will reduce compilation times and
binary sizes but will also result in massive performance degradation binary sizes but will also result in massive performance degradation
of expression evaluations. of expression evaluations.
(6) exprtk_disable_string_capabilities (7) exprtk_disable_string_capabilities
This define will disable all string processing capabilities. Any This define will disable all string processing capabilities. Any
expression that contains a string or string related syntax will result expression that contains a string or string related syntax will result
in a compilation failure. in a compilation failure.
(7) exprtk_disable_superscalar_unroll (8) exprtk_disable_superscalar_unroll
This define will set the loop unroll batch size to 4 operations per This define will set the loop unroll batch size to 4 operations per
loop instead of the default 8 operations. This define is used in loop instead of the default 8 operations. This define is used in
operations that involve vectors and aggregations over vectors. When operations that involve vectors and aggregations over vectors. When
@ -4386,12 +4391,12 @@ targeting non-superscalar architectures, it may be recommended to
build using this particular option if efficiency of evaluations is of build using this particular option if efficiency of evaluations is of
concern. concern.
(8) exprtk_disable_rtl_io_file (9) exprtk_disable_rtl_io_file
This define will disable the file I/O RTL package features. When This define will disable the file I/O RTL package features. When
present, any attempts to register the file I/O package with a given present, any attempts to register the file I/O package with a given
symbol table will fail causing a compilation error. symbol table will fail causing a compilation error.
(9) exprtk_disable_rtl_vecops (10) exprtk_disable_rtl_vecops
This define will disable the extended vector operations RTL package This define will disable the extended vector operations RTL package
features. When present, any attempts to register the vector operations features. When present, any attempts to register the vector operations
package with a given symbol table will fail causing a compilation package with a given symbol table will fail causing a compilation