6eb06cf201
Squashed commit of the following: commit f029195705a15700380c6f832ba5d15d46fd6de7 Author: Jonathan R. Madsen <jrmadsen@users.noreply.github.com> Date: Thu Jul 13 14:38:56 2023 -0500 Formatting workflows for source (clang-format) and cmake (cmake-format) (#4) * Add .cmake-format.yaml file * Add formatting workflow * provide base input for creating PR * Update scheme for extracting branch name - disable running formatting on push to amd-staging branch * patch .cmake-format.yaml for find_package signature - apparently cmake-format doesn't format the full signature of find_package * run formatting (clang-format v11) (#7) Co-authored-by: jrmadsen <jrmadsen@users.noreply.github.com> * run cmake formatting (cmake-format) (#6) Co-authored-by: jrmadsen <jrmadsen@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit bc4d135fdd8a1a9e51235f18a5d575fd2b3735e6 Author: Ammar ELWazir <aelwazir@amd.com> Date: Thu Jul 13 12:55:17 2023 -0500 Removing Build cache for potential issues with auto-generated header files (#5) Change-Id: I9e2319f4335e2f88585ffa6fac2bd88a1c952e6e commit ce86dea6a311d44d880fa684eb78f3329295e2a4 Author: Jonathan R. Madsen <jrmadsen@users.noreply.github.com> Date: Thu Jul 13 11:08:58 2023 -0500 Fix decltype(<hsa-function>) function pointer usage (#3) - the following is done in several places: decltype(hsa_memory_allocate)* hsa_memory_allocate - above can cause compiler errors - replace decltype(<hsa-function>) with decltype(::<hsa-function>) - this ensures that the type within the decltype is recognized as the global scope HSA function, not the variable - in many places, the variable has a "_fn" suffix to prevent this issue but added '::' anyway for consistency commit ac49fdd92a72e9c99394253a02da413a6c2e3b3a Merge: a07946a 03a0855 Author: Ammar ELWazir <aelwazir@amd.com> Date: Wed Jul 12 11:36:24 2023 -0500 Merge pull request #2 from ROCm-Developer-Tools/gerrit-amd-staging Pull from gerrit commit 03a085588cffe863e8f466de67be1cfb205b675a Merge:c26b32ba07946a Author: Ammar ELWazir <aelwazir@amd.com> Date: Wed Jul 12 10:57:30 2023 -0500 Merge branch 'amd-staging' into gerrit-amd-staging commit a07946a5cd4c670c83c27ad1a076a9d4567ce6d7 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 15:46:04 2023 +0000 Enabling Cached Builds commit 525e494a7f13941077a8fd4ad6840904db4d27d4 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 04:53:54 2023 +0000 Updating missed GPU Targets commit 42c75862f628c9bee7cfb7dc04dff2619430efbc Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 04:43:02 2023 +0000 Adding V1 Testing commit 9d72fd4aee85e4b0c12e717060d2730fa5b73be1 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 03:34:31 2023 +0000 Fixing Artifacts directory path commit f4000cc558b3b2e4676f7994f7ce8c8e6f94518e Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 03:27:26 2023 +0000 Fixing CMake for test build job commit 2ce8115d4c33948c3c8f957f545a95a04e1d6cd2 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 03:16:18 2023 +0000 Fixing Ubuntu CMake for ubuntu test build commit 6d0ed439191be900748d0c025157f9d689a73ec7 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 01:28:41 2023 +0000 Removing Navi21 commit e349a7642e5ae5eb03ab9fcd0a0f74f09f78cab5 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 01:14:14 2023 +0000 Removing Navi21 commit fefd02fe68d2a4bca7ec2e381960ad004ee9fc5b Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 00:42:48 2023 +0000 Fixing CMake Job commit 2ea46abf7bf92643efa8c549fa70346ffbd79d65 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 00:35:13 2023 +0000 Fixing CMake Job commit d99d681ed1999c5fcf291dc678b11a77205fb0f3 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Wed Jul 12 00:32:13 2023 +0000 Fixing Pull Latest Dockers and CMake Jobs commit dfc4498072d13b4a1df3a63047d34c682c3d9a29 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Tue Jul 11 23:54:21 2023 +0000 Fixing CMake job commit 919efe04de707f7c702031be15c3e2c5f8442cbb Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Tue Jul 11 23:52:13 2023 +0000 Adding Pull Last dockers job commit be1b1256e8b0e05308e8f7e7e69bee3acca55281 Author: Ammar ELWazir <aelwazir@amd.com> Date: Tue Jul 11 18:25:40 2023 -0500 Update cmake.yml commit 212299fa4355ae6ec18f9aaacbb79c51ea6c6f97 Author: Ammar ELWazir <aelwazir@amd.com> Date: Tue Jul 11 18:23:35 2023 -0500 Update cmake.yml commit 7c2c1327086a61466cc6cac39f70865c051a8bc7 Author: Ammar ELWazir <aelwazir@amd.com> Date: Tue Jul 11 18:18:53 2023 -0500 Update cmake.yml commit 191b5ce007e612e814c1d7a3afb4ad398f3852e1 Author: Ammar ELWazir <aelwazir@amd.com> Date: Tue Jul 11 16:03:22 2023 -0500 Update cmake.yml commit 8824113d95f3e13c7ce4d0af8e0d9d8f522a6c4a Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Tue Jul 11 16:28:09 2023 +0000 Fixing Pull from Gerrit job name Change-Id: I9e7ed9a27a13ca49d62c93bdadb30f0057e4d385 commit cc3d5e4b02ffb439e8cc2b3efa53527c376f9982 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Tue Jul 11 16:21:43 2023 +0000 Adding Staging sync job Change-Id: I0551f43878b0678ce4b3e74e27d62357cf95ad95 commit b9be2eee71380a2e6dd34d520e92d0c4209277a0 Author: Ammar ELWazir <Ammar.ELWazir@amd.com> Date: Tue Jul 11 15:57:11 2023 +0000 Fixing build.sh Change-Id: Ia987b0244f0875370d5fe69907b3f5e9cea914de commit 9eee33a95a1abd656a7ac5ca10a9f245e9825431 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 21:39:46 2023 -0500 Update cmake.yml commit 7093b85a78497140e8b52632ca2a002bdaeacd62 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 21:33:29 2023 -0500 Update cmake.yml commit f54697172c72a67740f9fdfa0c217b6ea6931576 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 21:01:26 2023 -0500 Update cmake.yml commit 1b6620e16f8940386b0f4f04e69e2410d21c0e26 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 20:21:02 2023 -0500 Update cmake.yml commit a94bec740c6b42c4b79c87bca20fa87b99bf060d Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 19:46:35 2023 -0500 Update cmake.yml commit 85d6b29d4375a69d575c18ece8542c50f2ddfcc3 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 19:34:39 2023 -0500 Update cmake.yml commit 8c004887cf1435f1a6214c3d2455299a8a27bd4c Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 19:31:17 2023 -0500 Update cmake.yml commit a14a9168e17d9348a53c6e9c9a47ba1edb4c4509 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 19:25:46 2023 -0500 Update cmake.yml commit 000f2f40b84e6a2f7d4becdbf5aed01436ca4c83 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 19:08:18 2023 -0500 Update cmake.yml commit a28a53d56731cad848fa9133d1c4dbaa8fc7afa7 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 19:03:39 2023 -0500 Update cmake.yml commit a6a2db01027f0b01fdfbb5997ddb772c7f51b649 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 18:21:53 2023 -0500 Update cmake.yml commit 118ef2a88b2d44e3207c31c343da3e5e5ec6f176 Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 17:55:57 2023 -0500 Update cmake.yml commit 03c4c232396440cd0be6d2dd7baf4ceea1c2589d Author: Ammar ELWazir <aelwazir@amd.com> Date: Mon Jul 10 17:48:49 2023 -0500 Create cmake.yml Change-Id: I77992f15694e77cbae49c56f9ff02f4f9079235d [ROCm/rocprofiler commit:d4a33cf33a]
450 lines
13 KiB
C++
450 lines
13 KiB
C++
/******************************************************************************
|
|
Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
*******************************************************************************/
|
|
|
|
#ifndef _SRC_XML_EXPR_H
|
|
#define _SRC_XML_EXPR_H
|
|
|
|
#include <exception>
|
|
#include <map>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <string.h>
|
|
#include <float.h>
|
|
|
|
namespace xml {
|
|
class exception_t : public std::exception {
|
|
public:
|
|
explicit exception_t(const std::string& msg) : str_(msg) {}
|
|
const char* what() const throw() { return str_.c_str(); }
|
|
|
|
protected:
|
|
const std::string str_;
|
|
};
|
|
|
|
class div_zero_exception_t : public exception_t {
|
|
public:
|
|
explicit div_zero_exception_t(const std::string& msg)
|
|
: exception_t("Divide by zero exception " + msg) {}
|
|
};
|
|
|
|
typedef double args_t;
|
|
static const args_t ARGS_MAX = DBL_MAX;
|
|
typedef std::map<std::string, args_t> args_map_t;
|
|
class Expr;
|
|
|
|
template <class T> class any_cache_t {
|
|
public:
|
|
virtual ~any_cache_t() {}
|
|
virtual bool Lookup(const std::string& name, T& result) const = 0;
|
|
};
|
|
|
|
typedef any_cache_t<std::string> expr_cache_t;
|
|
typedef any_cache_t<args_t> args_cache_t;
|
|
|
|
class bin_expr_t {
|
|
public:
|
|
static const bin_expr_t* CreateExpr(const bin_expr_t* arg1, const bin_expr_t* arg2,
|
|
const char op);
|
|
static const bin_expr_t* CreateArg(Expr* obj, const std::string str);
|
|
|
|
bin_expr_t() : arg1_(NULL), arg2_(NULL) {}
|
|
bin_expr_t(const bin_expr_t* arg1, const bin_expr_t* arg2) : arg1_(arg1), arg2_(arg2) {}
|
|
virtual ~bin_expr_t() {
|
|
if (arg1_) delete arg1_;
|
|
if (arg2_) delete arg2_;
|
|
}
|
|
|
|
virtual args_t Eval(const args_cache_t& args) const = 0;
|
|
virtual std::string Symbol() const = 0;
|
|
|
|
std::string String() const {
|
|
std::string str;
|
|
if (arg1_) {
|
|
str = "(" + arg1_->String() + " " + Symbol() + " " + arg2_->String() + ")";
|
|
} else
|
|
str = Symbol();
|
|
return str;
|
|
}
|
|
|
|
protected:
|
|
const bin_expr_t* arg1_;
|
|
const bin_expr_t* arg2_;
|
|
};
|
|
|
|
class Expr {
|
|
public:
|
|
explicit Expr(const std::string& expr, const expr_cache_t* cache)
|
|
: expr_(expr), pos_(0), sub_count_(0), cache_(cache), is_sub_expr_(false) {
|
|
sub_vec_ = new std::vector<const Expr*>;
|
|
var_vec_ = new std::vector<std::string>;
|
|
tree_ = ParseExpr();
|
|
}
|
|
|
|
explicit Expr(const std::string& expr, const Expr* obj)
|
|
: expr_(expr),
|
|
pos_(0),
|
|
sub_count_(0),
|
|
cache_(obj->cache_),
|
|
sub_vec_(obj->sub_vec_),
|
|
var_vec_(obj->var_vec_),
|
|
is_sub_expr_(true) {
|
|
sub_vec_->push_back(this);
|
|
tree_ = ParseExpr();
|
|
if (!SubCheck()) throw exception_t("expr '" + expr_ + "', bad parenthesis count");
|
|
}
|
|
|
|
~Expr() {
|
|
if (!is_sub_expr_) {
|
|
delete cache_;
|
|
for (auto it : *sub_vec_) delete it;
|
|
delete sub_vec_;
|
|
delete var_vec_;
|
|
delete tree_;
|
|
}
|
|
}
|
|
|
|
std::string GetStr() const { return expr_; }
|
|
const expr_cache_t* GetCache() const { return cache_; }
|
|
const bin_expr_t* GetTree() const { return tree_; }
|
|
|
|
args_t Eval(const args_cache_t& args) const {
|
|
args_t result = 0;
|
|
try {
|
|
result = tree_->Eval(args);
|
|
} catch (const div_zero_exception_t& e) {
|
|
if (div_zero_exc_on)
|
|
std::cout << "Expr::Eval() exc(" << e.what() << ") : " << String() << std::endl;
|
|
} catch (const exception_t& e) {
|
|
throw e;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
std::string Lookup(const std::string& str) const {
|
|
std::string result;
|
|
if (cache_ && !(cache_->Lookup(str, result)))
|
|
throw exception_t("expr '" + expr_ + "', lookup '" + str + "' failed");
|
|
return result;
|
|
}
|
|
|
|
void AddVar(const std::string& str) {
|
|
bool found = false;
|
|
for (std::string s : *var_vec_)
|
|
if (s == str) found = true;
|
|
if (!found) var_vec_->push_back(str);
|
|
}
|
|
|
|
const std::vector<std::string>& GetVars() const { return *var_vec_; }
|
|
|
|
std::string String() const { return tree_->String(); }
|
|
|
|
private:
|
|
const bin_expr_t* ParseExpr() {
|
|
const bin_expr_t* expr = ParseArg();
|
|
while (!IsEnd()) {
|
|
const char op = Symb();
|
|
const bin_expr_t* second_arg = NULL;
|
|
if (IsSymb(')')) {
|
|
Next();
|
|
SubClose();
|
|
break;
|
|
}
|
|
if (IsSymb('*') || IsSymb('/')) {
|
|
Next();
|
|
second_arg = ParseArg();
|
|
expr = bin_expr_t::CreateExpr(expr, second_arg, op);
|
|
} else if (IsSymb('+') || IsSymb('-')) {
|
|
Next();
|
|
second_arg = ParseExpr();
|
|
expr = bin_expr_t::CreateExpr(expr, second_arg, op);
|
|
break;
|
|
} else {
|
|
throw exception_t("expr '" + expr_ + "', bad operator '" + op + "'");
|
|
}
|
|
}
|
|
return expr;
|
|
}
|
|
|
|
const bin_expr_t* ParseArg() {
|
|
const bin_expr_t* arg = NULL;
|
|
if (IsSymb('(')) {
|
|
Next();
|
|
SubOpen();
|
|
arg = ParseExpr();
|
|
} else {
|
|
const unsigned pos = FindOp();
|
|
const std::string str = CutTill(pos);
|
|
arg = bin_expr_t::CreateArg(this, str);
|
|
if (arg == NULL) throw exception_t("expr '" + expr_ + "', bad argument '" + str + "'");
|
|
}
|
|
return arg;
|
|
}
|
|
|
|
char Symb() const { return Symb(pos_); }
|
|
char Symb(const unsigned ind) const { return expr_[ind]; }
|
|
bool IsEnd() const { return (pos_ >= expr_.length()); }
|
|
bool IsSymb(const char c) const { return IsSymb(pos_, c); }
|
|
bool IsSymb(const unsigned ind, const char c) const { return (expr_[ind] == c); }
|
|
void Next() { ++pos_; }
|
|
void SubOpen() { ++sub_count_; }
|
|
void SubClose() { --sub_count_; }
|
|
bool SubCheck() const { return (sub_count_ == 0); }
|
|
unsigned FindOp() const {
|
|
unsigned i = pos_;
|
|
unsigned open_n = 0;
|
|
while (i < expr_.length()) {
|
|
switch (Symb(i)) {
|
|
case '*':
|
|
case '/':
|
|
case '+':
|
|
case '-':
|
|
goto end;
|
|
case '(':
|
|
++open_n;
|
|
break;
|
|
case ')':
|
|
if (open_n != 0) i += 1;
|
|
goto end;
|
|
}
|
|
++i;
|
|
}
|
|
end:
|
|
return i;
|
|
}
|
|
std::string CutTill(const unsigned pos) {
|
|
const std::string str = (pos > pos_) ? expr_.substr(pos_, pos - pos_) : "";
|
|
pos_ = pos;
|
|
return str;
|
|
}
|
|
|
|
static const bool div_zero_exc_on = false;
|
|
|
|
const std::string expr_;
|
|
unsigned pos_;
|
|
unsigned sub_count_;
|
|
const bin_expr_t* tree_;
|
|
const expr_cache_t* const cache_;
|
|
std::vector<const Expr*>* sub_vec_;
|
|
std::vector<std::string>* var_vec_;
|
|
const bool is_sub_expr_;
|
|
};
|
|
|
|
class add_expr_t : public bin_expr_t {
|
|
public:
|
|
add_expr_t(const bin_expr_t* arg1, const bin_expr_t* arg2) : bin_expr_t(arg1, arg2) {}
|
|
args_t Eval(const args_cache_t& args) const { return (arg1_->Eval(args) + arg2_->Eval(args)); }
|
|
std::string Symbol() const { return "+"; }
|
|
};
|
|
class sub_expr_t : public bin_expr_t {
|
|
public:
|
|
sub_expr_t(const bin_expr_t* arg1, const bin_expr_t* arg2) : bin_expr_t(arg1, arg2) {}
|
|
args_t Eval(const args_cache_t& args) const { return (arg1_->Eval(args) - arg2_->Eval(args)); }
|
|
std::string Symbol() const { return "-"; }
|
|
};
|
|
class mul_expr_t : public bin_expr_t {
|
|
public:
|
|
mul_expr_t(const bin_expr_t* arg1, const bin_expr_t* arg2) : bin_expr_t(arg1, arg2) {}
|
|
args_t Eval(const args_cache_t& args) const { return (arg1_->Eval(args) * arg2_->Eval(args)); }
|
|
std::string Symbol() const { return "*"; }
|
|
};
|
|
class div_expr_t : public bin_expr_t {
|
|
public:
|
|
div_expr_t(const bin_expr_t* arg1, const bin_expr_t* arg2) : bin_expr_t(arg1, arg2) {}
|
|
args_t Eval(const args_cache_t& args) const {
|
|
const args_t denominator = arg2_->Eval(args);
|
|
if (denominator == 0) throw div_zero_exception_t("div_expr_t::Eval()");
|
|
return (arg1_->Eval(args) / denominator);
|
|
}
|
|
std::string Symbol() const { return "/"; }
|
|
};
|
|
class const_expr_t : public bin_expr_t {
|
|
public:
|
|
const_expr_t(const args_t value) : value_(value) {}
|
|
args_t Eval(const args_cache_t&) const { return value_; }
|
|
std::string Symbol() const {
|
|
std::ostringstream os;
|
|
os << value_;
|
|
return os.str();
|
|
}
|
|
|
|
private:
|
|
const args_t value_;
|
|
};
|
|
class var_expr_t : public bin_expr_t {
|
|
public:
|
|
var_expr_t(const std::string name) : name_(name) {}
|
|
args_t Eval(const args_cache_t& args) const {
|
|
args_t result = 0;
|
|
if (!args.Lookup(name_, result)) throw exception_t("expr arg lookup '" + name_ + "' failed");
|
|
return result;
|
|
}
|
|
std::string Symbol() const { return name_; }
|
|
|
|
private:
|
|
const std::string name_;
|
|
};
|
|
|
|
class fun_expr_t : public bin_expr_t {
|
|
public:
|
|
typedef std::vector<var_expr_t> vvect_t;
|
|
fun_expr_t(const std::string& fname, const std::string& vname, const uint32_t& vnum)
|
|
: fname_(fname) {
|
|
for (uint32_t i = 0; i < vnum; ++i) {
|
|
std::ostringstream var_full_name;
|
|
var_full_name << vname << "[" << i << "]";
|
|
vvect.push_back(var_expr_t(var_full_name.str()));
|
|
}
|
|
}
|
|
const vvect_t& GetVars() const { return vvect; }
|
|
std::string Symbol() const {
|
|
const std::string var = vvect[0].Symbol();
|
|
const std::string vname = var.substr(0, var.length() - 3);
|
|
std::ostringstream oss;
|
|
std::string str("(");
|
|
str.back() = ')';
|
|
oss << fname_ << "(" << vname << "," << vvect.size() << ")";
|
|
return oss.str();
|
|
}
|
|
|
|
private:
|
|
const std::string fname_;
|
|
vvect_t vvect;
|
|
};
|
|
class sum_expr_t : public fun_expr_t {
|
|
public:
|
|
sum_expr_t(const std::string& vname, const uint32_t& vnum) : fun_expr_t("sum", vname, vnum) {}
|
|
args_t Eval(const args_cache_t& args) const {
|
|
args_t result = 0;
|
|
for (const auto& var : GetVars()) result += var.Eval(args);
|
|
return result;
|
|
}
|
|
};
|
|
class avr_expr_t : public fun_expr_t {
|
|
public:
|
|
avr_expr_t(const std::string& vname, const uint32_t& vnum) : fun_expr_t("avr", vname, vnum) {}
|
|
args_t Eval(const args_cache_t& args) const {
|
|
args_t result = 0;
|
|
for (const auto& var : GetVars()) result += var.Eval(args);
|
|
return result / GetVars().size();
|
|
}
|
|
};
|
|
class min_expr_t : public fun_expr_t {
|
|
public:
|
|
min_expr_t(const std::string& vname, const uint32_t& vnum) : fun_expr_t("min", vname, vnum) {}
|
|
args_t Eval(const args_cache_t& args) const {
|
|
args_t result = ARGS_MAX;
|
|
for (const auto& var : GetVars()) {
|
|
args_t val = var.Eval(args);
|
|
result = (val < result) ? val : result;
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
class max_expr_t : public fun_expr_t {
|
|
public:
|
|
max_expr_t(const std::string& vname, const uint32_t& vnum) : fun_expr_t("max", vname, vnum) {}
|
|
args_t Eval(const args_cache_t& args) const {
|
|
args_t result = 0;
|
|
for (const auto& var : GetVars()) {
|
|
args_t val = var.Eval(args);
|
|
result = (val > result) ? val : result;
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
inline const bin_expr_t* bin_expr_t::CreateExpr(const bin_expr_t* arg1, const bin_expr_t* arg2,
|
|
const char op) {
|
|
const bin_expr_t* expr = NULL;
|
|
switch (op) {
|
|
case '+':
|
|
expr = new add_expr_t(arg1, arg2);
|
|
break;
|
|
case '-':
|
|
expr = new sub_expr_t(arg1, arg2);
|
|
break;
|
|
case '*':
|
|
expr = new mul_expr_t(arg1, arg2);
|
|
break;
|
|
case '/':
|
|
expr = new div_expr_t(arg1, arg2);
|
|
break;
|
|
}
|
|
return expr;
|
|
}
|
|
|
|
inline const bin_expr_t* bin_expr_t::CreateArg(Expr* obj, const std::string str) {
|
|
const bin_expr_t* arg = NULL;
|
|
|
|
const unsigned i = strspn(str.c_str(), "1234567890");
|
|
if (i == str.length()) {
|
|
const unsigned value = atoi(str.c_str());
|
|
arg = new const_expr_t(value);
|
|
}
|
|
|
|
if (arg == NULL) {
|
|
const std::size_t pos = str.find('(');
|
|
if (pos != std::string::npos) {
|
|
char* fname = NULL;
|
|
char* vname = NULL;
|
|
int vnum = 0;
|
|
int ret = sscanf(str.c_str(), "%m[a-zA-Z_](%m[0-9a-zA-Z_],%d)", &fname, &vname, &vnum);
|
|
if (ret == 3) {
|
|
const std::string fun_name(fname);
|
|
const fun_expr_t* farg = NULL;
|
|
if (fun_name == "sum") {
|
|
farg = new sum_expr_t(vname, vnum);
|
|
} else if (fun_name == "avr") {
|
|
farg = new avr_expr_t(vname, vnum);
|
|
} else if (fun_name == "min") {
|
|
farg = new min_expr_t(vname, vnum);
|
|
} else if (fun_name == "max") {
|
|
farg = new max_expr_t(vname, vnum);
|
|
}
|
|
if (farg)
|
|
for (const auto& var : farg->GetVars()) obj->AddVar(var.Symbol());
|
|
arg = farg;
|
|
}
|
|
free(fname);
|
|
free(vname);
|
|
}
|
|
}
|
|
|
|
if (arg == NULL) {
|
|
const std::string sub_expr = obj->Lookup(str);
|
|
if (sub_expr.empty()) {
|
|
arg = new var_expr_t(str);
|
|
obj->AddVar(str);
|
|
} else {
|
|
const Expr* expr = new Expr(sub_expr, obj);
|
|
arg = expr->GetTree();
|
|
}
|
|
}
|
|
|
|
return arg;
|
|
}
|
|
|
|
} // namespace xml
|
|
|
|
#endif // _SRC_XML_EXPR_H
|