C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html

This commit is contained in:
Arash Partow 2015-04-18 14:39:09 +10:00
parent e1a160efcc
commit 060ac1140e
1 changed files with 75 additions and 36 deletions

View File

@ -3703,8 +3703,15 @@ namespace exprtk
inline const value_t* begin() const { return data_; }
inline value_t* begin() { return data_; }
inline const value_t* end() const { return data_ + ts_.size; }
inline value_t* end() { return data_ + ts_.size; }
inline const value_t* end() const
{
return static_cast<value_t*>(data_ + ts_.size);
}
inline value_t* end()
{
return static_cast<value_t*>(data_ + ts_.size);
}
type_store_t& ts_;
value_t* data_;
@ -15906,6 +15913,24 @@ namespace exprtk
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::size_t size;
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)
{
if (element_[i].var_node)
{
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;
}
free_element(element_[i]);
}
element_.clear();
@ -18870,8 +18899,9 @@ namespace exprtk
current_token_,
"ERR61 - Failed to add new local variable '" + loop_counter_symbol + "' to SEM"));
result = false;
sem_.free_element(nse);
result = false;
}
else
exprtk_debug(("parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str()));
@ -20650,6 +20680,8 @@ namespace exprtk
current_token_,
"ERR136 - Failed to add new local vector '" + vec_name + "' to SEM"));
sem_.free_element(nse);
return error_node();
}
@ -20724,6 +20756,8 @@ namespace exprtk
free_node(node_allocator_,initialisation_expression);
sem_.free_element(nse);
return error_node();
}
@ -20906,6 +20940,8 @@ namespace exprtk
free_node(node_allocator_,initialisation_expression);
sem_.free_element(nse);
return error_node();
}
@ -20990,6 +21026,8 @@ namespace exprtk
current_token_,
"ERR151 - Failed to add new local variable '" + var_name + "' to SEM"));
sem_.free_element(nse);
return error_node();
}
@ -21294,9 +21332,7 @@ namespace exprtk
}
}
expression_node_ptr result = error_node();
result = expression_generator_.return_call(arg_list);
expression_node_ptr result = expression_generator_.return_call(arg_list);
sdd.delete_ptr = (0 == result);
@ -23677,9 +23713,8 @@ namespace exprtk
typedef details::return_node<Type> alloc_type;
expression_node_ptr result = error_node();
result = node_allocator_->allocate_rr<alloc_type>(arg_list,parser_->results_ctx());
expression_node_ptr result = node_allocator_->
allocate_rr<alloc_type>(arg_list,parser_->results_ctx());
alloc_type* return_node_ptr = static_cast<alloc_type*>(result);
@ -23733,12 +23768,16 @@ namespace exprtk
if (!parser_->sem_.add_element(nse))
{
parser_->set_synthesis_error("Failed to add new local vector element to SEM [1]");
parser_->sem_.free_element(nse);
result = error_node();
}
else
{
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
@ -31834,7 +31873,7 @@ namespace exprtk
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;
case generic_type::e_vector : {
@ -31842,7 +31881,7 @@ namespace exprtk
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())
printf(" ");