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

This commit is contained in:
Arash Partow 2014-07-03 07:40:16 +10:00
parent f0525af667
commit 7a51d35c90
1 changed files with 68 additions and 22 deletions

View File

@ -12159,6 +12159,9 @@ namespace exprtk
}; };
template <typename T>
class function_compositor;
template <typename T> template <typename T>
class expression class expression
{ {
@ -12171,13 +12174,34 @@ namespace exprtk
{ {
enum data_type enum data_type
{ {
e_unknown, e_unknown ,
e_expr, e_expr ,
e_vecholder, e_vecholder,
e_data, e_data ,
e_vecdata e_vecdata
}; };
struct data_pack
{
data_pack()
: pointer(0),
type(e_unknown),
size(0)
{}
data_pack(void* ptr, data_type dt, std::size_t sz = 0)
: pointer(ptr),
type(dt),
size(sz)
{}
void* pointer;
data_type type;
std::size_t size;
};
typedef std::vector<data_pack> local_data_list_t;
expression_holder() expression_holder()
: ref_count(0), : ref_count(0),
expr(0) expr(0)
@ -12199,18 +12223,18 @@ namespace exprtk
{ {
for (std::size_t i = 0; i < local_data_list.size(); ++i) for (std::size_t i = 0; i < local_data_list.size(); ++i)
{ {
switch (local_data_list[i].second) switch (local_data_list[i].type)
{ {
case e_expr : delete reinterpret_cast<expression_ptr>(local_data_list[i].first); case e_expr : delete reinterpret_cast<expression_ptr>(local_data_list[i].pointer);
break; break;
case e_vecholder : delete reinterpret_cast<vector_holder_ptr>(local_data_list[i].first); case e_vecholder : delete reinterpret_cast<vector_holder_ptr>(local_data_list[i].pointer);
break; break;
case e_data : delete (T*)(local_data_list[i].first); case e_data : delete (T*)(local_data_list[i].pointer);
break; break;
case e_vecdata : delete [] (T*)(local_data_list[i].first); case e_vecdata : delete [] (T*)(local_data_list[i].pointer);
break; break;
default : break; default : break;
@ -12221,7 +12245,7 @@ namespace exprtk
std::size_t ref_count; std::size_t ref_count;
expression_ptr expr; expression_ptr expr;
std::vector<std::pair<void*,data_type> > local_data_list; local_data_list_t local_data_list;
}; };
public: public:
@ -12249,8 +12273,10 @@ namespace exprtk
{ {
delete expression_holder_; delete expression_holder_;
} }
expression_holder_ = 0; expression_holder_ = 0;
} }
expression_holder_ = e.expression_holder_; expression_holder_ = e.expression_holder_;
expression_holder_->ref_count++; expression_holder_->ref_count++;
symbol_table_ = e.symbol_table_; symbol_table_ = e.symbol_table_;
@ -12266,7 +12292,7 @@ namespace exprtk
inline bool operator!() const inline bool operator!() const
{ {
return ( return (
(0 == expression_holder_) || (0 == expression_holder_ ) ||
(0 == expression_holder_->expr) (0 == expression_holder_->expr)
); );
} }
@ -12279,8 +12305,10 @@ namespace exprtk
{ {
delete expression_holder_; delete expression_holder_;
} }
expression_holder_ = 0; expression_holder_ = 0;
} }
return *this; return *this;
} }
@ -12343,6 +12371,7 @@ namespace exprtk
delete expression_holder_; delete expression_holder_;
} }
} }
expression_holder_ = new expression_holder(expr); expression_holder_ = new expression_holder(expr);
} }
} }
@ -12355,8 +12384,9 @@ namespace exprtk
{ {
expression_holder_-> expression_holder_->
local_data_list.push_back( local_data_list.push_back(
std::make_pair(reinterpret_cast<void*>(expr), typename expression<T>::expression_holder::
expression_holder::e_expr)); data_pack(reinterpret_cast<void*>(expr),
expression_holder::e_expr));
} }
} }
} }
@ -12369,8 +12399,9 @@ namespace exprtk
{ {
expression_holder_-> expression_holder_->
local_data_list.push_back( local_data_list.push_back(
std::make_pair(reinterpret_cast<void*>(vec_holder), typename expression<T>::expression_holder::
expression_holder::e_vecholder)); data_pack(reinterpret_cast<void*>(vec_holder),
expression_holder::e_vecholder));
} }
} }
} }
@ -12383,18 +12414,33 @@ namespace exprtk
{ {
expression_holder_-> expression_holder_->
local_data_list.push_back( local_data_list.push_back(
std::make_pair(reinterpret_cast<void*>(data), typename expression<T>::expression_holder::
vectype ? expression_holder::e_vecdata : data_pack(reinterpret_cast<void*>(data),
expression_holder::e_data)); vectype ? expression_holder::e_vecdata :
expression_holder::e_data));
} }
} }
} }
inline typename expression_holder::local_data_list_t local_data_list()
{
if (expression_holder_)
{
return expression_holder_->local_data_list;
}
else
{
static typename expression_holder::local_data_list_t null_local_data_list;
return null_local_data_list;
}
}
expression_holder* expression_holder_; expression_holder* expression_holder_;
symbol_table<T> symbol_table_; symbol_table<T> symbol_table_;
friend class parser<T>; friend class parser<T>;
friend class expression_helper<T>; friend class expression_helper<T>;
friend class function_compositor<T>;
}; };
template <typename T> template <typename T>
@ -12476,12 +12522,12 @@ namespace exprtk
switch (mode) switch (mode)
{ {
case e_unknown : return std::string("Unknown Error"); case e_unknown : return std::string("Unknown Error");
case e_syntax : return std::string("Syntax Error"); case e_syntax : return std::string("Syntax Error" );
case e_token : return std::string("Token Error"); case e_token : return std::string("Token Error" );
case e_numeric : return std::string("Numeric Error"); case e_numeric : return std::string("Numeric Error");
case e_symtab : return std::string("Symbol Error"); case e_symtab : return std::string("Symbol Error" );
case e_lexer : return std::string("Lexer Error"); case e_lexer : return std::string("Lexer Error" );
case e_helper : return std::string("Helper Error"); case e_helper : return std::string("Helper Error" );
default : return std::string("Unknown Error"); default : return std::string("Unknown Error");
} }
} }