C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
4d68702f25
commit
371d28c3a8
148
exprtk.hpp
148
exprtk.hpp
|
@ -449,8 +449,6 @@ namespace exprtk
|
||||||
{
|
{
|
||||||
if (str.empty() || pattern.empty())
|
if (str.empty() || pattern.empty())
|
||||||
return false;
|
return false;
|
||||||
else if (str.size() < pattern.size())
|
|
||||||
return false;
|
|
||||||
else if ('*' == pattern[0])
|
else if ('*' == pattern[0])
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -504,8 +502,11 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
(p_end == p_itr) &&
|
(s_end == s_itr) &&
|
||||||
(s_end == s_itr)
|
(
|
||||||
|
(p_end == p_itr) ||
|
||||||
|
('*' == *p_itr)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12610,14 +12611,23 @@ namespace exprtk
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline bool is_generally_string_node(const expression_node<T>* node)
|
inline bool is_generally_string_node(const expression_node<T>* node)
|
||||||
{
|
{
|
||||||
return is_string_node (node) ||
|
if (node)
|
||||||
is_const_string_node (node) ||
|
{
|
||||||
is_string_range_node (node) ||
|
switch (node->type())
|
||||||
is_const_string_range_node(node) ||
|
{
|
||||||
is_genricstring_range_node(node) ||
|
case expression_node<T>::e_stringvar :
|
||||||
is_string_assignment_node (node) ||
|
case expression_node<T>::e_stringconst :
|
||||||
is_string_concat_node (node) ||
|
case expression_node<T>::e_stringvarrng :
|
||||||
is_string_function_node (node) ;
|
case expression_node<T>::e_cstringvarrng :
|
||||||
|
case expression_node<T>::e_strgenrange :
|
||||||
|
case expression_node<T>::e_strass :
|
||||||
|
case expression_node<T>::e_strconcat :
|
||||||
|
case expression_node<T>::e_strfunction : return true;
|
||||||
|
default : return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
class node_allocator
|
class node_allocator
|
||||||
|
@ -15082,7 +15092,7 @@ namespace exprtk
|
||||||
|
|
||||||
T* data = (T*)(element_[i].data);
|
T* data = (T*)(element_[i].data);
|
||||||
|
|
||||||
switch(element_[i].type)
|
switch (element_[i].type)
|
||||||
{
|
{
|
||||||
case scope_element::e_variable : delete data; break;
|
case scope_element::e_variable : delete data; break;
|
||||||
case scope_element::e_vector : delete [] data; break;
|
case scope_element::e_vector : delete [] data; break;
|
||||||
|
@ -17587,7 +17597,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR83 - Failed to generate string range node."));
|
"ERR83 - Failed to generate string range node"));
|
||||||
|
|
||||||
free_node(node_allocator_,expression);
|
free_node(node_allocator_,expression);
|
||||||
}
|
}
|
||||||
|
@ -19358,7 +19368,7 @@ namespace exprtk
|
||||||
return node_allocator_.allocate<details::swap_generic_node<T> >(variable0,variable1);
|
return node_allocator_.allocate<details::swap_generic_node<T> >(variable0,variable1);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool post_variable_process()
|
inline bool post_variable_process(const std::string& symbol)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
peek_token_is(token_t::e_lbracket ) ||
|
peek_token_is(token_t::e_lbracket ) ||
|
||||||
|
@ -19367,7 +19377,14 @@ namespace exprtk
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (!commutative_check_enabled())
|
if (!commutative_check_enabled())
|
||||||
|
{
|
||||||
|
set_error(
|
||||||
|
make_error(parser_error::e_syntax,
|
||||||
|
current_token_,
|
||||||
|
"ERR154 - Invalid sequence of variable '"+ symbol + "' and bracket"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
lexer_.insert_front(token_t::e_mul);
|
lexer_.insert_front(token_t::e_mul);
|
||||||
}
|
}
|
||||||
|
@ -19375,6 +19392,55 @@ namespace exprtk
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool post_bracket_process(const typename token_t::token_type& token, expression_node_ptr& branch)
|
||||||
|
{
|
||||||
|
bool implied_mul = false;
|
||||||
|
|
||||||
|
if (is_generally_string_node(branch))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (token)
|
||||||
|
{
|
||||||
|
case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket ,false) ||
|
||||||
|
token_is(token_t::e_lcrlbracket,false) ||
|
||||||
|
token_is(token_t::e_lsqrbracket,false) ;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case token_t::e_lbracket : implied_mul = token_is(token_t::e_lbracket ,false) ||
|
||||||
|
token_is(token_t::e_lcrlbracket,false) ||
|
||||||
|
token_is(token_t::e_lsqrbracket,false) ;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket ,false) ||
|
||||||
|
token_is(token_t::e_lcrlbracket,false) ||
|
||||||
|
token_is(token_t::e_lsqrbracket,false) ;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default : return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (implied_mul)
|
||||||
|
{
|
||||||
|
if (!commutative_check_enabled())
|
||||||
|
{
|
||||||
|
set_error(
|
||||||
|
make_error(parser_error::e_syntax,
|
||||||
|
current_token_,
|
||||||
|
"ERR155 - Invalid sequence of brackets"));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (token_t::e_eof != current_token_.type)
|
||||||
|
{
|
||||||
|
lexer_.insert_front(current_token_.type);
|
||||||
|
lexer_.insert_front(token_t::e_mul);
|
||||||
|
next_token();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
inline expression_node_ptr parse_symtab_symbol()
|
inline expression_node_ptr parse_symtab_symbol()
|
||||||
{
|
{
|
||||||
const std::string symbol = current_token_.value;
|
const std::string symbol = current_token_.value;
|
||||||
|
@ -19389,7 +19455,7 @@ namespace exprtk
|
||||||
variable = expression_generator_(variable->value());
|
variable = expression_generator_(variable->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!post_variable_process())
|
if (!post_variable_process(symbol))
|
||||||
return error_node();
|
return error_node();
|
||||||
|
|
||||||
lodge_symbol(symbol,e_st_variable);
|
lodge_symbol(symbol,e_st_variable);
|
||||||
|
@ -19410,7 +19476,7 @@ namespace exprtk
|
||||||
se.active = true;
|
se.active = true;
|
||||||
lodge_symbol(symbol,e_st_local_variable);
|
lodge_symbol(symbol,e_st_local_variable);
|
||||||
|
|
||||||
if (!post_variable_process())
|
if (!post_variable_process(symbol))
|
||||||
return error_node();
|
return error_node();
|
||||||
|
|
||||||
next_token();
|
next_token();
|
||||||
|
@ -19450,7 +19516,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR154 - Failed to generate node for function: '" + symbol + "'"));
|
"ERR156 - Failed to generate node for function: '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19475,7 +19541,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR155 - Failed to generate node for vararg function: '" + symbol + "'"));
|
"ERR157 - Failed to generate node for vararg function: '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19500,7 +19566,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR156 - Failed to generate node for generic function: '" + symbol + "'"));
|
"ERR158 - Failed to generate node for generic function: '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19525,7 +19591,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR157 - Failed to generate node for string function: '" + symbol + "'"));
|
"ERR159 - Failed to generate node for string function: '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19544,7 +19610,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR158 - Invalid use of reserved symbol '" + symbol + "'"));
|
"ERR160 - Invalid use of reserved symbol '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19584,7 +19650,7 @@ namespace exprtk
|
||||||
|
|
||||||
lodge_symbol(symbol,e_st_variable);
|
lodge_symbol(symbol,e_st_variable);
|
||||||
|
|
||||||
if (!post_variable_process())
|
if (!post_variable_process(symbol))
|
||||||
return error_node();
|
return error_node();
|
||||||
|
|
||||||
next_token();
|
next_token();
|
||||||
|
@ -19596,7 +19662,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_symtab,
|
make_error(parser_error::e_symtab,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR159 - Failed to create variable: '" + symbol + "'"));
|
"ERR161 - Failed to create variable: '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19605,7 +19671,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR160 - Undefined symbol: '" + symbol + "'"));
|
"ERR162 - Undefined symbol: '" + symbol + "'"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19686,7 +19752,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_symtab,
|
make_error(parser_error::e_symtab,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR161 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token_.value));
|
"ERR163 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token_.value));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19711,7 +19777,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_numeric,
|
make_error(parser_error::e_numeric,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR162 - Failed to convert '" + current_token_.value + "' to a number"));
|
"ERR164 - Failed to convert '" + current_token_.value + "' to a number"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19737,10 +19803,16 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR163 - Expected ')' instead of: '" + current_token_.value + "'"));
|
"ERR165 - Expected ')' instead of: '" + current_token_.value + "'"));
|
||||||
|
|
||||||
free_node(node_allocator_,branch);
|
free_node(node_allocator_,branch);
|
||||||
|
|
||||||
|
return error_node();
|
||||||
|
}
|
||||||
|
else if (!post_bracket_process(token_t::e_lbracket,branch))
|
||||||
|
{
|
||||||
|
free_node(node_allocator_,branch);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19755,10 +19827,16 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR164 - Expected ']' instead of: '" + current_token_.value + "'"));
|
"ERR166 - Expected ']' instead of: '" + current_token_.value + "'"));
|
||||||
|
|
||||||
free_node(node_allocator_,branch);
|
free_node(node_allocator_,branch);
|
||||||
|
|
||||||
|
return error_node();
|
||||||
|
}
|
||||||
|
else if (!post_bracket_process(token_t::e_lsqrbracket,branch))
|
||||||
|
{
|
||||||
|
free_node(node_allocator_,branch);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19773,10 +19851,16 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR165 - Expected '}' instead of: '" + current_token_.value + "'"));
|
"ERR167 - Expected '}' instead of: '" + current_token_.value + "'"));
|
||||||
|
|
||||||
free_node(node_allocator_,branch);
|
free_node(node_allocator_,branch);
|
||||||
|
|
||||||
|
return error_node();
|
||||||
|
}
|
||||||
|
else if (!post_bracket_process(token_t::e_lcrlbracket,branch))
|
||||||
|
{
|
||||||
|
free_node(node_allocator_,branch);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19806,7 +19890,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR166 - Premature end of expression[1]"));
|
"ERR168 - Premature end of expression[1]"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
@ -19815,7 +19899,7 @@ namespace exprtk
|
||||||
set_error(
|
set_error(
|
||||||
make_error(parser_error::e_syntax,
|
make_error(parser_error::e_syntax,
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR167 - Premature end of expression[2]"));
|
"ERR169 - Premature end of expression[2]"));
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1276,6 +1276,42 @@ inline bool run_test01()
|
||||||
test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (x)3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" x(3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (x) 3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" x (3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (x (3)) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (2)y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" 2(y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (2) y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" 2 (y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>(" (2 (y)) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; (a)(3) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; (a){3} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; (a)[3] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; {a}(3) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; {a}[3] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; (a)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; (a){b} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; (a)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; {a}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; {a}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; (a)(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; (a){a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; (a)[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; {a}(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; {a}[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; (b-1)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; (b-1){b} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; (b-1)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; {b-1}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
|
test_xy<T>("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
|
||||||
test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
|
test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
|
||||||
test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
|
test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
|
||||||
test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
|
test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
|
||||||
|
@ -4725,6 +4761,7 @@ struct inc_func : public exprtk::igeneric_function<T>
|
||||||
|
|
||||||
case generic_type::e_vector : {
|
case generic_type::e_vector : {
|
||||||
vector_t vector(gt);
|
vector_t vector(gt);
|
||||||
|
|
||||||
for (std::size_t x = 0; x < vector.size(); ++x)
|
for (std::size_t x = 0; x < vector.size(); ++x)
|
||||||
{
|
{
|
||||||
vector[x] += T(1);
|
vector[x] += T(1);
|
||||||
|
@ -4734,6 +4771,7 @@ struct inc_func : public exprtk::igeneric_function<T>
|
||||||
|
|
||||||
case generic_type::e_string : {
|
case generic_type::e_string : {
|
||||||
string_t string(gt);
|
string_t string(gt);
|
||||||
|
|
||||||
for (std::size_t x = 0; x < string.size(); ++x)
|
for (std::size_t x = 0; x < string.size(); ++x)
|
||||||
{
|
{
|
||||||
string[x] += static_cast<typename string_t::value_t>(1);
|
string[x] += static_cast<typename string_t::value_t>(1);
|
||||||
|
@ -5021,12 +5059,23 @@ inline bool run_test18()
|
||||||
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
||||||
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
||||||
|
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
|
||||||
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
|
||||||
|
|
||||||
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
||||||
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
||||||
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
|
||||||
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);"
|
"var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);"
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
|
static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
|
||||||
|
@ -5047,10 +5096,24 @@ inline bool run_test18()
|
||||||
"V*TTTTVSS",
|
"V*TTTTVSS",
|
||||||
"VVT*VSS" ,
|
"VVT*VSS" ,
|
||||||
"VVTTTTVS*",
|
"VVTTTTVS*",
|
||||||
|
|
||||||
|
"T*",
|
||||||
|
"T*",
|
||||||
|
"T*",
|
||||||
|
"T*",
|
||||||
|
"S*",
|
||||||
|
"S*",
|
||||||
|
"S*",
|
||||||
|
"S*",
|
||||||
|
"V*",
|
||||||
|
"V*",
|
||||||
|
"V*",
|
||||||
|
"V*",
|
||||||
|
|
||||||
"TTTTTTT|STSTSTS|V*T*VS*" ,
|
"TTTTTTT|STSTSTS|V*T*VS*" ,
|
||||||
"TTTTTTT|STSTSTS|V*TTTTVSS",
|
"TTTTTTT|STSTSTS|V*TTTTVSS",
|
||||||
"TTTTTTT|STSTSTS|VVT*VSS" ,
|
"TTTTTTT|STSTSTS|VVT*VSS" ,
|
||||||
"TTTTTTT|STSTSTS|VVTTTTVS*"
|
"TTTTTTT|STSTSTS|VVTTTTVS*",
|
||||||
};
|
};
|
||||||
|
|
||||||
bool failure = false;
|
bool failure = false;
|
||||||
|
@ -5262,7 +5325,6 @@ inline bool run_test18()
|
||||||
|
|
||||||
std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
|
std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
|
||||||
|
|
||||||
|
|
||||||
for (std::size_t i = 0; i < parameter_type_list_size; ++i)
|
for (std::size_t i = 0; i < parameter_type_list_size; ++i)
|
||||||
{
|
{
|
||||||
expression_t expression;
|
expression_t expression;
|
||||||
|
|
|
@ -1404,9 +1404,11 @@ parameters in the following sequence:
|
||||||
|
|
||||||
A final piece of type checking functionality is available for the
|
A final piece of type checking functionality is available for the
|
||||||
scenarios where a single function name is intended to be used for
|
scenarios where a single function name is intended to be used for
|
||||||
multiple distinct parameter sequences. Two specific overrides of the
|
multiple distinct parameter sequences. The parameter sequences are
|
||||||
function operator are provided one for standard generic functions and
|
passed to the constructor as a single string delimited by the pipe '|'
|
||||||
one for string returning functions. The overrides are as follows:
|
character. Two specific overrides of the function operator are
|
||||||
|
provided one for standard generic functions and one for string
|
||||||
|
returning functions. The overrides are as follows:
|
||||||
|
|
||||||
// f(psi,i_0,i_1,....,i_N) --> Scalar
|
// f(psi,i_0,i_1,....,i_N) --> Scalar
|
||||||
inline T operator()(const std::size_t& ps_index,
|
inline T operator()(const std::size_t& ps_index,
|
||||||
|
|
Loading…
Reference in New Issue