C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
e1a160efcc
commit
060ac1140e
109
exprtk.hpp
109
exprtk.hpp
|
@ -3703,8 +3703,15 @@ namespace exprtk
|
||||||
inline const value_t* begin() const { return data_; }
|
inline const value_t* begin() const { return data_; }
|
||||||
inline value_t* begin() { return data_; }
|
inline value_t* begin() { return data_; }
|
||||||
|
|
||||||
inline const value_t* end() const { return data_ + ts_.size; }
|
inline const value_t* end() const
|
||||||
inline value_t* end() { return data_ + ts_.size; }
|
{
|
||||||
|
return static_cast<value_t*>(data_ + ts_.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline value_t* end()
|
||||||
|
{
|
||||||
|
return static_cast<value_t*>(data_ + ts_.size);
|
||||||
|
}
|
||||||
|
|
||||||
type_store_t& ts_;
|
type_store_t& ts_;
|
||||||
value_t* data_;
|
value_t* data_;
|
||||||
|
@ -15906,6 +15913,24 @@ namespace exprtk
|
||||||
return (name < se.name);
|
return (name < se.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
name = "???";
|
||||||
|
size = std::numeric_limits<std::size_t>::max();
|
||||||
|
index = std::numeric_limits<std::size_t>::max();
|
||||||
|
depth = std::numeric_limits<std::size_t>::max();
|
||||||
|
type = e_none;
|
||||||
|
active = false;
|
||||||
|
ref_count = 0;
|
||||||
|
ip_index = 0;
|
||||||
|
data = 0;
|
||||||
|
var_node = 0;
|
||||||
|
vec_node = 0;
|
||||||
|
#ifndef exprtk_disable_string_capabilities
|
||||||
|
str_node = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
std::size_t size;
|
std::size_t size;
|
||||||
std::size_t index;
|
std::size_t index;
|
||||||
|
@ -16033,32 +16058,36 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup()
|
inline void free_element(scope_element& se)
|
||||||
|
{
|
||||||
|
switch (se.type)
|
||||||
|
{
|
||||||
|
case scope_element::e_variable: if (se.data ) delete (T*) se.data;
|
||||||
|
if (se.var_node) delete se.var_node;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case scope_element::e_vector : if (se.data ) delete[] (T*) se.data;
|
||||||
|
if (se.vec_node) delete se.vec_node;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case scope_element::e_vecelem : if (se.var_node) delete se.var_node;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case scope_element::e_string : if (se.data ) delete (std::string*) se.data;
|
||||||
|
if (se.str_node) delete se.str_node;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default : return;
|
||||||
|
}
|
||||||
|
|
||||||
|
se.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void cleanup()
|
||||||
{
|
{
|
||||||
for (std::size_t i = 0; i < element_.size(); ++i)
|
for (std::size_t i = 0; i < element_.size(); ++i)
|
||||||
{
|
{
|
||||||
if (element_[i].var_node)
|
free_element(element_[i]);
|
||||||
{
|
|
||||||
delete element_[i].var_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (element_[i].vec_node)
|
|
||||||
{
|
|
||||||
delete element_[i].vec_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (element_[i].type)
|
|
||||||
{
|
|
||||||
case scope_element::e_variable : delete (T*)(element_[i].data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case scope_element::e_vector : delete [] (T*)(element_[i].data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case scope_element::e_string : delete (std::string*)(element_[i].data);
|
|
||||||
|
|
||||||
default : break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
element_.clear();
|
element_.clear();
|
||||||
|
@ -18870,8 +18899,9 @@ namespace exprtk
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR61 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM"));
|
"ERR61 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM"));
|
||||||
|
|
||||||
result = false;
|
sem_.free_element(nse);
|
||||||
|
|
||||||
|
result = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str()));
|
exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str()));
|
||||||
|
@ -20650,6 +20680,8 @@ namespace exprtk
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR136 - Failed to add new local vector '" + vec_name + "' to SEM"));
|
"ERR136 - Failed to add new local vector '" + vec_name + "' to SEM"));
|
||||||
|
|
||||||
|
sem_.free_element(nse);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20724,6 +20756,8 @@ namespace exprtk
|
||||||
|
|
||||||
free_node(node_allocator_,initialisation_expression);
|
free_node(node_allocator_,initialisation_expression);
|
||||||
|
|
||||||
|
sem_.free_element(nse);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20906,6 +20940,8 @@ namespace exprtk
|
||||||
|
|
||||||
free_node(node_allocator_,initialisation_expression);
|
free_node(node_allocator_,initialisation_expression);
|
||||||
|
|
||||||
|
sem_.free_element(nse);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20990,6 +21026,8 @@ namespace exprtk
|
||||||
current_token_,
|
current_token_,
|
||||||
"ERR151 - Failed to add new local variable '" + var_name + "' to SEM"));
|
"ERR151 - Failed to add new local variable '" + var_name + "' to SEM"));
|
||||||
|
|
||||||
|
sem_.free_element(nse);
|
||||||
|
|
||||||
return error_node();
|
return error_node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21294,9 +21332,7 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expression_node_ptr result = error_node();
|
expression_node_ptr result = expression_generator_.return_call(arg_list);
|
||||||
|
|
||||||
result = expression_generator_.return_call(arg_list);
|
|
||||||
|
|
||||||
sdd.delete_ptr = (0 == result);
|
sdd.delete_ptr = (0 == result);
|
||||||
|
|
||||||
|
@ -23677,9 +23713,8 @@ namespace exprtk
|
||||||
|
|
||||||
typedef details::return_node<Type> alloc_type;
|
typedef details::return_node<Type> alloc_type;
|
||||||
|
|
||||||
expression_node_ptr result = error_node();
|
expression_node_ptr result = node_allocator_->
|
||||||
|
allocate_rr<alloc_type>(arg_list,parser_->results_ctx());
|
||||||
result = node_allocator_->allocate_rr<alloc_type>(arg_list,parser_->results_ctx());
|
|
||||||
|
|
||||||
alloc_type* return_node_ptr = static_cast<alloc_type*>(result);
|
alloc_type* return_node_ptr = static_cast<alloc_type*>(result);
|
||||||
|
|
||||||
|
@ -23733,14 +23768,18 @@ namespace exprtk
|
||||||
if (!parser_->sem_.add_element(nse))
|
if (!parser_->sem_.add_element(nse))
|
||||||
{
|
{
|
||||||
parser_->set_synthesis_error("Failed to add new local vector element to SEM [1]");
|
parser_->set_synthesis_error("Failed to add new local vector element to SEM [1]");
|
||||||
|
|
||||||
|
parser_->sem_.free_element(nse);
|
||||||
|
|
||||||
result = error_node();
|
result = error_node();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
exprtk_debug(("vector_element() - INFO - Added new local vector element: %s\n",nse.name.c_str()));
|
exprtk_debug(("vector_element() - INFO - Added new local vector element: %s\n",nse.name.c_str()));
|
||||||
|
|
||||||
result = nse.var_node;
|
result = nse.var_node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
result = node_allocator_->allocate<details::vector_elem_node<Type> >(index,(*vector_base)[0]);
|
result = node_allocator_->allocate<details::vector_elem_node<Type> >(index,(*vector_base)[0]);
|
||||||
|
|
||||||
|
@ -31834,7 +31873,7 @@ namespace exprtk
|
||||||
|
|
||||||
switch (gt.type)
|
switch (gt.type)
|
||||||
{
|
{
|
||||||
case generic_type::e_scalar : print_type(scalar_format.c_str(),scalar_t(gt)(),num_type);
|
case generic_type::e_scalar : print_type(scalar_format,scalar_t(gt)(),num_type);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case generic_type::e_vector : {
|
case generic_type::e_vector : {
|
||||||
|
@ -31842,7 +31881,7 @@ namespace exprtk
|
||||||
|
|
||||||
for (std::size_t x = 0; x < vector.size(); ++x)
|
for (std::size_t x = 0; x < vector.size(); ++x)
|
||||||
{
|
{
|
||||||
print_type(scalar_format.c_str(),vector[x],num_type);
|
print_type(scalar_format,vector[x],num_type);
|
||||||
|
|
||||||
if ((x + 1) < vector.size())
|
if ((x + 1) < vector.size())
|
||||||
printf(" ");
|
printf(" ");
|
||||||
|
|
Loading…
Reference in New Issue