2 #include "ErrorHandler/MessageAnalyzer/ma_domain_ops.h"
3 #include "ErrorHandler/MessageAnalyzer/ma_domain_cond.h"
4 #include "ErrorHandler/MessageAnalyzer/ma_domain_expr.h"
5 #include "ErrorHandler/MessageAnalyzer/ma_rule.h"
8 using namespace novadaq::errorhandler;
10 ma_domain_cond::ma_domain_cond( )
26 void ma_domain_cond::evaluate(ma_domains & domains)
const
33 if (cond_type == EXPR)
35 if (expr.get() == NULL)
36 throw std::runtime_error(
"expr not exist");
38 expr->evaluate(worksheet);
43 else if (!str_cond.empty())
47 throw std::runtime_error(
"cond_arg_list cannot be empty");
50 ma_domain domain = ma_domain_ctor_any(cond_size);
56 cond_arg_list_t::const_iterator it = conds.begin();
57 while(it!=conds.end())
60 size_t c_idx = it->first.second;
61 arg_t c_arg = it->second;
63 int idx = c_ptr->find_arg(str_cond, c_arg);
65 if (idx==D_NIL) { keep =
false;
break; }
66 else domain[c_idx] = ma_cond_domain_ctor(idx, c_arg);
72 if (keep) worksheet.push_back(domain);
81 throw std::runtime_error(
"no cond in cond list of ma_domain_cond");
85 int c1_idx = conds.front().first.second;
86 arg_t c1_arg_type = conds.front().second;
89 idx_t
const & c1_args = c1_ptr->get_args(c1_arg_type);
92 idx_t::const_iterator it = c1_args.begin();
93 for ( ; it!=c1_args.end(); ++it)
96 ma_domain domain = ma_domain_ctor_any(cond_size);
102 std::string
const & c1_arg_str = it->first;
103 size_t c1_arg_idx = it->second;
106 domain_intersect( domain[c1_idx]
107 , ma_cond_domain_ctor(c1_arg_idx, c1_arg_type) );
110 cond_arg_list_t::const_iterator cond_it = conds.begin();
112 while( ++cond_it!=conds.end() )
116 size_t c_idx = cond_it->first.second;
117 arg_t c_arg_type = cond_it->second;
120 int c_arg_idx = c_ptr->find_arg(c1_arg_str, c_arg_type);
123 if (c_arg_idx == D_NIL)
130 domain_intersect( domain[c_idx]
131 , 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);
154 ma_domain_cond::and_merge( ma_domains & domains
155 , ma_domains & worksheet )
const
159 domains.splice(domains.end(), worksheet);
164 if (worksheet.empty())
172 size_t nw = worksheet.size();
173 ma_domains::iterator dit = domains.begin();
174 for ( ; dit!=domains.end(); ++dit)
175 domains.insert(dit, nw-1, *dit);
178 dit = domains.begin();
179 ma_domains::iterator wit = worksheet.begin();
180 for ( ; dit!=domains.end(); ++dit,++wit)
182 if ( wit==worksheet.end() ) wit = worksheet.begin();
184 domain_intersect(*dit, *wit);
188 domains.remove(ma_domain_ctor_null());