1 #ifndef ERROR_HANDLER_MA_DOMAIN_OPS_H
2 #define ERROR_HANDLER_MA_DOMAIN_OPS_H
4 #include "ErrorHandler/MessageAnalyzer/ma_types.h"
7 namespace errorhandler {
13 inline int and_op(
int i,
int j);
17 inline ma_cond_domain&
18 domain_intersect(ma_cond_domain& d1, ma_cond_domain
const& d2);
22 domain_intersect_copy(ma_cond_domain d1, ma_cond_domain
const& d2);
26 inline ma_cond_domain&
27 domain_intersect(ma_cond_domains& d);
31 domain_intersect_copy(ma_cond_domains d);
35 domain_intersect(ma_domain& d1, ma_domain
const& d2);
39 domain_intersect_copy(ma_domain d1, ma_domain
const& d2);
48 domain_intersect(ma_domains& d);
52 domain_intersect_copy(ma_domains d);
58 inline bool contains_op(
int a,
int b);
61 enum domain_compare_result_t
69 inline domain_compare_result_t
70 domain_compare(ma_cond_domain
const& d1, ma_cond_domain
const& d2);
73 inline ma_cond_domains&
74 domain_union(ma_cond_domains& ds, ma_cond_domain
const& new_d);
81 domain_union(ma_domains& ds);
85 domain_is_null(ma_cond_domain
const& d);
88 domain_is_null(ma_domain
const& d);
91 domain_union_construct(ma_domains& ds, ma_domain& d, std::vector<ma_cond_domains>& mid,
int depth,
int max);
95 ma_cond_domain_ctor_null();
99 ma_cond_domain_ctor_any();
102 inline ma_cond_domain
103 ma_cond_domain_ctor(
int s,
int t);
107 inline ma_cond_domain
108 ma_cond_domain_ctor(
int i, arg_t t);
112 ma_domain_ctor_null();
116 ma_domain_ctor_null(
size_t size);
120 ma_domain_ctor_any(
size_t size);
124 ma_domain_ctor(
size_t size, ma_cond_domain d);
132 novadaq::errorhandler::ma_cond_domain
133 novadaq::errorhandler::ma_cond_domain_ctor_null()
135 return ma_cond_domain_ctor(D_NIL, D_NIL);
138 novadaq::errorhandler::ma_cond_domain
139 novadaq::errorhandler::ma_cond_domain_ctor_any()
141 return ma_cond_domain_ctor(D_ANY, D_ANY);
144 novadaq::errorhandler::ma_cond_domain
145 novadaq::errorhandler::ma_cond_domain_ctor(
int s,
int t)
147 return ma_cond_domain(s, t);
150 novadaq::errorhandler::ma_cond_domain
151 novadaq::errorhandler::ma_cond_domain_ctor(
int i, arg_t t)
153 return (t == SOURCE) ? ma_cond_domain(i, D_ANY) : ma_cond_domain(D_ANY, i);
156 novadaq::errorhandler::ma_domain
157 novadaq::errorhandler::ma_domain_ctor_null()
159 return ma_domain(1, ma_cond_domain_ctor_null());
162 novadaq::errorhandler::ma_domain
163 novadaq::errorhandler::ma_domain_ctor_null(
size_t size)
165 return ma_domain(size, ma_cond_domain_ctor_null());
168 novadaq::errorhandler::ma_domain
169 novadaq::errorhandler::ma_domain_ctor_any(
size_t size)
171 return ma_domain(size, ma_cond_domain_ctor_any());
174 novadaq::errorhandler::ma_domain
175 novadaq::errorhandler::ma_domain_ctor(
size_t size, ma_cond_domain d)
177 return ma_domain(size, d);
183 int novadaq::errorhandler::and_op(
int i,
int j)
185 if (i == D_NIL || j == D_NIL)
return D_NIL;
187 if (i == j)
return i;
188 if (i == D_ANY)
return j;
189 if (j == D_ANY)
return i;
194 novadaq::errorhandler::ma_cond_domain&
195 novadaq::errorhandler::domain_intersect(ma_cond_domain& d1, ma_cond_domain
const& d2)
197 d1.first = and_op(d1.first, d2.first);
198 d1.second = and_op(d1.second, d2.second);
200 if (domain_is_null(d1))
201 d1 = ma_cond_domain_ctor_null();
206 novadaq::errorhandler::ma_cond_domain
207 novadaq::errorhandler::domain_intersect_copy(ma_cond_domain d1, ma_cond_domain
const& d2)
209 return domain_intersect(d1, d2);
212 novadaq::errorhandler::ma_cond_domain&
213 novadaq::errorhandler::domain_intersect(ma_cond_domains& ds)
217 ds.push_back(ma_cond_domain_ctor_null());
221 ma_cond_domains::const_iterator it = ds.begin();
222 while (++it != ds.end() && !domain_is_null(ds.front()))
223 domain_intersect(ds.front(), *it);
228 novadaq::errorhandler::ma_cond_domain
229 novadaq::errorhandler::domain_intersect_copy(ma_cond_domains d)
231 return domain_intersect(d);
234 novadaq::errorhandler::ma_domain&
235 novadaq::errorhandler::domain_intersect(ma_domain& d1, ma_domain
const& d2)
237 if (domain_is_null(d1) || domain_is_null(d2))
239 d1 = ma_domain_ctor_null();
243 if (d1.size() != d2.size())
244 throw std::runtime_error(
"domain size incomparable while doing domain_intersect");
246 for (
size_t i = 0; i < d1.size(); ++i)
248 domain_intersect(d1[i], d2[i]);
250 if (domain_is_null(d1[i]))
252 d1 = ma_domain_ctor_null();
260 novadaq::errorhandler::ma_domain
261 novadaq::errorhandler::domain_intersect_copy(ma_domain d1, ma_domain
const& d2)
263 return domain_intersect(d1, d2);
266 novadaq::errorhandler::ma_domain&
267 novadaq::errorhandler::domain_intersect(ma_domains& ds)
271 ds.push_back(ma_domain_ctor_null());
275 ma_domains::const_iterator it = ds.begin();
276 while (++it != ds.end())
278 for (
size_t i = 0; i < ds.front().size(); ++i)
280 domain_intersect(ds.front()[i], (*it)[i]);
282 if (domain_is_null(ds.front()[i]))
284 ds.front() = ma_domain_ctor_null();
295 novadaq::errorhandler::ma_domain
296 novadaq::errorhandler::domain_intersect_copy(ma_domains ds)
298 return domain_intersect(ds);
304 bool novadaq::errorhandler::contains_op(
int a,
int b)
306 return (a == b) ? (
true) : ((a == D_ANY || b == D_NIL) ?
true :
false);
309 bool novadaq::errorhandler::domain_is_null(ma_cond_domain
const& d)
311 return (d.first == D_NIL || d.second == D_NIL) ?
true :
false;
314 bool novadaq::errorhandler::domain_is_null(ma_domain
const& d)
316 if (d.empty())
return true;
318 for (
size_t i = 0; i < d.size(); ++i)
319 if (domain_is_null(d[i]))
return true;
324 novadaq::errorhandler::domain_compare_result_t
325 novadaq::errorhandler::domain_compare(ma_cond_domain
const& d1, ma_cond_domain
const& d2)
327 if (d1.first == d2.first && d1.second == d2.second)
333 if (contains_op(d1.first, d2.first)) flag1 =
true;
334 if (contains_op(d1.second, d2.second)) flag2 =
true;
345 novadaq::errorhandler::ma_cond_domains&
346 novadaq::errorhandler::domain_union(ma_cond_domains& ds, ma_cond_domain
const& new_d)
348 if (domain_is_null(new_d))
return ds;
350 ma_cond_domains::iterator it = ds.begin();
351 while (it != ds.end())
353 domain_compare_result_t r = domain_compare(*it, new_d);
355 if (r == EQUAL || r == L_CONTAINS)
361 return domain_union(ds, new_d);
372 void novadaq::errorhandler::domain_union_construct(ma_domains& ds, ma_domain& d, std::vector<ma_cond_domains>& mid,
int depth,
int max)
374 ma_cond_domains::const_iterator it = mid[depth].begin();
376 while (it != mid[depth].end())
381 domain_union_construct(ds, d, mid, depth + 1, max);
389 novadaq::errorhandler::ma_domains&
390 novadaq::errorhandler::domain_union(ma_domains& ds)
392 if (ds.empty())
return ds;
395 size_t size = ds.front().size();
398 std::vector<ma_cond_domains> mid(size);
400 ma_domains::const_iterator it = ds.begin();
401 while (it != ds.end())
403 for (
size_t i = 0; i < size; ++i)
404 domain_union(mid[i], (*it)[i]);
410 ma_domain domain(size);
412 domain_union_construct(result, domain, mid, 0, size - 1);