diff --git a/src/base/statistics.hh b/src/base/statistics.hh --- a/src/base/statistics.hh +++ b/src/base/statistics.hh @@ -2024,6 +2024,16 @@ * */ virtual std::string str() const = 0; + + /** + * Check whether this node is a scalar or not + */ + virtual bool scalar() const = 0; + + /** + * Check for validity of this node + */ + virtual bool check() const { return true; } }; /** Reference counting pointer to a function Node. */ @@ -2049,6 +2059,8 @@ size_type size() const { return 1; } + bool scalar() const { return true; } + /** * */ @@ -2086,6 +2098,8 @@ return 1; } + bool scalar() const { return true; } + /** * */ @@ -2107,7 +2121,7 @@ Result total() const { return data->total(); }; size_type size() const { return data->size(); } - + bool scalar() const { return false; } std::string str() const { return data->name; } }; @@ -2122,6 +2136,7 @@ const VResult &result() const { return vresult; } Result total() const { return vresult[0]; }; size_type size() const { return 1; } + bool scalar() const { return true; } std::string str() const { return to_string(vresult[0]); } }; @@ -2146,6 +2161,7 @@ } size_type size() const { return vresult.size(); } + bool scalar() const { return false; } std::string str() const { @@ -2234,6 +2250,7 @@ } size_type size() const { return l->size(); } + bool scalar() const { return l->scalar(); } std::string str() const @@ -2310,6 +2327,14 @@ } } + bool scalar() const { return l->scalar() && r->scalar(); } + + bool + check() const + { + return l->scalar() || r->scalar() || l->size() == r->size(); + } + std::string str() const { @@ -2360,6 +2385,7 @@ } size_type size() const { return 1; } + bool scalar() const { return true; } std::string str() const @@ -2876,6 +2902,9 @@ bool zero() const; std::string str() const; + + bool scalar() const { return root->scalar(); } + bool check() const; }; class FormulaNode : public Node @@ -2891,6 +2920,9 @@ const VResult &result() const { formula.result(vec); return vec; } Result total() const { return formula.total(); } + bool scalar() const { return formula.scalar(); } + bool check() const { return formula.check(); } + std::string str() const { return formula.str(); } }; diff --git a/src/base/statistics.cc b/src/base/statistics.cc --- a/src/base/statistics.cc +++ b/src/base/statistics.cc @@ -433,6 +433,12 @@ return root ? root->str() : ""; } +bool +Formula::check() const +{ + return root->check(); +} + CallbackQueue resetQueue; void