C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
9de391ed3c
commit
288644de2d
79
exprtk.hpp
79
exprtk.hpp
|
@ -6470,7 +6470,7 @@ namespace exprtk
|
|||
|
||||
inline T value() const
|
||||
{
|
||||
return *(vector_base_ + static_cast<std::size_t>(details::numeric::to_int64(index_->value())));
|
||||
return *(vector_base_ + static_cast<std::size_t>(details::numeric::to_int64(index_->value())));
|
||||
}
|
||||
|
||||
inline T& ref()
|
||||
|
@ -10505,17 +10505,6 @@ namespace exprtk
|
|||
ts.data = &var->ref();
|
||||
ts.type = type_store_t::e_scalar;
|
||||
}
|
||||
else if (is_vector_elem_node(arg_list_[i]))
|
||||
{
|
||||
vector_elem_node_ptr_t var = vector_elem_node_ptr_t(0);
|
||||
|
||||
if (0 == (var = dynamic_cast<vector_elem_node_ptr_t>(arg_list_[i])))
|
||||
return false;
|
||||
|
||||
ts.size = 1;
|
||||
ts.data = reinterpret_cast<void*>(&var->ref());
|
||||
ts.type = type_store_t::e_scalar;
|
||||
}
|
||||
else
|
||||
{
|
||||
ts.size = 1;
|
||||
|
@ -22276,6 +22265,7 @@ namespace exprtk
|
|||
scoped_vec_delete<expression_node_t> svd(*this,vec_initilizer_list);
|
||||
|
||||
bool single_value_initialiser = false;
|
||||
bool vec_to_vec_initialiser = false;
|
||||
|
||||
if (!token_is(token_t::e_rsqrbracket))
|
||||
{
|
||||
|
@ -22327,12 +22317,44 @@ namespace exprtk
|
|||
}
|
||||
else if (!token_is(token_t::e_lcrlbracket))
|
||||
{
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR140 - Expected '{' as part of vector initialiser list"));
|
||||
expression_node_ptr initialiser = error_node();
|
||||
|
||||
return error_node();
|
||||
// Is this a vector to vector assignment and initialisation?
|
||||
if (token_t::e_symbol == current_token().type)
|
||||
{
|
||||
// Is it a locally defined vector?
|
||||
scope_element& se = sem_.get_active_element(current_token().value);
|
||||
|
||||
if (scope_element::e_vector == se.type)
|
||||
{
|
||||
if ((initialiser = parse_expression()))
|
||||
vec_initilizer_list.push_back(initialiser);
|
||||
else
|
||||
return error_node();
|
||||
}
|
||||
// Are we dealing with a user defined vector?
|
||||
else if (symtab_store_.is_vector(current_token().value))
|
||||
{
|
||||
lodge_symbol(current_token().value,e_st_vector);
|
||||
|
||||
if ((initialiser = parse_expression()))
|
||||
vec_initilizer_list.push_back(initialiser);
|
||||
else
|
||||
return error_node();
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == initialiser)
|
||||
{
|
||||
set_error(
|
||||
make_error(parser_error::e_syntax,
|
||||
current_token(),
|
||||
"ERR140 - Expected '{' as part of vector initialiser list"));
|
||||
|
||||
return error_node();
|
||||
}
|
||||
else
|
||||
vec_to_vec_initialiser = true;
|
||||
}
|
||||
else if (!token_is(token_t::e_rcrlbracket))
|
||||
{
|
||||
|
@ -22464,13 +22486,20 @@ namespace exprtk
|
|||
|
||||
lodge_symbol(vec_name,e_st_local_vector);
|
||||
|
||||
expression_node_ptr result =
|
||||
node_allocator_
|
||||
.allocate<details::vector_assignment_node<T> >(
|
||||
(*vec_holder)[0],
|
||||
vec_size,
|
||||
vec_initilizer_list,
|
||||
single_value_initialiser);
|
||||
expression_node_ptr result = error_node();
|
||||
|
||||
if (vec_to_vec_initialiser)
|
||||
result = expression_generator_(
|
||||
details::e_assign,
|
||||
node_allocator_.allocate<vector_node_t>(vec_holder),
|
||||
vec_initilizer_list[0]);
|
||||
else
|
||||
result = node_allocator_
|
||||
.allocate<details::vector_assignment_node<T> >(
|
||||
(*vec_holder)[0],
|
||||
vec_size,
|
||||
vec_initilizer_list,
|
||||
single_value_initialiser);
|
||||
|
||||
svd.delete_ptr = (0 == result);
|
||||
|
||||
|
@ -23386,7 +23415,7 @@ namespace exprtk
|
|||
}
|
||||
}
|
||||
|
||||
// Are we dealing with a vector element?
|
||||
// Are we dealing with a vector?
|
||||
if (symtab_store_.is_vector(symbol))
|
||||
{
|
||||
lodge_symbol(symbol,e_st_vector);
|
||||
|
|
12
readme.txt
12
readme.txt
|
@ -1166,10 +1166,18 @@ zero. The following are examples of vector definitions:
|
|||
(e) Initialise the first three (all) values
|
||||
var x[3] := { 1, 2, 3 };
|
||||
|
||||
(f) Error as there are too many initialisers
|
||||
(f) Initialise vector from a vector
|
||||
var x[4] := { 1, 2, 3, 4 };
|
||||
var y[3] := x;
|
||||
|
||||
(g) Initialise vector from a smaller vector
|
||||
var x[3] := { 1, 2, 3 };
|
||||
var y[5] := x; // 1, 2, 3, ??, ??
|
||||
|
||||
(h) Error as there are too many initialisers
|
||||
var x[3] := { 1, 2, 3, 4 };
|
||||
|
||||
(g) Error as a vector of size zero is not allowed.
|
||||
(i) Error as a vector of size zero is not allowed.
|
||||
var x[0];
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue