Skip to content

Commit 6473bd5

Browse files
committed
1. Added new expression to bench_expr_all.txt
2. Updated ExprTk
1 parent 21501a8 commit 6473bd5

File tree

3 files changed

+65
-28
lines changed

3 files changed

+65
-28
lines changed

bench_expr_all.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ abs(sin(sqrt(a*a+b*b))*255)
152152
(x*y-abs(x/y)^4)^3
153153
(x*y)^-3+(x/y)^-4
154154
(x*y-abs(x/y)^-4)^-3
155-
155+
abs((x*y)^-3+(x/y)^-4)/abs((x*y)^-3+(x/y)^-4)
156156

157157
# http://dabroz.scythe.pl/2010/11/18/quick-data-transformation
158158
#2+min(a+a+a,1/5)*(2+a*3)

exprtk/exprtk.hpp

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6470,7 +6470,7 @@ namespace exprtk
64706470

64716471
inline T value() const
64726472
{
6473-
return *(vector_base_ + static_cast<std::size_t>(details::numeric::to_int64(index_->value())));
6473+
return *(vector_base_ + static_cast<std::size_t>(details::numeric::to_int64(index_->value())));
64746474
}
64756475

64766476
inline T& ref()
@@ -10505,17 +10505,6 @@ namespace exprtk
1050510505
ts.data = &var->ref();
1050610506
ts.type = type_store_t::e_scalar;
1050710507
}
10508-
else if (is_vector_elem_node(arg_list_[i]))
10509-
{
10510-
vector_elem_node_ptr_t var = vector_elem_node_ptr_t(0);
10511-
10512-
if (0 == (var = dynamic_cast<vector_elem_node_ptr_t>(arg_list_[i])))
10513-
return false;
10514-
10515-
ts.size = 1;
10516-
ts.data = reinterpret_cast<void*>(&var->ref());
10517-
ts.type = type_store_t::e_scalar;
10518-
}
1051910508
else
1052010509
{
1052110510
ts.size = 1;
@@ -22276,6 +22265,7 @@ namespace exprtk
2227622265
scoped_vec_delete<expression_node_t> svd(*this,vec_initilizer_list);
2227722266

2227822267
bool single_value_initialiser = false;
22268+
bool vec_to_vec_initialiser = false;
2227922269

2228022270
if (!token_is(token_t::e_rsqrbracket))
2228122271
{
@@ -22327,12 +22317,44 @@ namespace exprtk
2232722317
}
2232822318
else if (!token_is(token_t::e_lcrlbracket))
2232922319
{
22330-
set_error(
22331-
make_error(parser_error::e_syntax,
22332-
current_token(),
22333-
"ERR140 - Expected '{' as part of vector initialiser list"));
22320+
expression_node_ptr initialiser = error_node();
2233422321

22335-
return error_node();
22322+
// Is this a vector to vector assignment and initialisation?
22323+
if (token_t::e_symbol == current_token().type)
22324+
{
22325+
// Is it a locally defined vector?
22326+
scope_element& se = sem_.get_active_element(current_token().value);
22327+
22328+
if (scope_element::e_vector == se.type)
22329+
{
22330+
if ((initialiser = parse_expression()))
22331+
vec_initilizer_list.push_back(initialiser);
22332+
else
22333+
return error_node();
22334+
}
22335+
// Are we dealing with a user defined vector?
22336+
else if (symtab_store_.is_vector(current_token().value))
22337+
{
22338+
lodge_symbol(current_token().value,e_st_vector);
22339+
22340+
if ((initialiser = parse_expression()))
22341+
vec_initilizer_list.push_back(initialiser);
22342+
else
22343+
return error_node();
22344+
}
22345+
}
22346+
22347+
if (0 == initialiser)
22348+
{
22349+
set_error(
22350+
make_error(parser_error::e_syntax,
22351+
current_token(),
22352+
"ERR140 - Expected '{' as part of vector initialiser list"));
22353+
22354+
return error_node();
22355+
}
22356+
else
22357+
vec_to_vec_initialiser = true;
2233622358
}
2233722359
else if (!token_is(token_t::e_rcrlbracket))
2233822360
{
@@ -22464,13 +22486,20 @@ namespace exprtk
2246422486

2246522487
lodge_symbol(vec_name,e_st_local_vector);
2246622488

22467-
expression_node_ptr result =
22468-
node_allocator_
22469-
.allocate<details::vector_assignment_node<T> >(
22470-
(*vec_holder)[0],
22471-
vec_size,
22472-
vec_initilizer_list,
22473-
single_value_initialiser);
22489+
expression_node_ptr result = error_node();
22490+
22491+
if (vec_to_vec_initialiser)
22492+
result = expression_generator_(
22493+
details::e_assign,
22494+
node_allocator_.allocate<vector_node_t>(vec_holder),
22495+
vec_initilizer_list[0]);
22496+
else
22497+
result = node_allocator_
22498+
.allocate<details::vector_assignment_node<T> >(
22499+
(*vec_holder)[0],
22500+
vec_size,
22501+
vec_initilizer_list,
22502+
single_value_initialiser);
2247422503

2247522504
svd.delete_ptr = (0 == result);
2247622505

@@ -23386,7 +23415,7 @@ namespace exprtk
2338623415
}
2338723416
}
2338823417

23389-
// Are we dealing with a vector element?
23418+
// Are we dealing with a vector?
2339023419
if (symtab_store_.is_vector(symbol))
2339123420
{
2339223421
lodge_symbol(symbol,e_st_vector);

exprtk/readme.txt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,10 +1166,18 @@ zero. The following are examples of vector definitions:
11661166
(e) Initialise the first three (all) values
11671167
var x[3] := { 1, 2, 3 };
11681168

1169-
(f) Error as there are too many initialisers
1169+
(f) Initialise vector from a vector
1170+
var x[4] := { 1, 2, 3, 4 };
1171+
var y[3] := x;
1172+
1173+
(g) Initialise vector from a smaller vector
1174+
var x[3] := { 1, 2, 3 };
1175+
var y[5] := x; // 1, 2, 3, ??, ??
1176+
1177+
(h) Error as there are too many initialisers
11701178
var x[3] := { 1, 2, 3, 4 };
11711179

1172-
(g) Error as a vector of size zero is not allowed.
1180+
(i) Error as a vector of size zero is not allowed.
11731181
var x[0];
11741182

11751183

0 commit comments

Comments
 (0)