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 { NO_COMMON
66 inline domain_compare_result_t
67 domain_compare( ma_cond_domain
const & d1
68 , ma_cond_domain
const & d2 );
71 inline ma_cond_domains &
72 domain_union( ma_cond_domains & ds, ma_cond_domain
const & new_d );
79 domain_union( ma_domains & ds );
83 domain_is_null( ma_cond_domain
const & d );
86 domain_is_null( ma_domain
const & d );
89 domain_union_construct ( ma_domains & ds
91 , std::vector<ma_cond_domains> & mid
97 ma_cond_domain_ctor_null ( );
100 inline ma_cond_domain
101 ma_cond_domain_ctor_any ( );
104 inline ma_cond_domain
105 ma_cond_domain_ctor (
int s,
int t );
109 inline ma_cond_domain
110 ma_cond_domain_ctor (
int i, arg_t t );
114 ma_domain_ctor_null ( );
118 ma_domain_ctor_null (
size_t size );
122 ma_domain_ctor_any (
size_t size );
126 ma_domain_ctor(
size_t size, ma_cond_domain d );
135 novadaq::errorhandler::ma_cond_domain
136 novadaq::errorhandler::ma_cond_domain_ctor_null ( )
138 return ma_cond_domain_ctor(D_NIL, D_NIL);
141 novadaq::errorhandler::ma_cond_domain
142 novadaq::errorhandler::ma_cond_domain_ctor_any ( )
144 return ma_cond_domain_ctor(D_ANY, D_ANY);
147 novadaq::errorhandler::ma_cond_domain
148 novadaq::errorhandler::ma_cond_domain_ctor (
int s,
int t )
150 return ma_cond_domain(s, t);
153 novadaq::errorhandler::ma_cond_domain
154 novadaq::errorhandler::ma_cond_domain_ctor (
int i, arg_t t )
156 return (t==SOURCE) ? ma_cond_domain(i, D_ANY) : ma_cond_domain(D_ANY, i);
159 novadaq::errorhandler::ma_domain
160 novadaq::errorhandler::ma_domain_ctor_null ( )
162 return ma_domain(1, ma_cond_domain_ctor_null());
165 novadaq::errorhandler::ma_domain
166 novadaq::errorhandler::ma_domain_ctor_null (
size_t size )
168 return ma_domain(size, ma_cond_domain_ctor_null());
171 novadaq::errorhandler::ma_domain
172 novadaq::errorhandler::ma_domain_ctor_any (
size_t size )
174 return ma_domain(size, ma_cond_domain_ctor_any());
177 novadaq::errorhandler::ma_domain
178 novadaq::errorhandler::ma_domain_ctor (
size_t size, ma_cond_domain d )
180 return ma_domain(size, d);
188 novadaq::errorhandler::and_op(
int i,
int j )
190 if (i==D_NIL || j==D_NIL)
return D_NIL;
193 if (i==D_ANY)
return j;
194 if (j==D_ANY)
return i;
199 novadaq::errorhandler::ma_cond_domain &
200 novadaq::errorhandler::domain_intersect( ma_cond_domain & d1
201 , ma_cond_domain
const & d2 )
203 d1.first = and_op(d1.first, d2.first);
204 d1.second = and_op(d1.second, d2.second);
206 if (domain_is_null(d1))
207 d1 = ma_cond_domain_ctor_null();
212 novadaq::errorhandler::ma_cond_domain
213 novadaq::errorhandler::domain_intersect_copy( ma_cond_domain d1
214 , ma_cond_domain
const & d2)
216 return domain_intersect(d1, d2);
219 novadaq::errorhandler::ma_cond_domain &
220 novadaq::errorhandler::domain_intersect( ma_cond_domains & ds )
224 ds.push_back(ma_cond_domain_ctor_null());
228 ma_cond_domains::const_iterator it = ds.begin();
229 while(++it!=ds.end() && !domain_is_null(ds.front()))
230 domain_intersect(ds.front(), *it);
235 novadaq::errorhandler::ma_cond_domain
236 novadaq::errorhandler::domain_intersect_copy( ma_cond_domains d )
238 return domain_intersect(d);
241 novadaq::errorhandler::ma_domain &
242 novadaq::errorhandler::domain_intersect( ma_domain & d1
243 , ma_domain
const & d2 )
245 if (domain_is_null(d1) || domain_is_null(d2))
247 d1 = ma_domain_ctor_null();
251 if (d1.size() != d2.size())
252 throw std::runtime_error(
"domain size incomparable while doing domain_intersect");
254 for(
size_t i=0; i<d1.size(); ++i)
256 domain_intersect(d1[i], d2[i]);
258 if (domain_is_null(d1[i]))
260 d1 = ma_domain_ctor_null();
268 novadaq::errorhandler::ma_domain
269 novadaq::errorhandler::domain_intersect_copy( ma_domain d1
270 , ma_domain
const & d2 )
272 return domain_intersect(d1, d2);
275 novadaq::errorhandler::ma_domain &
276 novadaq::errorhandler::domain_intersect( ma_domains & ds )
280 ds.push_back(ma_domain_ctor_null());
284 ma_domains::const_iterator it = ds.begin();
285 while(++it!=ds.end())
287 for(
size_t i=0; i<ds.front().size(); ++i)
289 domain_intersect(ds.front()[i], (*it)[i]);
291 if (domain_is_null(ds.front()[i]))
293 ds.front() = ma_domain_ctor_null();
304 novadaq::errorhandler::ma_domain
305 novadaq::errorhandler::domain_intersect_copy( ma_domains ds )
307 return domain_intersect(ds);
315 novadaq::errorhandler::contains_op(
int a,
int b )
317 return (a==b) ? (
true) : ( (a==D_ANY || b==D_NIL) ?
true : false );
321 novadaq::errorhandler::domain_is_null( ma_cond_domain
const & d )
323 return (d.first==D_NIL || d.second==D_NIL) ?
true :
false;
327 novadaq::errorhandler::domain_is_null( ma_domain
const & d )
329 if (d.empty())
return true;
331 for (
size_t i=0; i<d.size(); ++i)
332 if (domain_is_null(d[i]))
return true;
337 novadaq::errorhandler::domain_compare_result_t
338 novadaq::errorhandler::domain_compare( ma_cond_domain
const & d1
339 , ma_cond_domain
const & d2 )
341 if (d1.first==d2.first && d1.second==d2.second)
347 if (contains_op(d1.first, d2.first)) flag1 =
true;
348 if (contains_op(d1.second, d2.second)) flag2 =
true;
359 novadaq::errorhandler::ma_cond_domains &
360 novadaq::errorhandler::domain_union( ma_cond_domains & ds
361 , ma_cond_domain
const & new_d )
363 if (domain_is_null(new_d))
return ds;
365 ma_cond_domains::iterator it = ds.begin();
368 domain_compare_result_t r = domain_compare(*it, new_d);
370 if (r == EQUAL || r == L_CONTAINS)
376 return domain_union(ds, new_d);
388 novadaq::errorhandler::domain_union_construct
391 , std::vector<ma_cond_domains> & mid
395 ma_cond_domains::const_iterator it = mid[depth].begin();
397 while(it!=mid[depth].end())
402 domain_union_construct(ds, d, mid, depth+1, max);
411 novadaq::errorhandler::ma_domains &
412 novadaq::errorhandler::domain_union( ma_domains & ds )
414 if (ds.empty())
return ds;
417 size_t size = ds.front().size();
420 std::vector<ma_cond_domains> mid(size);
422 ma_domains::const_iterator it = ds.begin();
425 for(
size_t i=0; i<size; ++i)
426 domain_union(mid[i], (*it)[i]);
432 ma_domain domain(size);
434 domain_union_construct(result, domain, mid, 0, size-1);