test_interval_set_mixed.hpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  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
  10. template <class T>
  11. void interval_set_mixed_ctor_4_ordered_types()
  12. {
  13. T v0 = boost::icl::identity_element<T>::value();
  14. split_interval_set<T> split_set(v0);
  15. separate_interval_set<T> sep_set(split_set);
  16. interval_set<T> join_set(sep_set);
  17. BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(sep_set).lower() );
  18. BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(join_set).lower() );
  19. }
  20. template <class T>
  21. void interval_set_mixed_equal_4_ordered_types()
  22. {
  23. T v0 = boost::icl::identity_element<T>::value();
  24. split_interval_set<T> split_empty, split_single(v0);
  25. separate_interval_set<T> sep_empty, sep_single(v0);
  26. interval_set<T> join_empty, join_single(v0);
  27. // mixed ==-equality is a strange thing. Most times is does not
  28. // make sense. It is better to allow only for same type == equality.
  29. BOOST_CHECK_EQUAL( split_empty == split_empty, true );
  30. BOOST_CHECK_EQUAL( sep_empty == sep_empty, true );
  31. BOOST_CHECK_EQUAL( join_empty == join_empty, true );
  32. // There were Problems with operator== and emtpy sets.
  33. BOOST_CHECK_EQUAL( split_empty == split_single, false );
  34. BOOST_CHECK_EQUAL( sep_empty == sep_single, false );
  35. BOOST_CHECK_EQUAL( join_empty == join_single, false );
  36. BOOST_CHECK_EQUAL( split_single == split_empty, false );
  37. BOOST_CHECK_EQUAL( sep_single == sep_empty, false );
  38. BOOST_CHECK_EQUAL( join_single == join_empty, false );
  39. BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_empty), true );
  40. BOOST_CHECK_EQUAL( is_element_equal(split_empty, sep_empty), true );
  41. BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_empty), true );
  42. BOOST_CHECK_EQUAL( is_element_equal(sep_empty, split_empty), true );
  43. BOOST_CHECK_EQUAL( is_element_equal(sep_empty, sep_empty), true );
  44. BOOST_CHECK_EQUAL( is_element_equal(sep_empty, join_empty), true );
  45. BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_empty), true );
  46. BOOST_CHECK_EQUAL( is_element_equal(join_empty, sep_empty), true );
  47. BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_empty), true );
  48. //--------------------------------------------------------------------------
  49. BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_single), false );
  50. BOOST_CHECK_EQUAL( is_element_equal(split_empty, sep_single), false );
  51. BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_single), false );
  52. BOOST_CHECK_EQUAL( is_element_equal(sep_empty, split_single), false );
  53. BOOST_CHECK_EQUAL( is_element_equal(sep_empty, sep_single), false );
  54. BOOST_CHECK_EQUAL( is_element_equal(sep_empty, join_single), false );
  55. BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_single), false );
  56. BOOST_CHECK_EQUAL( is_element_equal(join_empty, sep_single), false );
  57. BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_single), false );
  58. //--------------------------------------------------------------------------
  59. BOOST_CHECK_EQUAL( is_element_equal(split_single, split_empty), false );
  60. BOOST_CHECK_EQUAL( is_element_equal(split_single, sep_empty), false );
  61. BOOST_CHECK_EQUAL( is_element_equal(split_single, join_empty), false );
  62. BOOST_CHECK_EQUAL( is_element_equal(sep_single, split_empty), false );
  63. BOOST_CHECK_EQUAL( is_element_equal(sep_single, sep_empty), false );
  64. BOOST_CHECK_EQUAL( is_element_equal(sep_single, join_empty), false );
  65. BOOST_CHECK_EQUAL( is_element_equal(join_single, split_empty), false );
  66. BOOST_CHECK_EQUAL( is_element_equal(join_single, sep_empty), false );
  67. BOOST_CHECK_EQUAL( is_element_equal(join_single, join_empty), false );
  68. }
  69. template <class T>
  70. void interval_set_mixed_assign_4_ordered_types()
  71. {
  72. T v0 = boost::icl::identity_element<T>::value();
  73. T v1 = unit_element<T>::value();
  74. split_interval_set<T> split_set;
  75. separate_interval_set<T> sep_set;
  76. interval_set<T> join_set;
  77. split_set.add(v0);
  78. sep_set = split_set;
  79. join_set = sep_set;
  80. BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(sep_set).lower() );
  81. BOOST_CHECK_EQUAL( hull(split_set).lower(), hull(join_set).lower() );
  82. split_interval_set<T> split_self = split_interval_set<T>().add(v0);
  83. separate_interval_set<T> sep_self = separate_interval_set<T>().add(v0).add(v1);
  84. interval_set<T> join_self = interval_set<T>().add(v1);
  85. split_self = split_self;
  86. sep_self = sep_self;
  87. join_self = join_self;
  88. BOOST_CHECK_EQUAL( split_self, split_self );
  89. BOOST_CHECK_EQUAL( sep_self, sep_self );
  90. BOOST_CHECK_EQUAL( join_self, join_self );
  91. }
  92. template <class T>
  93. void interval_set_mixed_ctor_4_bicremental_types()
  94. {
  95. typedef interval_set<T> IntervalSetT;
  96. typedef typename IntervalSetT::interval_type IntervalT;
  97. T v1 = make<T>(1);
  98. T v2 = make<T>(2);
  99. T v3 = make<T>(3);
  100. T v4 = make<T>(4);
  101. T v5 = make<T>(5);
  102. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  103. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  104. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  105. split_interval_set<T> split_set;
  106. split_set.add(I1_3D).add(I2_4D).add(I4_5D);
  107. BOOST_CHECK_EQUAL( split_set.iterative_size(), 4 );
  108. separate_interval_set<T> sep_set(split_set);
  109. BOOST_CHECK_EQUAL( sep_set.iterative_size(), 4 );
  110. interval_set<T> join_set(split_set);
  111. BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
  112. separate_interval_set<T> sep_set2;
  113. sep_set2.add(I1_3D).add(I2_4D).add(I4_5D);
  114. BOOST_CHECK_EQUAL( sep_set2.iterative_size(), 2 );
  115. split_interval_set<T> split_set2(sep_set2);
  116. BOOST_CHECK_EQUAL( split_set2.iterative_size(), 2 );
  117. interval_set<T> join_set2(sep_set2);
  118. BOOST_CHECK_EQUAL( join_set2.iterative_size(), 1 );
  119. }
  120. template <class T>
  121. void interval_set_mixed_assign_4_bicremental_types()
  122. {
  123. typedef interval_set<T> IntervalSetT;
  124. typedef typename IntervalSetT::interval_type IntervalT;
  125. T v1 = make<T>(1);
  126. T v2 = make<T>(2);
  127. T v3 = make<T>(3);
  128. T v4 = make<T>(4);
  129. T v5 = make<T>(5);
  130. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  131. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  132. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  133. split_interval_set<T> split_set;
  134. split_set.add(I1_3D).add(I2_4D).add(I4_5D);
  135. BOOST_CHECK_EQUAL( split_set.iterative_size(), 4 );
  136. separate_interval_set<T> sep_set;
  137. sep_set = split_set;
  138. BOOST_CHECK_EQUAL( sep_set.iterative_size(), 4 );
  139. interval_set<T> join_set;
  140. join_set = split_set;
  141. BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
  142. separate_interval_set<T> sep_set2;
  143. sep_set2.add(I1_3D).add(I2_4D).add(I4_5D);
  144. BOOST_CHECK_EQUAL( sep_set2.iterative_size(), 2 );
  145. split_interval_set<T> split_set2;
  146. split_set2 = sep_set2;
  147. BOOST_CHECK_EQUAL( split_set2.iterative_size(), 2 );
  148. interval_set<T> join_set2;
  149. join_set2 = sep_set2;
  150. BOOST_CHECK_EQUAL( join_set2.iterative_size(), 1 );
  151. }
  152. template <class T>
  153. void interval_set_mixed_equal_4_bicremental_types()
  154. {
  155. typedef interval_set<T> IntervalSetT;
  156. typedef typename IntervalSetT::interval_type IntervalT;
  157. T v1 = make<T>(1);
  158. T v2 = make<T>(2);
  159. T v3 = make<T>(3);
  160. T v4 = make<T>(4);
  161. T v5 = make<T>(5);
  162. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  163. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  164. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  165. interval_set<T> join_set;
  166. join_set.add(I1_3D).add(I2_4D).add(I4_5D);
  167. interval_set<T> join_set2 = join_set;
  168. BOOST_CHECK_EQUAL( join_set, join_set2 );
  169. BOOST_CHECK_EQUAL( is_element_equal(join_set, join_set2), true );
  170. separate_interval_set<T> sep_set;
  171. sep_set.add(I1_3D).add(I2_4D).add(I4_5D);
  172. separate_interval_set<T> sep_set2 = sep_set;
  173. BOOST_CHECK_EQUAL( sep_set, sep_set2 );
  174. BOOST_CHECK_EQUAL( is_element_equal(sep_set2, sep_set), true );
  175. split_interval_set<T> split_set;
  176. split_set.add(I1_3D).add(I2_4D).add(I4_5D);
  177. split_interval_set<T> split_set2 = split_set;
  178. BOOST_CHECK_EQUAL( split_set, split_set2 );
  179. BOOST_CHECK_EQUAL( is_element_equal(split_set2, split_set), true );
  180. BOOST_CHECK_EQUAL( is_element_equal(split_set, join_set), true );
  181. BOOST_CHECK_EQUAL( is_element_equal(split_set, sep_set), true );
  182. BOOST_CHECK_EQUAL( is_element_equal(join_set, sep_set), true );
  183. BOOST_CHECK_EQUAL( is_element_equal(join_set, split_set), true );
  184. BOOST_CHECK_EQUAL( is_element_equal(sep_set, join_set), true );
  185. BOOST_CHECK_EQUAL( is_element_equal(sep_set, split_set), true );
  186. }
  187. template <class T>
  188. void interval_set_mixed_contains_4_bicremental_types()
  189. {
  190. split_interval_set<T> split_set;
  191. split_set.add(I_D(0,4)).add(I_D(4,8));
  192. BOOST_CHECK_EQUAL( icl::contains(split_set, MK_v(4)), true );
  193. BOOST_CHECK_EQUAL( icl::contains(split_set, C_D(2,5)), true );
  194. interval_set<T> join_set_gap4(split_set.erase(MK_v(4)));
  195. BOOST_CHECK_EQUAL( icl::contains(join_set_gap4, MK_v(4)), false );
  196. BOOST_CHECK_EQUAL( icl::contains(join_set_gap4, C_D(2,5)), false );
  197. BOOST_CHECK_EQUAL( icl::contains(split_set, split_set), true );
  198. BOOST_CHECK_EQUAL( icl::contains(split_set, join_set_gap4), true );
  199. }
  200. template <class T>
  201. void interval_set_mixed_add_4_bicremental_types()
  202. {
  203. typedef interval_set<T> IntervalSetT;
  204. typedef typename IntervalSetT::interval_type IntervalT;
  205. T v1 = make<T>(1);
  206. T v2 = make<T>(2);
  207. T v3 = make<T>(3);
  208. T v4 = make<T>(4);
  209. T v5 = make<T>(5);
  210. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  211. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  212. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  213. split_interval_set<T> split_set;
  214. split_set.add(I1_3D).add(I2_4D);
  215. split_set += I4_5D;
  216. BOOST_CHECK_EQUAL( split_set.iterative_size(), 4 );
  217. separate_interval_set<T> sep_set;
  218. sep_set += split_set;
  219. BOOST_CHECK_EQUAL( sep_set.iterative_size(), 4 );
  220. interval_set<T> join_set;
  221. join_set += split_set;
  222. BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
  223. separate_interval_set<T> sep_set2;
  224. sep_set2.add(I1_3D).add(I2_4D);
  225. sep_set2 += I4_5D;
  226. BOOST_CHECK_EQUAL( sep_set2.iterative_size(), 2 );
  227. split_interval_set<T> split_set2;
  228. split_set2 += sep_set2;
  229. BOOST_CHECK_EQUAL( split_set2.iterative_size(), 2 );
  230. interval_set<T> join_set2;
  231. join_set2 += sep_set2;
  232. BOOST_CHECK_EQUAL( join_set2.iterative_size(), 1 );
  233. interval_set<T> join_set3;
  234. join_set3.add(v1).add(v3);
  235. join_set3 += v5;
  236. BOOST_CHECK_EQUAL( join_set3.iterative_size(), 3 );
  237. split_interval_set<T> split_set3;
  238. split_set3 += join_set3;
  239. BOOST_CHECK_EQUAL( split_set3.iterative_size(), 3 );
  240. separate_interval_set<T> sep_set3;
  241. sep_set3 += join_set3;
  242. BOOST_CHECK_EQUAL( join_set3.iterative_size(), 3 );
  243. }
  244. template <class T>
  245. void interval_set_mixed_subtract_4_bicremental_types()
  246. {
  247. typedef interval_set<T> IntervalSetT;
  248. typedef typename IntervalSetT::interval_type IntervalT;
  249. T v0 = make<T>(0);
  250. T v2 = make<T>(2);
  251. T v3 = make<T>(3);
  252. T v4 = make<T>(4);
  253. T v5 = make<T>(5);
  254. T v6 = make<T>(6);
  255. T v7 = make<T>(7);
  256. T v8 = make<T>(8);
  257. T v9 = make<T>(9);
  258. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  259. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  260. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  261. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  262. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  263. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  264. IntervalT I8_9I = IntervalT::closed(v8,v9);
  265. split_interval_set<T> split_set;
  266. split_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
  267. BOOST_CHECK_EQUAL( split_set.iterative_size(), 7 );
  268. separate_interval_set<T> sep_set;
  269. sep_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
  270. BOOST_CHECK_EQUAL( sep_set.iterative_size(), 3 );
  271. interval_set<T> join_set;
  272. join_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
  273. BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
  274. // Make sets to be subtracted
  275. split_interval_set<T> split_sub;
  276. split_sub.add(I3_6D).add(I8_9D);
  277. separate_interval_set<T> sep_sub;
  278. sep_sub.add(I3_6D).add(I8_9D);
  279. interval_set<T> join_sub;
  280. join_sub.add(I3_6D).add(I8_9D);
  281. //--------------------------------------------------------------------------
  282. // Test for split_interval_set
  283. split_interval_set<T> split_diff = split_set;
  284. separate_interval_set<T> sep_diff = sep_set;
  285. interval_set<T> join_diff = join_set;
  286. //subtraction combinations
  287. split_diff -= split_sub;
  288. sep_diff -= split_sub;
  289. join_diff -= split_sub;
  290. BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
  291. BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
  292. BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
  293. BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
  294. BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
  295. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  296. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
  297. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  298. //--------------------------------------------------------------------------
  299. // Test for separate_interval_set. Reinitialize
  300. split_diff = split_set;
  301. sep_diff = sep_set;
  302. join_diff = join_set;
  303. //subtraction combinations
  304. split_diff -= sep_sub;
  305. sep_diff -= sep_sub;
  306. join_diff -= sep_sub;
  307. BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
  308. BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
  309. BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
  310. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, sep_diff), true );
  311. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
  312. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
  313. BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
  314. BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
  315. //--------------------------------------------------------------------------
  316. // Test for interval_set. Reinitialize
  317. split_diff = split_set;
  318. sep_diff = sep_set;
  319. join_diff = join_set;
  320. //subtraction combinations
  321. split_diff -= join_sub;
  322. sep_diff -= join_sub;
  323. join_diff -= join_sub;
  324. BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
  325. BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
  326. BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
  327. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  328. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  329. BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
  330. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
  331. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  332. }
  333. template <class T>
  334. void interval_set_mixed_erase_4_bicremental_types()
  335. {
  336. typedef interval_set<T> IntervalSetT;
  337. typedef typename IntervalSetT::interval_type IntervalT;
  338. T v0 = make<T>(0);
  339. T v2 = make<T>(2);
  340. T v3 = make<T>(3);
  341. T v4 = make<T>(4);
  342. T v5 = make<T>(5);
  343. T v6 = make<T>(6);
  344. T v7 = make<T>(7);
  345. T v8 = make<T>(8);
  346. T v9 = make<T>(9);
  347. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  348. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  349. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  350. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  351. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  352. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  353. IntervalT I8_9I = IntervalT::closed(v8,v9);
  354. split_interval_set<T> split_set;
  355. split_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
  356. BOOST_CHECK_EQUAL( split_set.iterative_size(), 7 );
  357. separate_interval_set<T> sep_set;
  358. sep_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
  359. BOOST_CHECK_EQUAL( sep_set.iterative_size(), 3 );
  360. interval_set<T> join_set;
  361. join_set.add(I0_4D).add(I2_6D).add(I5_7D).add(I7_8D).add(I8_9I);
  362. BOOST_CHECK_EQUAL( join_set.iterative_size(), 1 );
  363. // Make sets to be subtracted
  364. split_interval_set<T> split_sub;
  365. split_sub.add(I3_6D).add(I8_9D);
  366. separate_interval_set<T> sep_sub;
  367. sep_sub.add(I3_6D).add(I8_9D);
  368. interval_set<T> join_sub;
  369. join_sub.add(I3_6D).add(I8_9D);
  370. //--------------------------------------------------------------------------
  371. // Test for split_interval_set
  372. split_interval_set<T> split_diff = split_set;
  373. separate_interval_set<T> sep_diff = sep_set;
  374. interval_set<T> join_diff = join_set;
  375. //subtraction combinations
  376. erase(split_diff, split_sub);
  377. erase(sep_diff, split_sub);
  378. erase(join_diff, split_sub);
  379. BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
  380. BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
  381. BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
  382. BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
  383. BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
  384. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  385. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
  386. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  387. //--------------------------------------------------------------------------
  388. // Test for separate_interval_set. Reinitialize
  389. split_diff = split_set;
  390. sep_diff = sep_set;
  391. join_diff = join_set;
  392. //subtraction combinations
  393. erase(split_diff, sep_sub);
  394. erase(sep_diff, sep_sub);
  395. erase(join_diff, sep_sub);
  396. BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
  397. BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
  398. BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
  399. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, sep_diff), true );
  400. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, split_diff), true );
  401. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
  402. BOOST_CHECK_EQUAL( is_element_equal(split_diff, sep_diff), true );
  403. BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
  404. //--------------------------------------------------------------------------
  405. // Test for interval_set. Reinitialize
  406. split_diff = split_set;
  407. sep_diff = sep_set;
  408. join_diff = join_set;
  409. //subtraction combinations
  410. erase(split_diff, join_sub);
  411. erase(sep_diff, join_sub);
  412. erase(join_diff, join_sub);
  413. BOOST_CHECK_EQUAL( split_diff.iterative_size(), 5 );
  414. BOOST_CHECK_EQUAL( sep_diff.iterative_size(), 4 );
  415. BOOST_CHECK_EQUAL( join_diff.iterative_size(), 3 );
  416. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  417. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  418. BOOST_CHECK_EQUAL( is_element_equal(join_diff, sep_diff), true );
  419. BOOST_CHECK_EQUAL( is_element_equal(sep_diff, join_diff), true );
  420. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  421. }
  422. template <class T>
  423. void interval_set_mixed_basic_intersect_4_bicremental_types()
  424. {
  425. typedef interval_set<T> IntervalSetT;
  426. typedef typename IntervalSetT::interval_type IntervalT;
  427. T v0 = make<T>(0);
  428. T v1 = make<T>(1);
  429. T v2 = make<T>(2);
  430. T v3 = make<T>(3);
  431. T v6 = make<T>(6);
  432. T v7 = make<T>(7);
  433. T v8 = make<T>(8);
  434. T v9 = make<T>(9);
  435. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  436. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  437. IntervalT I1_8D = IntervalT::right_open(v1,v8);
  438. IntervalT I2_7D = IntervalT::right_open(v2,v7);
  439. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  440. IntervalT I6_7D = IntervalT::right_open(v6,v7);
  441. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  442. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  443. //--------------------------------------------------------------------------
  444. // split_interval_set
  445. //--------------------------------------------------------------------------
  446. //split_A [0 3) [6 9)
  447. // &= [1 8)
  448. //split_AB -> [1 3) [6 8)
  449. // &= [2 7)
  450. // -> [2 3) [6 7)
  451. split_interval_set<T> split_A, split_B, split_AB, split_ab, split_ab2;
  452. split_A.add(I0_3D).add(I6_9D);
  453. split_AB = split_A;
  454. split_AB &= I1_8D;
  455. split_ab.add(I1_3D).add(I6_8D);
  456. BOOST_CHECK_EQUAL( split_AB, split_ab );
  457. split_AB = split_A;
  458. (split_AB &= I1_8D) &= I2_7D;
  459. split_ab2.add(I2_3D).add(I6_7D);
  460. BOOST_CHECK_EQUAL( split_AB, split_ab2 );
  461. //--------------------------------------------------------------------------
  462. //split_A [0 3) [6 9)
  463. // &= 1
  464. //split_AB -> [1]
  465. // += (1 7)
  466. // -> [1](1 7)
  467. split_A.add(I0_3D).add(I6_9D);
  468. split_AB = split_A;
  469. split_AB &= v1;
  470. split_ab.clear();
  471. split_ab.add(v1);
  472. BOOST_CHECK_EQUAL( split_AB, split_ab );
  473. split_AB = split_A;
  474. (split_AB &= v1) += IntervalT::open(v1,v7);
  475. split_ab2.clear();
  476. split_ab2 += IntervalT::right_open(v1,v7);
  477. BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
  478. }
  479. template <class T>
  480. void interval_set_mixed_intersect_4_bicremental_types()
  481. {
  482. typedef interval_set<T> IntervalSetT;
  483. typedef typename IntervalSetT::interval_type IntervalT;
  484. T v0 = make<T>(0);
  485. T v1 = make<T>(1);
  486. T v2 = make<T>(2);
  487. T v3 = make<T>(3);
  488. T v4 = make<T>(4);
  489. T v5 = make<T>(5);
  490. T v6 = make<T>(6);
  491. T v8 = make<T>(8);
  492. T v9 = make<T>(9);
  493. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  494. IntervalT I1_2D = IntervalT::right_open(v1,v2);
  495. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  496. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  497. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  498. IntervalT I5_8D = IntervalT::right_open(v5,v8);
  499. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  500. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  501. //--------------------------------------------------------------------------
  502. // split_interval_set
  503. //--------------------------------------------------------------------------
  504. //split_A [0 3) [6 9)
  505. //split_B &= [1 2)[2 4) [5 8)
  506. //split_AB -> [1 2)[2 3) [6 8)
  507. split_interval_set<T> split_A, split_B, split_AB, split_ab, split_ab_jn;
  508. separate_interval_set<T> sep_A, sep_B, sep_AB, sep_ab;
  509. interval_set<T> join_A, join_B, join_AB, join_ab;
  510. split_A.add(I0_3D).add(I6_9D);
  511. split_B.add(I1_2D).add(I2_4D).add(I5_8D);
  512. split_ab.add(I1_2D).add(I2_3D).add(I6_8D);
  513. split_ab_jn.add(I1_3D).add(I6_8D);
  514. split_AB = split_A;
  515. split_AB &= split_B;
  516. BOOST_CHECK_EQUAL( split_AB.iterative_size(), 3 );
  517. BOOST_CHECK_EQUAL( split_AB, split_ab );
  518. //split_A [0 3) [6 9)
  519. //sep_B &= [1 2)[2 4) [5 8)
  520. //split_AB -> [1 2)[2 3) [6 8)
  521. split_AB = split_A;
  522. sep_B = split_B;
  523. split_AB &= sep_B;
  524. BOOST_CHECK_EQUAL( split_AB.iterative_size(), 3 );
  525. BOOST_CHECK_EQUAL( split_AB, split_ab );
  526. //split_A [0 3) [6 9)
  527. //join_B &= [1 4) [5 8)
  528. //split_AB -> [1 3) [6 8)
  529. split_AB = split_A;
  530. join_B = split_B;
  531. split_AB &= join_B;
  532. BOOST_CHECK_EQUAL( split_AB.iterative_size(), 2 );
  533. BOOST_CHECK_EQUAL( split_AB, split_ab_jn );
  534. //--------------------------------------------------------------------------
  535. // separate_interval_set
  536. //--------------------------------------------------------------------------
  537. //sep_A [0 3) [6 9)
  538. //sep_B &= [1 2)[2 4) [5 8)
  539. //sep_AB -> [1 2)[2 3) [6 8)
  540. sep_ab = split_ab;
  541. BOOST_CHECK_EQUAL( sep_ab.iterative_size(), 3 );
  542. sep_AB = split_A;
  543. sep_B = split_B;
  544. sep_AB &= sep_B;
  545. BOOST_CHECK_EQUAL( sep_AB.iterative_size(), 3 );
  546. BOOST_CHECK_EQUAL( sep_AB, sep_ab );
  547. //sep_A [0 3) [6 9)
  548. //split_B &= [1 2)[2 4) [5 8)
  549. //sep_AB -> [1 2)[2 3) [6 8)
  550. sep_AB = split_A;
  551. sep_AB &= split_B;
  552. BOOST_CHECK_EQUAL( sep_AB.iterative_size(), 3 );
  553. BOOST_CHECK_EQUAL( sep_AB, sep_ab );
  554. //sep_A [0 3) [6 9)
  555. //join_B &= [1 4) [5 8)
  556. //sep_AB -> [1 3) [6 8)
  557. separate_interval_set<T> sep_ab_jn = split_ab_jn;
  558. sep_AB = split_A;
  559. join_B = split_B;
  560. sep_AB &= join_B;
  561. BOOST_CHECK_EQUAL( sep_AB.iterative_size(), 2 );
  562. BOOST_CHECK_EQUAL( sep_AB, sep_ab_jn );
  563. //--------------------------------------------------------------------------
  564. // separate_interval_set
  565. //--------------------------------------------------------------------------
  566. //join_A [0 3) [6 9)
  567. //join_B &= [1 4) [5 8)
  568. //join_AB -> [1 3) [6 8)
  569. join_ab = split_ab;
  570. BOOST_CHECK_EQUAL( join_ab.iterative_size(), 2 );
  571. join_AB = split_A;
  572. join_B = split_B;
  573. join_AB &= sep_B;
  574. BOOST_CHECK_EQUAL( join_AB.iterative_size(), 2 );
  575. BOOST_CHECK_EQUAL( join_AB, join_ab );
  576. //join_A [0 3) [6 9)
  577. //split_B &= [1 2)[2 4) [5 8)
  578. //join_AB -> [1 3) [6 8)
  579. join_AB = split_A;
  580. join_AB &= split_B;
  581. BOOST_CHECK_EQUAL( join_AB.iterative_size(), 2 );
  582. BOOST_CHECK_EQUAL( join_AB, join_ab );
  583. //join_A [0 3) [6 9)
  584. //sep_B &= [1 2)[2 4) [5 8)
  585. //join_AB -> [1 3) [6 8)
  586. join_AB = split_A;
  587. join_AB &= sep_B;
  588. BOOST_CHECK_EQUAL( join_AB.iterative_size(), 2 );
  589. BOOST_CHECK_EQUAL( join_AB, join_ab );
  590. }
  591. template <class T>
  592. void interval_set_mixed_disjoint_4_bicremental_types()
  593. {
  594. typedef interval_set<T> IntervalSetT;
  595. typedef typename IntervalSetT::interval_type IntervalT;
  596. T v0 = make<T>(0);
  597. T v2 = make<T>(2);
  598. T v3 = make<T>(3);
  599. T v4 = make<T>(4);
  600. T v6 = make<T>(6);
  601. IntervalT I0_2D = IntervalT::right_open(v0,v2);
  602. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  603. IntervalT I3_4D = IntervalT::right_open(v3,v4);
  604. IntervalT I4_4I = IntervalT::closed(v4,v4);
  605. IntervalT C4_6D = IntervalT::open(v4,v6);
  606. IntervalT I6_6I = IntervalT::closed(v6,v6);
  607. //--------------------------------------------------------------------------
  608. //split_A: [0 2) [4 4] [6 6]
  609. //split_B: [2 3)[3 4) (4 6)
  610. split_interval_set<T> split_A, split_B;
  611. split_A.add(I0_2D).add(I4_4I).add(I6_6I);
  612. split_B.add(I2_3D).add(I3_4D).add(C4_6D);
  613. separate_interval_set<T> sep_A(split_A), sep_B(split_B);
  614. interval_set<T> join_A(split_A), join_B(split_B);
  615. BOOST_CHECK_EQUAL( disjoint(split_A, split_B), true );
  616. BOOST_CHECK_EQUAL( disjoint(split_A, sep_B), true );
  617. BOOST_CHECK_EQUAL( disjoint(split_A, join_B), true );
  618. BOOST_CHECK_EQUAL( disjoint(sep_A, split_B), true );
  619. BOOST_CHECK_EQUAL( disjoint(sep_A, sep_B), true );
  620. BOOST_CHECK_EQUAL( disjoint(sep_A, join_B), true );
  621. BOOST_CHECK_EQUAL( disjoint(join_A, split_B), true );
  622. BOOST_CHECK_EQUAL( disjoint(join_A, sep_B), true );
  623. BOOST_CHECK_EQUAL( disjoint(join_A, join_B), true );
  624. }
  625. template <class T>
  626. void interval_set_mixed_infix_plus_overload_4_bicremental_types()
  627. {
  628. interval_set<T> join_a;
  629. separate_interval_set<T> sep_a;
  630. split_interval_set<T> split_a;
  631. join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
  632. sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
  633. split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  634. BOOST_CHECK_EQUAL(split_a + sep_a, sep_a + split_a );
  635. BOOST_CHECK_EQUAL(split_a + join_a, join_a + split_a);
  636. BOOST_CHECK_EQUAL(sep_a + join_a, join_a + sep_a );
  637. }
  638. template <class T> void interval_set_mixed_infix_pipe_overload_4_bicremental_types()
  639. {
  640. interval_set<T> join_a;
  641. separate_interval_set<T> sep_a;
  642. split_interval_set<T> split_a;
  643. join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
  644. sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
  645. split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  646. BOOST_CHECK_EQUAL(split_a | sep_a, sep_a | split_a );
  647. BOOST_CHECK_EQUAL(split_a | join_a, join_a | split_a);
  648. BOOST_CHECK_EQUAL(sep_a | join_a, join_a | sep_a );
  649. }
  650. template <class T>
  651. void interval_set_mixed_infix_minus_overload_4_bicremental_types()
  652. {
  653. interval_set<T> join_a, join_b;
  654. separate_interval_set<T> sep_a, sep_b;
  655. split_interval_set<T> split_a, split_b;
  656. join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
  657. sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
  658. split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  659. BOOST_CHECK_EQUAL(split_a - sep_a, (split_b = split_a) -= sep_a );
  660. BOOST_CHECK_EQUAL(split_a - join_a, (split_b = split_a) -= join_a );
  661. BOOST_CHECK_EQUAL(sep_a - join_a, (sep_b = sep_a) -= join_a );
  662. BOOST_CHECK_EQUAL(sep_a - split_a, (sep_b = sep_a) -= split_a);
  663. BOOST_CHECK_EQUAL(join_a - split_a, (join_b = join_a) -= split_a);
  664. BOOST_CHECK_EQUAL(join_a - sep_a, (join_b = join_a) -= sep_a );
  665. }
  666. template <class T> void interval_set_mixed_infix_et_overload_4_bicremental_types()
  667. {
  668. interval_set<T> join_a;
  669. separate_interval_set<T> sep_a;
  670. split_interval_set<T> split_a;
  671. join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
  672. sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
  673. split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  674. BOOST_CHECK_EQUAL(split_a & sep_a, sep_a & split_a );
  675. BOOST_CHECK_EQUAL(split_a & join_a, join_a & split_a);
  676. BOOST_CHECK_EQUAL(sep_a & join_a, join_a & sep_a );
  677. }
  678. template <class T> void interval_set_mixed_infix_caret_overload_4_bicremental_types()
  679. {
  680. interval_set<T> join_a;
  681. separate_interval_set<T> sep_a;
  682. split_interval_set<T> split_a;
  683. join_a.add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,9));
  684. sep_a .add(I_D(0,4)) .add(I_I(4,6)).add(I_D(5,11));
  685. split_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  686. BOOST_CHECK_EQUAL(split_a ^ sep_a, sep_a ^ split_a );
  687. BOOST_CHECK_EQUAL(split_a ^ join_a, join_a ^ split_a);
  688. BOOST_CHECK_EQUAL(sep_a ^ join_a, join_a ^ sep_a );
  689. }
  690. #endif // LIBS_ICL_TEST_TEST_INTERVAL_SET_MIXED_HPP_JOFA_090702