2 #include "ErrorHandler/MessageAnalyzer/ma_domain_cond.h"
3 #include "ErrorHandler/MessageAnalyzer/ma_domain_expr.h"
4 #include "ErrorHandler/MessageAnalyzer/ma_domain_ops.h"
5 #include "ErrorHandler/MessageAnalyzer/ma_rule.h"
7 using namespace novadaq::errorhandler;
9 ma_domain_cond::ma_domain_cond()
24 void ma_domain_cond::evaluate(ma_domains& domains)
const
30 if (cond_type == EXPR)
32 if (expr.get() == NULL)
33 throw std::runtime_error(
"expr not exist");
35 expr->evaluate(worksheet);
40 else if (!str_cond.empty())
44 throw std::runtime_error(
"cond_arg_list cannot be empty");
47 ma_domain domain = ma_domain_ctor_any(cond_size);
53 cond_arg_list_t::const_iterator it = conds.begin();
54 while (it != conds.end())
57 size_t c_idx = it->first.second;
58 arg_t c_arg = it->second;
60 int idx = c_ptr->find_arg(str_cond, c_arg);
68 domain[c_idx] = ma_cond_domain_ctor(idx, c_arg);
74 if (keep) worksheet.push_back(domain);
83 throw std::runtime_error(
"no cond in cond list of ma_domain_cond");
87 int c1_idx = conds.front().first.second;
88 arg_t c1_arg_type = conds.front().second;
91 idx_t
const& c1_args = c1_ptr->get_args(c1_arg_type);
94 idx_t::const_iterator it = c1_args.begin();
95 for (; it != c1_args.end(); ++it)
98 ma_domain domain = ma_domain_ctor_any(cond_size);
104 std::string
const& c1_arg_str = it->first;
105 size_t c1_arg_idx = it->second;
108 domain_intersect(domain[c1_idx], ma_cond_domain_ctor(c1_arg_idx, c1_arg_type));
111 cond_arg_list_t::const_iterator cond_it = conds.begin();
113 while (++cond_it != conds.end())
117 size_t c_idx = cond_it->first.second;
118 arg_t c_arg_type = cond_it->second;
121 int c_arg_idx = c_ptr->find_arg(c1_arg_str, c_arg_type);
124 if (c_arg_idx == D_NIL)
131 domain_intersect(domain[c_idx], ma_cond_domain_ctor(c_arg_idx, c_arg_type));
134 if (domain_is_null(domain[c_idx]))
142 if (keep) worksheet.push_back(domain);
149 and_merge(domains, worksheet);
153 ma_domain_cond::and_merge(ma_domains& domains, ma_domains& worksheet)
const
157 domains.splice(domains.end(), worksheet);
162 if (worksheet.empty())
170 size_t nw = worksheet.size();
171 ma_domains::iterator dit = domains.begin();
172 for (; dit != domains.end(); ++dit)
173 domains.insert(dit, nw - 1, *dit);
176 dit = domains.begin();
177 ma_domains::iterator wit = worksheet.begin();
178 for (; dit != domains.end(); ++dit, ++wit)
180 if (wit == worksheet.end()) wit = worksheet.begin();
182 domain_intersect(*dit, *wit);
186 domains.remove(ma_domain_ctor_null());