C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
exprtk::parser< T >::scope_element_manager Class Reference
Collaboration diagram for exprtk::parser< T >::scope_element_manager:
[legend]

Public Types

typedef expression_node_texpression_node_ptr
 
typedef variable_node_tvariable_node_ptr
 
typedef parser< T > parser_t
 

Public Member Functions

 scope_element_manager (parser< T > &p)
 
std::size_t size () const
 
bool empty () const
 
scope_elementget_element (const std::size_t &index)
 
scope_elementget_element (const std::string &var_name, const std::size_t index=std::numeric_limits< std::size_t >::max())
 
scope_elementget_active_element (const std::string &var_name, const std::size_t index=std::numeric_limits< std::size_t >::max())
 
bool add_element (const scope_element &se)
 
void deactivate (const std::size_t &scope_depth)
 
void free_element (scope_element &se)
 
void cleanup ()
 
std::size_t total_local_symb_size_bytes () const
 
std::size_t next_ip_index ()
 
expression_node_ptr get_variable (const T &v)
 
std::string get_vector_name (const T *data)
 

Private Member Functions

 scope_element_manager (const scope_element_manager &)
 
scope_element_manageroperator= (const scope_element_manager &)
 

Private Attributes

parser_tparser_
 
std::vector< scope_elementelement_
 
scope_element null_element_
 
std::size_t input_param_cnt_
 
std::size_t total_local_symb_size_bytes_
 

Detailed Description

template<typename T>
class exprtk::parser< T >::scope_element_manager

Definition at line 22661 of file exprtk.hpp.

Member Typedef Documentation

◆ expression_node_ptr

template<typename T >
typedef expression_node_t* exprtk::parser< T >::scope_element_manager::expression_node_ptr

Definition at line 22665 of file exprtk.hpp.

◆ parser_t

template<typename T >
typedef parser<T> exprtk::parser< T >::scope_element_manager::parser_t

Definition at line 22667 of file exprtk.hpp.

◆ variable_node_ptr

template<typename T >
typedef variable_node_t* exprtk::parser< T >::scope_element_manager::variable_node_ptr

Definition at line 22666 of file exprtk.hpp.

Constructor & Destructor Documentation

◆ scope_element_manager() [1/2]

template<typename T >
exprtk::parser< T >::scope_element_manager::scope_element_manager ( parser< T > &  p)
inlineexplicit

Definition at line 22669 of file exprtk.hpp.

◆ scope_element_manager() [2/2]

template<typename T >
exprtk::parser< T >::scope_element_manager::scope_element_manager ( const scope_element_manager )
private

Member Function Documentation

◆ add_element()

template<typename T >
bool exprtk::parser< T >::scope_element_manager::add_element ( const scope_element se)
inline

Definition at line 22736 of file exprtk.hpp.

22737 {
22738 for (std::size_t i = 0; i < element_.size(); ++i)
22739 {
22740 scope_element& cse = element_[i];
22741
22742 if (
22743 details::imatch(cse.name, se.name) &&
22744 (cse.depth <= se.depth) &&
22745 (cse.index == se.index) &&
22746 (cse.size == se.size ) &&
22747 (cse.type == se.type ) &&
22748 (cse.active)
22749 )
22750 return false;
22751 }
22752
22753 switch (se.type)
22754 {
22756 break;
22757
22759 break;
22760
22761 case scope_element::e_vector : total_local_symb_size_bytes_ += sizeof(T) * se.size;
22762 break;
22763
22764 default : break;
22765 }
22766
22767 element_.push_back(se);
22768 std::sort(element_.begin(),element_.end());
22769
22770 return true;
22771 }
std::vector< scope_element > element_
Definition exprtk.hpp:22898
bool imatch(const char_t c1, const char_t c2)
Definition exprtk.hpp:190

References exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element::depth, exprtk::parser< T >::scope_element::e_literal, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::scope_element::e_vector, exprtk::parser< T >::scope_element_manager::element_, exprtk::details::imatch(), exprtk::parser< T >::scope_element::index, exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element::size, exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes_, and exprtk::parser< T >::scope_element::type.

Referenced by exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_uninitialised_var_statement(), and exprtk::parser< T >::expression_generator< Type >::vector_element().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleanup()

template<typename T >
void exprtk::parser< T >::scope_element_manager::cleanup ( )
inline

Definition at line 22826 of file exprtk.hpp.

22827 {
22828 for (std::size_t i = 0; i < element_.size(); ++i)
22829 {
22831 }
22832
22833 element_.clear();
22834
22835 input_param_cnt_ = 0;
22837 }
void free_element(scope_element &se)
Definition exprtk.hpp:22793

References exprtk::parser< T >::scope_element_manager::element_, exprtk::parser< T >::scope_element_manager::free_element(), exprtk::parser< T >::scope_element_manager::input_param_cnt_, and exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes_.

Referenced by exprtk::parser< T >::compile().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ deactivate()

template<typename T >
void exprtk::parser< T >::scope_element_manager::deactivate ( const std::size_t &  scope_depth)
inline

Definition at line 22773 of file exprtk.hpp.

22774 {
22775 exprtk_debug(("deactivate() - Scope depth: %d\n",
22776 static_cast<int>(parser_.state_.scope_depth)));
22777
22778 for (std::size_t i = 0; i < element_.size(); ++i)
22779 {
22780 scope_element& se = element_[i];
22781
22782 if (se.active && (se.depth >= scope_depth))
22783 {
22784 exprtk_debug(("deactivate() - element[%02d] '%s'\n",
22785 static_cast<int>(i),
22786 se.name.c_str()));
22787
22788 se.active = false;
22789 }
22790 }
22791 }
parser_state state_
Definition exprtk.hpp:42114
#define exprtk_debug(params)
Definition exprtk.hpp:64

References exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element::depth, exprtk::parser< T >::scope_element_manager::element_, exprtk_debug, exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element_manager::parser_, exprtk::parser< T >::parser_state::scope_depth, and exprtk::parser< T >::state_.

Referenced by exprtk::parser< T >::scope_handler::~scope_handler().

Here is the caller graph for this function:

◆ empty()

template<typename T >
bool exprtk::parser< T >::scope_element_manager::empty ( ) const
inline

Definition at line 22680 of file exprtk.hpp.

22681 {
22682 return element_.empty();
22683 }

References exprtk::parser< T >::scope_element_manager::element_.

Referenced by exprtk::parser< T >::parse_symbol(), and exprtk::parser< T >::parse_symtab_symbol().

Here is the caller graph for this function:

◆ free_element()

template<typename T >
void exprtk::parser< T >::scope_element_manager::free_element ( scope_element se)
inline

Definition at line 22793 of file exprtk.hpp.

22794 {
22795 exprtk_debug(("free_element() - se[%s]\n", se.name.c_str()));
22796
22797 switch (se.type)
22798 {
22799 case scope_element::e_literal : delete reinterpret_cast<T*>(se.data);
22800 delete se.var_node;
22801 break;
22802
22803 case scope_element::e_variable : delete reinterpret_cast<T*>(se.data);
22804 delete se.var_node;
22805 break;
22806
22807 case scope_element::e_vector : delete[] reinterpret_cast<T*>(se.data);
22808 delete se.vec_node;
22809 break;
22810
22811 case scope_element::e_vecelem : delete se.var_node;
22812 break;
22813
22814 #ifndef exprtk_disable_string_capabilities
22815 case scope_element::e_string : delete reinterpret_cast<std::string*>(se.data);
22816 delete se.str_node;
22817 break;
22818 #endif
22819
22820 default : return;
22821 }
22822
22823 se.clear();
22824 }

References exprtk::parser< T >::scope_element::clear(), exprtk::parser< T >::scope_element::data, exprtk::parser< T >::scope_element::e_literal, exprtk::parser< T >::scope_element::e_string, exprtk::parser< T >::scope_element::e_variable, exprtk::parser< T >::scope_element::e_vecelem, exprtk::parser< T >::scope_element::e_vector, exprtk_debug, exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element::str_node, exprtk::parser< T >::scope_element::type, exprtk::parser< T >::scope_element::var_node, and exprtk::parser< T >::scope_element::vec_node.

Referenced by exprtk::parser< T >::scope_element_manager::cleanup(), exprtk::parser< T >::parse_define_constvar_statement(), exprtk::parser< T >::parse_define_string_statement(), exprtk::parser< T >::parse_define_var_statement(), exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_for_loop(), exprtk::parser< T >::parse_uninitialised_var_statement(), and exprtk::parser< T >::expression_generator< Type >::vector_element().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_active_element()

template<typename T >
scope_element & exprtk::parser< T >::scope_element_manager::get_active_element ( const std::string &  var_name,
const std::size_t  index = std::numeric_limits<std::size_t>::max() 
)
inline

Definition at line 22714 of file exprtk.hpp.

22716 {
22717 const std::size_t current_depth = parser_.state_.scope_depth;
22718
22719 for (std::size_t i = 0; i < element_.size(); ++i)
22720 {
22721 scope_element& se = element_[i];
22722
22723 if (se.depth > current_depth)
22724 continue;
22725 else if (
22726 details::imatch(se.name, var_name) &&
22727 (se.index == index) &&
22728 (se.active)
22729 )
22730 return se;
22731 }
22732
22733 return null_element_;
22734 }

References exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element::depth, exprtk::parser< T >::scope_element_manager::element_, exprtk::details::imatch(), exprtk::parser< T >::scope_element::index, exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element_manager::null_element_, exprtk::parser< T >::scope_element_manager::parser_, exprtk::parser< T >::parser_state::scope_depth, and exprtk::parser< T >::state_.

Referenced by exprtk::parser< T >::parse_define_vector_statement(), exprtk::parser< T >::parse_string(), exprtk::parser< T >::parse_symtab_symbol(), and exprtk::parser< T >::parse_vector().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_element() [1/2]

template<typename T >
scope_element & exprtk::parser< T >::scope_element_manager::get_element ( const std::size_t &  index)
inline

◆ get_element() [2/2]

template<typename T >
scope_element & exprtk::parser< T >::scope_element_manager::get_element ( const std::string &  var_name,
const std::size_t  index = std::numeric_limits<std::size_t>::max() 
)
inline

Definition at line 22693 of file exprtk.hpp.

22695 {
22696 const std::size_t current_depth = parser_.state_.scope_depth;
22697
22698 for (std::size_t i = 0; i < element_.size(); ++i)
22699 {
22700 scope_element& se = element_[i];
22701
22702 if (se.depth > current_depth)
22703 continue;
22704 else if (
22705 details::imatch(se.name, var_name) &&
22706 (se.index == index)
22707 )
22708 return se;
22709 }
22710
22711 return null_element_;
22712 }

References exprtk::parser< T >::scope_element::depth, exprtk::parser< T >::scope_element_manager::element_, exprtk::details::imatch(), exprtk::parser< T >::scope_element::index, exprtk::parser< T >::scope_element::name, exprtk::parser< T >::scope_element_manager::null_element_, exprtk::parser< T >::scope_element_manager::parser_, exprtk::parser< T >::parser_state::scope_depth, and exprtk::parser< T >::state_.

Here is the call graph for this function:

◆ get_variable()

template<typename T >
expression_node_ptr exprtk::parser< T >::scope_element_manager::get_variable ( const T &  v)
inline

Definition at line 22849 of file exprtk.hpp.

22850 {
22851 for (std::size_t i = 0; i < element_.size(); ++i)
22852 {
22853 scope_element& se = element_[i];
22854
22855 if (
22856 se.active &&
22857 se.var_node &&
22858 details::is_variable_node(se.var_node)
22859 )
22860 {
22861 variable_node_ptr vn = reinterpret_cast<variable_node_ptr>(se.var_node);
22862
22863 if (&(vn->ref()) == (&v))
22864 {
22865 return se.var_node;
22866 }
22867 }
22868 }
22869
22870 return expression_node_ptr(0);
22871 }
expression_node_t * expression_node_ptr
Definition exprtk.hpp:22665
bool is_variable_node(const expression_node< T > *node)
Definition exprtk.hpp:5806

References exprtk::parser< T >::scope_element::active, exprtk::parser< T >::scope_element_manager::element_, exprtk::details::is_variable_node(), exprtk::details::variable_node< T >::ref(), and exprtk::parser< T >::scope_element::var_node.

Referenced by exprtk::parser< T >::simplify_unary_negation_branch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_vector_name()

template<typename T >
std::string exprtk::parser< T >::scope_element_manager::get_vector_name ( const T *  data)
inline

Definition at line 22873 of file exprtk.hpp.

22874 {
22875 for (std::size_t i = 0; i < element_.size(); ++i)
22876 {
22877 scope_element& se = element_[i];
22878
22879 if (
22880 se.active &&
22881 se.vec_node &&
22882 (se.vec_node->data() == data)
22883 )
22884 {
22885 return se.name;
22886 }
22887 }
22888
22889 return "neo-vector";
22890 }

References exprtk::parser< T >::scope_element::active, exprtk::details::vector_holder< Type >::data(), exprtk::parser< T >::scope_element_manager::element_, exprtk::parser< T >::scope_element::name, and exprtk::parser< T >::scope_element::vec_node.

Referenced by exprtk::parser< T >::parse_pending_vector_index_operator().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ next_ip_index()

template<typename T >
std::size_t exprtk::parser< T >::scope_element_manager::next_ip_index ( )
inline

Definition at line 22844 of file exprtk.hpp.

22845 {
22846 return ++input_param_cnt_;
22847 }

References exprtk::parser< T >::scope_element_manager::input_param_cnt_.

Referenced by exprtk::parser< T >::parse_uninitialised_var_statement().

Here is the caller graph for this function:

◆ operator=()

template<typename T >
scope_element_manager & exprtk::parser< T >::scope_element_manager::operator= ( const scope_element_manager )
private

◆ size()

template<typename T >
std::size_t exprtk::parser< T >::scope_element_manager::size ( ) const
inline

Definition at line 22675 of file exprtk.hpp.

22676 {
22677 return element_.size();
22678 }

References exprtk::parser< T >::scope_element_manager::element_.

Referenced by exprtk::parser< T >::register_local_vars().

Here is the caller graph for this function:

◆ total_local_symb_size_bytes()

template<typename T >
std::size_t exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes ( ) const
inline

Member Data Documentation

◆ element_

template<typename T >
std::vector<scope_element> exprtk::parser< T >::scope_element_manager::element_
private

◆ input_param_cnt_

template<typename T >
std::size_t exprtk::parser< T >::scope_element_manager::input_param_cnt_
private

◆ null_element_

template<typename T >
scope_element exprtk::parser< T >::scope_element_manager::null_element_
private

◆ parser_

template<typename T >
parser_t& exprtk::parser< T >::scope_element_manager::parser_
private

◆ total_local_symb_size_bytes_

template<typename T >
std::size_t exprtk::parser< T >::scope_element_manager::total_local_symb_size_bytes_
private

The documentation for this class was generated from the following file: