C++ Mathematical Expression Library (ExprTk) http://www.partow.net/programming/exprtk/index.html
This commit is contained in:
parent
1b32ca4bbb
commit
d26bb0eafc
162
exprtk.hpp
162
exprtk.hpp
|
@ -311,7 +311,7 @@ namespace exprtk
|
||||||
exprtk_register_int_type_tag(unsigned long long int)
|
exprtk_register_int_type_tag(unsigned long long int)
|
||||||
|
|
||||||
#undef exprtk_register_real_type_tag
|
#undef exprtk_register_real_type_tag
|
||||||
#undef exprtk_register_real_type_tag
|
#undef exprtk_register_int_type_tag
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline T equal_impl(const T& v0, const T& v1, real_type_tag)
|
inline T equal_impl(const T& v0, const T& v1, real_type_tag)
|
||||||
|
@ -3661,6 +3661,29 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline std::string& stringvar_ref(const std::string& symbol_name)
|
||||||
|
{
|
||||||
|
static std::string null_stringvar;
|
||||||
|
if (!valid_symbol(symbol_name))
|
||||||
|
return null_var;
|
||||||
|
else if (1 == symbol_name.size())
|
||||||
|
{
|
||||||
|
stringvar_pair_t& svp = short_stringvar_lut_[static_cast<std::size_t>(symbol_name[0])];
|
||||||
|
if (svp.second)
|
||||||
|
return svp->second.ref();
|
||||||
|
else
|
||||||
|
return null_stringvar;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
svm_const_itr_t itr = stringvar_map_.find(symbol_name);
|
||||||
|
if (stringvar_map_.end() == itr)
|
||||||
|
return null_var;
|
||||||
|
else
|
||||||
|
return itr->second.second->ref();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline bool is_constant_node(const std::string& symbol_name) const
|
inline bool is_constant_node(const std::string& symbol_name) const
|
||||||
{
|
{
|
||||||
if (1 == symbol_name.size())
|
if (1 == symbol_name.size())
|
||||||
|
@ -3704,6 +3727,17 @@ namespace exprtk
|
||||||
return add_variable(variable_name,t);
|
return add_variable(variable_name,t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool create_stringvar(const std::string& stringvar_name, const std::string& value = std::string(""))
|
||||||
|
{
|
||||||
|
if (!valid_symbol(stringvar_name))
|
||||||
|
return false;
|
||||||
|
else if (symbol_exists(stringvar_name))
|
||||||
|
return false;
|
||||||
|
local_stringvar_list_.push_back(value);
|
||||||
|
std::string& s = local_stringvar_list_.back();
|
||||||
|
return add_stringvar(stringvar_name,s);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool add_variable(const std::string& variable_name, T& t, const bool is_constant = false)
|
inline bool add_variable(const std::string& variable_name, T& t, const bool is_constant = false)
|
||||||
{
|
{
|
||||||
if (!valid_symbol(variable_name))
|
if (!valid_symbol(variable_name))
|
||||||
|
@ -3936,6 +3970,90 @@ namespace exprtk
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Allocator,
|
||||||
|
template <typename, typename> class Sequence>
|
||||||
|
inline std::size_t get_variable_list(Sequence<std::string,Allocator>& vlist) const
|
||||||
|
{
|
||||||
|
std::size_t count = 0;
|
||||||
|
for (std::size_t i = 0; i < lut_size; ++i)
|
||||||
|
{
|
||||||
|
const variable_pair_t& vp = short_variable_lut_[static_cast<std::size_t>(i)];
|
||||||
|
if (0 != vp.second)
|
||||||
|
{
|
||||||
|
vlist.push_back(std::string("") + static_cast<char>(i));
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!variable_map_.empty())
|
||||||
|
{
|
||||||
|
vm_const_itr_t itr = variable_map_.begin();
|
||||||
|
vm_const_itr_t end = variable_map_.end();
|
||||||
|
while (end != itr)
|
||||||
|
{
|
||||||
|
vlist.push_back((*itr).first);
|
||||||
|
++itr;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Allocator,
|
||||||
|
template <typename, typename> class Sequence>
|
||||||
|
inline std::size_t get_stringvar_list(Sequence<std::pair<std::string,std::string>,Allocator>& svlist) const
|
||||||
|
{
|
||||||
|
std::size_t count = 0;
|
||||||
|
for (std::size_t i = 0; i < lut_size; ++i)
|
||||||
|
{
|
||||||
|
const stringvar_pair_t& svp = short_stringvar_lut_[static_cast<std::size_t>(i)];
|
||||||
|
if (0 != svp.second)
|
||||||
|
{
|
||||||
|
svlist.push_back(std::make_pair(std::string("") + static_cast<char>(i),svp.second->ref()));
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!stringvar_map_.empty())
|
||||||
|
{
|
||||||
|
svm_const_itr_t itr = stringvar_map_.begin();
|
||||||
|
svm_const_itr_t end = stringvar_map_.end();
|
||||||
|
while (end != itr)
|
||||||
|
{
|
||||||
|
svlist.push_back(std::make_pair((*itr).first,itr->second.second->ref()));
|
||||||
|
++itr;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Allocator,
|
||||||
|
template <typename, typename> class Sequence>
|
||||||
|
inline std::size_t get_stringvar_list(Sequence<std::string,Allocator>& svlist) const
|
||||||
|
{
|
||||||
|
std::size_t count = 0;
|
||||||
|
for (std::size_t i = 0; i < lut_size; ++i)
|
||||||
|
{
|
||||||
|
const stringvar_pair_t& svp = short_stringvar_lut_[static_cast<std::size_t>(i)];
|
||||||
|
if (0 != svp.second)
|
||||||
|
{
|
||||||
|
svlist.push_back(std::string("") + static_cast<char>(i));
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!stringvar_map_.empty())
|
||||||
|
{
|
||||||
|
svm_const_itr_t itr = stringvar_map_.begin();
|
||||||
|
svm_const_itr_t end = stringvar_map_.end();
|
||||||
|
while (end != itr)
|
||||||
|
{
|
||||||
|
svlist.push_back((*itr).first);
|
||||||
|
++itr;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
inline bool symbol_exists(const std::string& symbol_name) const
|
inline bool symbol_exists(const std::string& symbol_name) const
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -3944,7 +4062,7 @@ namespace exprtk
|
||||||
*/
|
*/
|
||||||
if ((1 == symbol_name.size()) && short_variable_lut_[static_cast<std::size_t>(symbol_name[0])].second)
|
if ((1 == symbol_name.size()) && short_variable_lut_[static_cast<std::size_t>(symbol_name[0])].second)
|
||||||
return true;
|
return true;
|
||||||
if ((1 == symbol_name.size()) && short_stringvar_lut_[static_cast<std::size_t>(symbol_name[0])].second)
|
else if ((1 == symbol_name.size()) && short_stringvar_lut_[static_cast<std::size_t>(symbol_name[0])].second)
|
||||||
return true;
|
return true;
|
||||||
else if ((1 == symbol_name.size()) && short_function_lut_[static_cast<std::size_t>(symbol_name[0])])
|
else if ((1 == symbol_name.size()) && short_function_lut_[static_cast<std::size_t>(symbol_name[0])])
|
||||||
return true;
|
return true;
|
||||||
|
@ -3958,6 +4076,36 @@ namespace exprtk
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool is_variable(const std::string& variable_name) const
|
||||||
|
{
|
||||||
|
if ((1 == variable_name.size()) && short_variable_lut_[static_cast<std::size_t>(variable_name[0])].second)
|
||||||
|
return true;
|
||||||
|
else if (variable_map_.end() != variable_map_.find(variable_name))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_stringvar(const std::string& stringvar_name) const
|
||||||
|
{
|
||||||
|
if ((1 == stringvar_name.size()) && short_stringvar_lut_[static_cast<std::size_t>(stringvar_name[0])].second)
|
||||||
|
return true;
|
||||||
|
else if (stringvar_map_.end() != stringvar_map_.find(stringvar_name))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_function(const std::string& function_name) const
|
||||||
|
{
|
||||||
|
if ((1 == function_name.size()) && short_function_lut_[static_cast<std::size_t>(function_name[0])].second)
|
||||||
|
return true;
|
||||||
|
else if (function_map_.end() != function_map_.find(function_name))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
symbol_table(const symbol_table<T>&);
|
symbol_table(const symbol_table<T>&);
|
||||||
|
@ -4097,11 +4245,6 @@ namespace exprtk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline T operator()() const
|
|
||||||
{
|
|
||||||
return value();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline T value() const
|
inline T value() const
|
||||||
{
|
{
|
||||||
if (expression_holder_ && expression_holder_->expr)
|
if (expression_holder_ && expression_holder_->expr)
|
||||||
|
@ -4110,6 +4253,11 @@ namespace exprtk
|
||||||
return std::numeric_limits<T>::quiet_NaN();
|
return std::numeric_limits<T>::quiet_NaN();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline T operator()() const
|
||||||
|
{
|
||||||
|
return value();
|
||||||
|
}
|
||||||
|
|
||||||
inline operator T() const
|
inline operator T() const
|
||||||
{
|
{
|
||||||
return value();
|
return value();
|
||||||
|
|
187
exprtk_test.cpp
187
exprtk_test.cpp
|
@ -1438,6 +1438,11 @@ inline bool run_test10()
|
||||||
T xx = T(3.3);
|
T xx = T(3.3);
|
||||||
T yy = T(4.4);
|
T yy = T(4.4);
|
||||||
|
|
||||||
|
std::string i = "A String";
|
||||||
|
std::string j = "Another String";
|
||||||
|
std::string ii = "A String";
|
||||||
|
std::string jj = "Another String";
|
||||||
|
|
||||||
exprtk::symbol_table<T> symbol_table;
|
exprtk::symbol_table<T> symbol_table;
|
||||||
|
|
||||||
struct test
|
struct test
|
||||||
|
@ -1560,12 +1565,6 @@ inline bool run_test10()
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::string i = "A String";
|
|
||||||
std::string j = "Another String";
|
|
||||||
|
|
||||||
std::string ii = "A String";
|
|
||||||
std::string jj = "Another String";
|
|
||||||
|
|
||||||
symbol_table.add_stringvar("i",i);
|
symbol_table.add_stringvar("i",i);
|
||||||
symbol_table.add_stringvar("j",j);
|
symbol_table.add_stringvar("j",j);
|
||||||
|
|
||||||
|
@ -1634,6 +1633,182 @@ inline bool run_test10()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
symbol_table.add_variable("x", x);
|
||||||
|
symbol_table.add_variable("y", y);
|
||||||
|
symbol_table.add_variable("xx",xx);
|
||||||
|
symbol_table.add_variable("yy",yy);
|
||||||
|
|
||||||
|
std::vector<std::string> expected_var_list;
|
||||||
|
|
||||||
|
expected_var_list.push_back( "x");
|
||||||
|
expected_var_list.push_back( "y");
|
||||||
|
expected_var_list.push_back("xx");
|
||||||
|
expected_var_list.push_back("yy");
|
||||||
|
|
||||||
|
std::deque<std::pair<std::string,T> > variable_list;
|
||||||
|
|
||||||
|
symbol_table.get_variable_list(variable_list);
|
||||||
|
|
||||||
|
if (variable_list.size() != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get variable list (1)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t found_count = 0;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < variable_list.size(); ++i)
|
||||||
|
{
|
||||||
|
for (std::size_t j = 0; j < expected_var_list.size(); ++j)
|
||||||
|
{
|
||||||
|
if (variable_list[i].first == expected_var_list[j])
|
||||||
|
{
|
||||||
|
++found_count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found_count != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get variable list (2)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
symbol_table.add_variable("x", x);
|
||||||
|
symbol_table.add_variable("y", y);
|
||||||
|
symbol_table.add_variable("xx",xx);
|
||||||
|
symbol_table.add_variable("yy",yy);
|
||||||
|
|
||||||
|
std::vector<std::string> expected_var_list;
|
||||||
|
|
||||||
|
expected_var_list.push_back( "x");
|
||||||
|
expected_var_list.push_back( "y");
|
||||||
|
expected_var_list.push_back("xx");
|
||||||
|
expected_var_list.push_back("yy");
|
||||||
|
|
||||||
|
std::deque<std::string> variable_list;
|
||||||
|
|
||||||
|
symbol_table.get_variable_list(variable_list);
|
||||||
|
|
||||||
|
if (variable_list.size() != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get variable list (3)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t found_count = 0;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < variable_list.size(); ++i)
|
||||||
|
{
|
||||||
|
for (std::size_t j = 0; j < expected_var_list.size(); ++j)
|
||||||
|
{
|
||||||
|
if (variable_list[i] == expected_var_list[j])
|
||||||
|
{
|
||||||
|
++found_count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found_count != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get variable list (4)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
symbol_table.add_stringvar( "i", i);
|
||||||
|
symbol_table.add_stringvar( "j", j);
|
||||||
|
symbol_table.add_stringvar("ii",ii);
|
||||||
|
symbol_table.add_stringvar("jj",jj);
|
||||||
|
|
||||||
|
std::vector<std::string> expected_var_list;
|
||||||
|
|
||||||
|
expected_var_list.push_back( "i");
|
||||||
|
expected_var_list.push_back( "j");
|
||||||
|
expected_var_list.push_back("ii");
|
||||||
|
expected_var_list.push_back("jj");
|
||||||
|
|
||||||
|
std::deque<std::pair<std::string,std::string> > stringvar_list;
|
||||||
|
|
||||||
|
symbol_table.get_stringvar_list(stringvar_list);
|
||||||
|
|
||||||
|
if (stringvar_list.size() != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get stringvar list (1)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t found_count = 0;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < stringvar_list.size(); ++i)
|
||||||
|
{
|
||||||
|
for (std::size_t j = 0; j < expected_var_list.size(); ++j)
|
||||||
|
{
|
||||||
|
if (stringvar_list[i].first == expected_var_list[j])
|
||||||
|
{
|
||||||
|
++found_count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found_count != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get stringvar list (2)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
symbol_table.add_stringvar("i", i);
|
||||||
|
symbol_table.add_stringvar("j", j);
|
||||||
|
symbol_table.add_stringvar("ii",ii);
|
||||||
|
symbol_table.add_stringvar("jj",jj);
|
||||||
|
|
||||||
|
std::vector<std::string> expected_var_list;
|
||||||
|
|
||||||
|
expected_var_list.push_back( "i");
|
||||||
|
expected_var_list.push_back( "j");
|
||||||
|
expected_var_list.push_back("ii");
|
||||||
|
expected_var_list.push_back("jj");
|
||||||
|
|
||||||
|
std::deque<std::string> stringvar_list;
|
||||||
|
|
||||||
|
symbol_table.get_stringvar_list(stringvar_list);
|
||||||
|
|
||||||
|
if (stringvar_list.size() != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get stringvar list (3)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t found_count = 0;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < stringvar_list.size(); ++i)
|
||||||
|
{
|
||||||
|
for (std::size_t j = 0; j < expected_var_list.size(); ++j)
|
||||||
|
{
|
||||||
|
if (stringvar_list[i] == expected_var_list[j])
|
||||||
|
{
|
||||||
|
++found_count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found_count != expected_var_list.size())
|
||||||
|
{
|
||||||
|
std::cout << "run_test10() - Failed to get stringvar list (4)\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue