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
|
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()
|
inline T& ref()
|
||||||
|
@ -10505,17 +10505,6 @@ namespace exprtk
|
||||||
ts.data = &var->ref();
|
ts.data = &var->ref();
|
||||||
ts.type = type_store_t::e_scalar;
|
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
|
else
|
||||||
{
|
{
|
||||||
ts.size = 1;
|
ts.size = 1;
|
||||||
|
@ -22276,6 +22265,7 @@ namespace exprtk
|
||||||
scoped_vec_delete<expression_node_t> svd(*this,vec_initilizer_list);
|
scoped_vec_delete<expression_node_t> svd(*this,vec_initilizer_list);
|
||||||
|
|
||||||
bool single_value_initialiser = false;
|
bool single_value_initialiser = false;
|
||||||
|
bool vec_to_vec_initialiser = false;
|
||||||
|
|
||||||
if (!token_is(token_t::e_rsqrbracket))
|
if (!token_is(token_t::e_rsqrbracket))
|
||||||
{
|
{
|
||||||
|
@ -22327,12 +22317,44 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
else if (!token_is(token_t::e_lcrlbracket))
|
else if (!token_is(token_t::e_lcrlbracket))
|
||||||
{
|
{
|
||||||
set_error(
|
expression_node_ptr initialiser = error_node();
|
||||||
make_error(parser_error::e_syntax,
|
|
||||||
current_token(),
|
|
||||||
"ERR140 - Expected '{' as part of vector initialiser list"));
|
|
||||||
|
|
||||||
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))
|
else if (!token_is(token_t::e_rcrlbracket))
|
||||||
{
|
{
|
||||||
|
@ -22464,13 +22486,20 @@ namespace exprtk
|
||||||
|
|
||||||
lodge_symbol(vec_name,e_st_local_vector);
|
lodge_symbol(vec_name,e_st_local_vector);
|
||||||
|
|
||||||
expression_node_ptr result =
|
expression_node_ptr result = error_node();
|
||||||
node_allocator_
|
|
||||||
.allocate<details::vector_assignment_node<T> >(
|
if (vec_to_vec_initialiser)
|
||||||
(*vec_holder)[0],
|
result = expression_generator_(
|
||||||
vec_size,
|
details::e_assign,
|
||||||
vec_initilizer_list,
|
node_allocator_.allocate<vector_node_t>(vec_holder),
|
||||||
single_value_initialiser);
|
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);
|
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))
|
if (symtab_store_.is_vector(symbol))
|
||||||
{
|
{
|
||||||
lodge_symbol(symbol,e_st_vector);
|
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
|
(e) Initialise the first three (all) values
|
||||||
var x[3] := { 1, 2, 3 };
|
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 };
|
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];
|
var x[0];
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue