1 /*-----------------------------------------------------------------------------+
2 Copyright (c) 2008-2009: Joachim Faulhaber
3 +------------------------------------------------------------------------------+
4 Distributed under the Boost Software License, Version 1.0.
5 (See accompanying file LICENCE.txt or copy at
6 http://www.boost.org/LICENSE_1_0.txt)
7 +-----------------------------------------------------------------------------*/
8 #ifndef LIBS_ICL_TEST_TEST_INTERVAL_SET_MIXED_HPP_JOFA_090702
9 #define LIBS_ICL_TEST_TEST_INTERVAL_SET_MIXED_HPP_JOFA_090702
12 void interval_set_mixed_ctor_4_ordered_types()
14 typedef interval_set<T> IntervalSetT;
15 typedef typename IntervalSetT::interval_type IntervalT;
17 T v0 = boost::icl::identity_element<T>::value();
19 split_interval_set<T> split_set(v0);
20 separate_interval_set<T> sep_set(split_set);
21 interval_set<T> join_set(sep_set);
23 BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(sep_set).lower() );
24 BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(join_set).lower() );
28 void interval_set_mixed_equal_4_ordered_types()
30 typedef interval_set<T> IntervalSetT;
31 typedef typename IntervalSetT::interval_type IntervalT;
33 T v0 = boost::icl::identity_element<T>::value();
35 split_interval_set<T> split_empty, split_single(v0);
36 separate_interval_set<T> sep_empty, sep_single(v0);
37 interval_set<T> join_empty, join_single(v0);
39 // mixed ==-equality is a strange thing. Most times is does not
40 // make sense. It is better to allow only for same type == equality.
41 BOOST_CHECK_EQUAL( split_empty == split_empty, true );
42 BOOST_CHECK_EQUAL( sep_empty == sep_empty, true );
43 BOOST_CHECK_EQUAL( join_empty == join_empty, true );
45 // There were Problems with operator== and emtpy sets.
46 BOOST_CHECK_EQUAL( split_empty == split_single, false );
47 BOOST_CHECK_EQUAL( sep_empty == sep_single, false );
48 BOOST_CHECK_EQUAL( join_empty == join_single, false );
50 BOOST_CHECK_EQUAL( split_single == split_empty, false );
51 BOOST_CHECK_EQUAL( sep_single == sep_empty, false );
52 BOOST_CHECK_EQUAL( join_single == join_empty, false );
54 BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_empty), true );
55 BOOST_CHECK_EQUAL( is_element_equal(split_empty, sep_empty), true );
56 BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_empty), true );
58 BOOST_CHECK_EQUAL( is_element_equal(sep_empty, split_empty), true );
59 BOOST_CHECK_EQUAL( is_element_equal(sep_empty, sep_empty), true );
60 BOOST_CHECK_EQUAL( is_element_equal(sep_empty, join_empty), true );
62 BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_empty), true );
63 BOOST_CHECK_EQUAL( is_element_equal(join_empty, sep_empty), true );
64 BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_empty), true );
66 //--------------------------------------------------------------------------
67 BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_single), false );
68 BOOST_CHECK_EQUAL( is_element_equal(split_empty, sep_single), false );
69 BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_single), false );
71 BOOST_CHECK_EQUAL( is_element_equal(sep_empty, split_single), false );
72 BOOST_CHECK_EQUAL( is_element_equal(sep_empty, sep_single), false );
73 BOOST_CHECK_EQUAL( is_element_equal(sep_empty, join_single), false );
75 BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_single), false );
76 BOOST_CHECK_EQUAL( is_element_equal(join_empty, sep_single), false );
77 BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_single), false );
79 //--------------------------------------------------------------------------
80 BOOST_CHECK_EQUAL( is_element_equal(split_single, split_empty), false );
81 BOOST_CHECK_EQUAL( is_element_equal(split_single, sep_empty), false );
82 BOOST_CHECK_EQUAL( is_element_equal(split_single, join_empty), false );
84 BOOST_CHECK_EQUAL( is_element_equal(sep_single, split_empty), false );
85 BOOST_CHECK_EQUAL( is_element_equal(sep_single, sep_empty), false );
86 BOOST_CHECK_EQUAL( is_element_equal(sep_single, join_empty), false );
88 BOOST_CHECK_EQUAL( is_element_equal(join_single, split_empty), false );
89 BOOST_CHECK_EQUAL( is_element_equal(join_single, sep_empty), false );
90 BOOST_CHECK_EQUAL( is_element_equal(join_single, join_empty), false );
95 void interval_set_mixed_assign_4_ordered_types()
97 typedef interval_set<T> IntervalSetT;
98 typedef typename IntervalSetT::interval_type IntervalT;
100 T v0 = boost::icl::identity_element<T>::value();
101 T v1 = unit_element<T>::value();
103 split_interval_set<T> split_set;
104 separate_interval_set<T> sep_set;
105 interval_set<T> join_set;
110 BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(sep_set).lower() );
111 BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(join_set).lower() );
113 split_interval_set<T> split_self = split_interval_set<T>().add(v0);
114 separate_interval_set<T> sep_self = separate_interval_set<T>().add(v0).add(v1);
115 interval_set<T> join_self = interval_set<T>().add(v1);
117 split_self = split_self;
119 join_self = join_self;
121 BOOST_CHECK_EQUAL( split_self, split_self );
122 BOOST_CHECK_EQUAL( sep_self, sep_self );
123 BOOST_CHECK_EQUAL( join_self, join_self );
127 void interval_set_mixed_ctor_4_bicremental_types()
129 typedef interval_set<T> IntervalSetT;
130 typedef typename IntervalSetT::interval_type IntervalT;
138 IntervalT I1_3D = IntervalT::right_open(v1,v3);
139 IntervalT I2_4D = IntervalT::right_open(v2,v4);
140 IntervalT I4_5D = IntervalT::right_open(v4,v5);
142 split_interval_set<T> split_set;
143 split_set.add(I1_3D).add(I2_4D).add(I4_5D);
144 BOOST_CHECK_EQUAL( split_set.iterative_size(), 4 );
145 separate_interval_set<T> sep_set(split_set);
146 BOOST_CHECK_EQUAL( sep_set.iterative_size(), 4 );
147 interval_set<T> join_set(split_set);
148 BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
150 separate_interval_set<T> sep_set2;
151 sep_set2.add(I1_3D).add(I2_4D).add(I4_5D);
152 BOOST_CHECK_EQUAL( sep_set2.iterative_size(), 2 );
153 split_interval_set<T> split_set2(sep_set2);
154 BOOST_CHECK_EQUAL( split_set2.iterative_size(), 2 );
155 interval_set<T> join_set2(sep_set2);
156 BOOST_CHECK_EQUAL( join_set2.iterative_size(), 1 );
160 void interval_set_mixed_assign_4_bicremental_types()
162 typedef interval_set<T> IntervalSetT;
163 typedef typename IntervalSetT::interval_type IntervalT;
171 IntervalT I1_3D = IntervalT::right_open(v1,v3);
172 IntervalT I2_4D = IntervalT::right_open(v2,v4);
173 IntervalT I4_5D = IntervalT::right_open(v4,v5);
175 split_interval_set<T> split_set;
176 split_set.add(I1_3D).add(I2_4D).add(I4_5D);
177 BOOST_CHECK_EQUAL( split_set.iterative_size(), 4 );
178 separate_interval_set<T> sep_set;
180 BOOST_CHECK_EQUAL( sep_set.iterative_size(), 4 );
181 interval_set<T> join_set;
182 join_set = split_set;
183 BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
185 separate_interval_set<T> sep_set2;
186 sep_set2.add(I1_3D).add(I2_4D).add(I4_5D);
187 BOOST_CHECK_EQUAL( sep_set2.iterative_size(), 2 );
188 split_interval_set<T> split_set2;
189 split_set2 = sep_set2;
190 BOOST_CHECK_EQUAL( split_set2.iterative_size(), 2 );
191 interval_set<T> join_set2;
192 join_set2 = sep_set2;
193 BOOST_CHECK_EQUAL( join_set2.iterative_size(), 1 );
198 void interval_set_mixed_equal_4_bicremental_types()
200 typedef interval_set<T> IntervalSetT;
201 typedef typename IntervalSetT::interval_type IntervalT;
209 IntervalT I1_3D = IntervalT::right_open(v1,v3);
210 IntervalT I2_4D = IntervalT::right_open(v2,v4);
211 IntervalT I4_5D = IntervalT::right_open(v4,v5);
213 interval_set<T> join_set;
214 join_set.add(I1_3D).add(I2_4D).add(I4_5D);
215 interval_set<T> join_set2 = join_set;
216 BOOST_CHECK_EQUAL( join_set, join_set2 );
217 BOOST_CHECK_EQUAL( is_element_equal(join_set, join_set2), true );
219 separate_interval_set<T> sep_set;
220 sep_set.add(I1_3D).add(I2_4D).add(I4_5D);
222 separate_interval_set<T> sep_set2 = sep_set;
223 BOOST_CHECK_EQUAL( sep_set, sep_set2 );
224 BOOST_CHECK_EQUAL( is_element_equal(sep_set2, sep_set), true );
226 split_interval_set<T> split_set;
227 split_set.add(I1_3D).add(I2_4D).add(I4_5D);
228 split_interval_set<T> split_set2 = split_set;
229 BOOST_CHECK_EQUAL( split_set, split_set2 );
230 BOOST_CHECK_EQUAL( is_element_equal(split_set2, split_set), true );
232 BOOST_CHECK_EQUAL( is_element_equal(split_set, join_set), true );
233 BOOST_CHECK_EQUAL( is_element_equal(split_set, sep_set), true );
234 BOOST_CHECK_EQUAL( is_element_equal(join_set, sep_set), true );
235 BOOST_CHECK_EQUAL( is_element_equal(join_set, split_set), true );
236 BOOST_CHECK_EQUAL( is_element_equal(sep_set, join_set), true );
237 BOOST_CHECK_EQUAL( is_element_equal(sep_set, split_set), true );
241 void interval_set_mixed_contains_4_bicremental_types()
243 typedef interval_set<T> IntervalSetT;
244 typedef typename IntervalSetT::interval_type IntervalT;
246 split_interval_set<T> split_set;
247 split_set.add(I_D(0,4)).add(I_D(4,8));
248 BOOST_CHECK_EQUAL( icl::contains(split_set, MK_v(4)), true );
249 BOOST_CHECK_EQUAL( icl::contains(split_set, C_D(2,5)), true );
251 interval_set<T> join_set_gap4(split_set.erase(MK_v(4)));
252 BOOST_CHECK_EQUAL( icl::contains(join_set_gap4, MK_v(4)), false );
253 BOOST_CHECK_EQUAL( icl::contains(join_set_gap4, C_D(2,5)), false );
255 BOOST_CHECK_EQUAL( icl::contains(split_set, split_set), true );
256 BOOST_CHECK_EQUAL( icl::contains(split_set, join_set_gap4), true );
261 void interval_set_mixed_add_4_bicremental_types()
263 typedef interval_set<T> IntervalSetT;
264 typedef typename IntervalSetT::interval_type IntervalT;
272 IntervalT I1_3D = IntervalT::right_open(v1,v3);
273 IntervalT I2_4D = IntervalT::right_open(v2,v4);
274 IntervalT I4_5D = IntervalT::right_open(v4,v5);
276 split_interval_set<T> split_set;
277 split_set.add(I1_3D).add(I2_4D);
279 BOOST_CHECK_EQUAL( split_set.iterative_size(), 4 );
280 separate_interval_set<T> sep_set;
281 sep_set += split_set;
282 BOOST_CHECK_EQUAL( sep_set.iterative_size(), 4 );
283 interval_set<T> join_set;
284 join_set += split_set;
285 BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
287 separate_interval_set<T> sep_set2;
288 sep_set2.add(I1_3D).add(I2_4D);
290 BOOST_CHECK_EQUAL( sep_set2.iterative_size(), 2 );
291 split_interval_set<T> split_set2;
292 split_set2 += sep_set2;
293 BOOST_CHECK_EQUAL( split_set2.iterative_size(), 2 );
294 interval_set<T> join_set2;
295 join_set2 += sep_set2;
296 BOOST_CHECK_EQUAL( join_set2.iterative_size(), 1 );
298 interval_set<T> join_set3;
299 join_set3.add(v1).add(v3);
301 BOOST_CHECK_EQUAL( join_set3.iterative_size(), 3 );
302 split_interval_set<T> split_set3;
303 split_set3 += join_set3;
304 BOOST_CHECK_EQUAL( split_set3.iterative_size(), 3 );
305 separate_interval_set<T> sep_set3;
306 sep_set3 += join_set3;
307 BOOST_CHECK_EQUAL( join_set3.iterative_size(), 3 );
311 void interval_set_mixed_subtract_4_bicremental_types()
313 typedef interval_set<T> IntervalSetT;
314 typedef typename IntervalSetT::interval_type IntervalT;
326 IntervalT I0_4D = IntervalT::right_open(v0,v4);
327 IntervalT I2_6D = IntervalT::right_open(v2,v6);
328 IntervalT I3_6D = IntervalT::right_open(v3,v6);
329 IntervalT I5_7D = IntervalT::right_open(v5,v7);
330 IntervalT I7_8D = IntervalT::right_open(v7,v8);
331 IntervalT I8_9D = IntervalT::right_open(v8,v9);
332 IntervalT I8_9I = IntervalT::closed(v8,v9);
334 split_interval_set<T> split_set;
335 split_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
336 BOOST_CHECK_EQUAL( split_set.iterative_size(), 7 );
338 separate_interval_set<T> sep_set;
339 sep_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
340 BOOST_CHECK_EQUAL( sep_set.iterative_size(), 3 );
342 interval_set<T> join_set;
343 join_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
344 BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
346 // Make sets to be subtracted
347 split_interval_set<T> split_sub;
348 split_sub.add(I3_6D).add(I8_9D);
350 separate_interval_set<T> sep_sub;
351 sep_sub.add(I3_6D).add(I8_9D);
353 interval_set<T> join_sub;
354 join_sub.add(I3_6D).add(I8_9D);
356 //--------------------------------------------------------------------------
357 // Test for split_interval_set
358 split_interval_set<T> split_diff = split_set;
359 separate_interval_set<T> sep_diff = sep_set;
360 interval_set<T> join_diff = join_set;
362 //subtraction combinations
363 split_diff -= split_sub;
364 sep_diff -= split_sub;
365 join_diff -= split_sub;
367 BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
368 BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
369 BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
371 BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
372 BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
373 BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
374 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
375 BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
377 //--------------------------------------------------------------------------
378 // Test for separate_interval_set. Reinitialize
379 split_diff = split_set;
381 join_diff = join_set;
383 //subtraction combinations
384 split_diff -= sep_sub;
386 join_diff -= sep_sub;
388 BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
389 BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
390 BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
392 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, sep_diff), true );
393 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
394 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
395 BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
396 BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
398 //--------------------------------------------------------------------------
399 // Test for interval_set. Reinitialize
400 split_diff = split_set;
402 join_diff = join_set;
404 //subtraction combinations
405 split_diff -= join_sub;
406 sep_diff -= join_sub;
407 join_diff -= join_sub;
409 BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
410 BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
411 BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
413 BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
414 BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
415 BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
416 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
417 BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
422 void interval_set_mixed_erase_4_bicremental_types()
424 typedef interval_set<T> IntervalSetT;
425 typedef typename IntervalSetT::interval_type IntervalT;
437 IntervalT I0_4D = IntervalT::right_open(v0,v4);
438 IntervalT I2_6D = IntervalT::right_open(v2,v6);
439 IntervalT I3_6D = IntervalT::right_open(v3,v6);
440 IntervalT I5_7D = IntervalT::right_open(v5,v7);
441 IntervalT I7_8D = IntervalT::right_open(v7,v8);
442 IntervalT I8_9D = IntervalT::right_open(v8,v9);
443 IntervalT I8_9I = IntervalT::closed(v8,v9);
445 split_interval_set<T> split_set;
446 split_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
447 BOOST_CHECK_EQUAL( split_set.iterative_size(), 7 );
449 separate_interval_set<T> sep_set;
450 sep_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
451 BOOST_CHECK_EQUAL( sep_set.iterative_size(), 3 );
453 interval_set<T> join_set;
454 join_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
455 BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
457 // Make sets to be subtracted
458 split_interval_set<T> split_sub;
459 split_sub.add(I3_6D).add(I8_9D);
461 separate_interval_set<T> sep_sub;
462 sep_sub.add(I3_6D).add(I8_9D);
464 interval_set<T> join_sub;
465 join_sub.add(I3_6D).add(I8_9D);
467 //--------------------------------------------------------------------------
468 // Test for split_interval_set
469 split_interval_set<T> split_diff = split_set;
470 separate_interval_set<T> sep_diff = sep_set;
471 interval_set<T> join_diff = join_set;
473 //subtraction combinations
474 erase(split_diff, split_sub);
475 erase(sep_diff, split_sub);
476 erase(join_diff, split_sub);
478 BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
479 BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
480 BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
482 BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
483 BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
484 BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
485 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
486 BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
488 //--------------------------------------------------------------------------
489 // Test for separate_interval_set. Reinitialize
490 split_diff = split_set;
492 join_diff = join_set;
494 //subtraction combinations
495 erase(split_diff, sep_sub);
496 erase(sep_diff, sep_sub);
497 erase(join_diff, sep_sub);
499 BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
500 BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
501 BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
503 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, sep_diff), true );
504 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
505 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
506 BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
507 BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
509 //--------------------------------------------------------------------------
510 // Test for interval_set. Reinitialize
511 split_diff = split_set;
513 join_diff = join_set;
515 //subtraction combinations
516 erase(split_diff, join_sub);
517 erase(sep_diff, join_sub);
518 erase(join_diff, join_sub);
520 BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
521 BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
522 BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
524 BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
525 BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
526 BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
527 BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
528 BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
532 void interval_set_mixed_basic_intersect_4_bicremental_types()
534 typedef interval_set<T> IntervalSetT;
535 typedef typename IntervalSetT::interval_type IntervalT;
546 IntervalT I0_3D = IntervalT::right_open(v0,v3);
547 IntervalT I1_3D = IntervalT::right_open(v1,v3);
548 IntervalT I1_8D = IntervalT::right_open(v1,v8);
549 IntervalT I2_7D = IntervalT::right_open(v2,v7);
550 IntervalT I2_3D = IntervalT::right_open(v2,v3);
551 IntervalT I6_7D = IntervalT::right_open(v6,v7);
552 IntervalT I6_8D = IntervalT::right_open(v6,v8);
553 IntervalT I6_9D = IntervalT::right_open(v6,v9);
555 //--------------------------------------------------------------------------
556 // split_interval_set
557 //--------------------------------------------------------------------------
558 //split_A [0 3) [6 9)
560 //split_AB -> [1 3) [6 8)
563 split_interval_set<T> split_A, split_B, split_AB, split_ab, split_ab2;
565 split_A.add(I0_3D).add(I6_9D);
568 split_ab.add(I1_3D).add(I6_8D);
570 BOOST_CHECK_EQUAL( split_AB, split_ab );
573 (split_AB &= I1_8D) &= I2_7D;
574 split_ab2.add(I2_3D).add(I6_7D);
576 BOOST_CHECK_EQUAL( split_AB, split_ab2 );
579 //--------------------------------------------------------------------------
580 //split_A [0 3) [6 9)
585 split_A.add(I0_3D).add(I6_9D);
591 BOOST_CHECK_EQUAL( split_AB, split_ab );
594 (split_AB &= v1) += IntervalT::open(v1,v7);
596 split_ab2 += IntervalT::right_open(v1,v7);
598 BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
602 void interval_set_mixed_intersect_4_bicremental_types()
604 typedef interval_set<T> IntervalSetT;
605 typedef typename IntervalSetT::interval_type IntervalT;
618 IntervalT I0_3D = IntervalT::right_open(v0,v3);
619 IntervalT I1_2D = IntervalT::right_open(v1,v2);
620 IntervalT I1_3D = IntervalT::right_open(v1,v3);
621 IntervalT I2_3D = IntervalT::right_open(v2,v3);
622 IntervalT I2_4D = IntervalT::right_open(v2,v4);
623 IntervalT I5_8D = IntervalT::right_open(v5,v8);
624 IntervalT I6_8D = IntervalT::right_open(v6,v8);
625 IntervalT I6_9D = IntervalT::right_open(v6,v9);
627 //--------------------------------------------------------------------------
628 // split_interval_set
629 //--------------------------------------------------------------------------
630 //split_A [0 3) [6 9)
631 //split_B &= [1 2)[2 4) [5 8)
632 //split_AB -> [1 2)[2 3) [6 8)
633 split_interval_set<T> split_A, split_B, split_AB, split_ab, split_ab_jn;
634 separate_interval_set<T> sep_A, sep_B, sep_AB, sep_ab;
635 interval_set<T> join_A, join_B, join_AB, join_ab;
637 split_A.add(I0_3D).add(I6_9D);
638 split_B.add(I1_2D).add(I2_4D).add(I5_8D);
639 split_ab.add(I1_2D).add(I2_3D).add(I6_8D);
640 split_ab_jn.add(I1_3D).add(I6_8D);
643 BOOST_CHECK_EQUAL( split_AB.iterative_size(), 3 );
644 BOOST_CHECK_EQUAL( split_AB, split_ab );
646 //split_A [0 3) [6 9)
647 //sep_B &= [1 2)[2 4) [5 8)
648 //split_AB -> [1 2)[2 3) [6 8)
652 BOOST_CHECK_EQUAL( split_AB.iterative_size(), 3 );
653 BOOST_CHECK_EQUAL( split_AB, split_ab );
655 //split_A [0 3) [6 9)
656 //join_B &= [1 4) [5 8)
657 //split_AB -> [1 3) [6 8)
662 BOOST_CHECK_EQUAL( split_AB.iterative_size(), 2 );
663 BOOST_CHECK_EQUAL( split_AB, split_ab_jn );
665 //--------------------------------------------------------------------------
666 // separate_interval_set
667 //--------------------------------------------------------------------------
669 //sep_B &= [1 2)[2 4) [5 8)
670 //sep_AB -> [1 2)[2 3) [6 8)
672 BOOST_CHECK_EQUAL( sep_ab.iterative_size(), 3 );
678 BOOST_CHECK_EQUAL( sep_AB.iterative_size(), 3 );
679 BOOST_CHECK_EQUAL( sep_AB, sep_ab );
682 //split_B &= [1 2)[2 4) [5 8)
683 //sep_AB -> [1 2)[2 3) [6 8)
687 BOOST_CHECK_EQUAL( sep_AB.iterative_size(), 3 );
688 BOOST_CHECK_EQUAL( sep_AB, sep_ab );
691 //join_B &= [1 4) [5 8)
692 //sep_AB -> [1 3) [6 8)
693 separate_interval_set<T> sep_ab_jn = split_ab_jn;
698 BOOST_CHECK_EQUAL( sep_AB.iterative_size(), 2 );
699 BOOST_CHECK_EQUAL( sep_AB, sep_ab_jn );
701 //--------------------------------------------------------------------------
702 // separate_interval_set
703 //--------------------------------------------------------------------------
705 //join_B &= [1 4) [5 8)
706 //join_AB -> [1 3) [6 8)
708 BOOST_CHECK_EQUAL( join_ab.iterative_size(), 2 );
714 BOOST_CHECK_EQUAL( join_AB.iterative_size(), 2 );
715 BOOST_CHECK_EQUAL( join_AB, join_ab );
718 //split_B &= [1 2)[2 4) [5 8)
719 //join_AB -> [1 3) [6 8)
723 BOOST_CHECK_EQUAL( join_AB.iterative_size(), 2 );
724 BOOST_CHECK_EQUAL( join_AB, join_ab );
727 //sep_B &= [1 2)[2 4) [5 8)
728 //join_AB -> [1 3) [6 8)
732 BOOST_CHECK_EQUAL( join_AB.iterative_size(), 2 );
733 BOOST_CHECK_EQUAL( join_AB, join_ab );
739 void interval_set_mixed_disjoint_4_bicremental_types()
741 typedef interval_set<T> IntervalSetT;
742 typedef typename IntervalSetT::interval_type IntervalT;
750 IntervalT I0_2D = IntervalT::right_open(v0,v2);
751 IntervalT I2_3D = IntervalT::right_open(v2,v3);
752 IntervalT I3_4D = IntervalT::right_open(v3,v4);
753 IntervalT I4_4I = IntervalT::closed(v4,v4);
754 IntervalT C4_6D = IntervalT::open(v4,v6);
755 IntervalT I6_6I = IntervalT::closed(v6,v6);
757 //--------------------------------------------------------------------------
758 //split_A: [0 2) [4 4] [6 6]
759 //split_B: [2 3)[3 4) (4 6)
760 split_interval_set<T> split_A, split_B;
762 split_A.add(I0_2D).add(I4_4I).add(I6_6I);
763 split_B.add(I2_3D).add(I3_4D).add(C4_6D);
765 separate_interval_set<T> sep_A(split_A), sep_B(split_B);
766 interval_set<T> join_A(split_A), join_B(split_B);
768 BOOST_CHECK_EQUAL( disjoint(split_A, split_B), true );
769 BOOST_CHECK_EQUAL( disjoint(split_A, sep_B), true );
770 BOOST_CHECK_EQUAL( disjoint(split_A, join_B), true );
772 BOOST_CHECK_EQUAL( disjoint(sep_A, split_B), true );
773 BOOST_CHECK_EQUAL( disjoint(sep_A, sep_B), true );
774 BOOST_CHECK_EQUAL( disjoint(sep_A, join_B), true );
776 BOOST_CHECK_EQUAL( disjoint(join_A, split_B), true );
777 BOOST_CHECK_EQUAL( disjoint(join_A, sep_B), true );
778 BOOST_CHECK_EQUAL( disjoint(join_A, join_B), true );
782 void interval_set_mixed_infix_plus_overload_4_bicremental_types()
784 typedef interval_set<T> IntervalSetT;
785 typedef typename IntervalSetT::interval_type IntervalT;
787 interval_set<T> join_a;
788 separate_interval_set<T> sep_a;
789 split_interval_set<T> split_a;
791 join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
792 sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
793 split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
795 BOOST_CHECK_EQUAL(split_a + sep_a, sep_a + split_a );
796 BOOST_CHECK_EQUAL(split_a + join_a, join_a + split_a);
797 BOOST_CHECK_EQUAL(sep_a + join_a, join_a + sep_a );
800 template <class T> void interval_set_mixed_infix_pipe_overload_4_bicremental_types()
802 typedef interval_set<T> IntervalSetT;
803 typedef typename IntervalSetT::interval_type IntervalT;
805 interval_set<T> join_a;
806 separate_interval_set<T> sep_a;
807 split_interval_set<T> split_a;
809 join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
810 sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
811 split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
813 BOOST_CHECK_EQUAL(split_a | sep_a, sep_a | split_a );
814 BOOST_CHECK_EQUAL(split_a | join_a, join_a | split_a);
815 BOOST_CHECK_EQUAL(sep_a | join_a, join_a | sep_a );
819 void interval_set_mixed_infix_minus_overload_4_bicremental_types()
821 typedef interval_set<T> IntervalSetT;
822 typedef typename IntervalSetT::interval_type IntervalT;
824 interval_set<T> join_a, join_b;
825 separate_interval_set<T> sep_a, sep_b;
826 split_interval_set<T> split_a, split_b;
828 join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
829 sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
830 split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
832 BOOST_CHECK_EQUAL(split_a - sep_a, (split_b = split_a) -= sep_a );
833 BOOST_CHECK_EQUAL(split_a - join_a, (split_b = split_a) -= join_a );
834 BOOST_CHECK_EQUAL(sep_a - join_a, (sep_b = sep_a) -= join_a );
836 BOOST_CHECK_EQUAL(sep_a - split_a, (sep_b = sep_a) -= split_a);
837 BOOST_CHECK_EQUAL(join_a - split_a, (join_b = join_a) -= split_a);
838 BOOST_CHECK_EQUAL(join_a - sep_a, (join_b = join_a) -= sep_a );
841 template <class T> void interval_set_mixed_infix_et_overload_4_bicremental_types()
843 typedef interval_set<T> IntervalSetT;
844 typedef typename IntervalSetT::interval_type IntervalT;
846 interval_set<T> join_a;
847 separate_interval_set<T> sep_a;
848 split_interval_set<T> split_a;
850 join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
851 sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
852 split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
854 BOOST_CHECK_EQUAL(split_a & sep_a, sep_a & split_a );
855 BOOST_CHECK_EQUAL(split_a & join_a, join_a & split_a);
856 BOOST_CHECK_EQUAL(sep_a & join_a, join_a & sep_a );
859 template <class T> void interval_set_mixed_infix_caret_overload_4_bicremental_types()
861 typedef interval_set<T> IntervalSetT;
862 typedef typename IntervalSetT::interval_type IntervalT;
864 interval_set<T> join_a;
865 separate_interval_set<T> sep_a;
866 split_interval_set<T> split_a;
868 join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
869 sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
870 split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
872 BOOST_CHECK_EQUAL(split_a ^ sep_a, sep_a ^ split_a );
873 BOOST_CHECK_EQUAL(split_a ^ join_a, join_a ^ split_a);
874 BOOST_CHECK_EQUAL(sep_a ^ join_a, join_a ^ sep_a );
877 #endif // LIBS_ICL_TEST_TEST_INTERVAL_SET_MIXED_HPP_JOFA_090702