test_interval_set_shared.hpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  1. /*-----------------------------------------------------------------------------+
  2. Copyright (c) 2008-2010: 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_SHARED_HPP_JOFA_080920
  9. #define LIBS_ICL_TEST_TEST_INTERVAL_SET_SHARED_HPP_JOFA_080920
  10. #include <boost/range/algorithm.hpp>
  11. #include "portability.hpp"
  12. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  13. void interval_set_fundamentals_4_ordered_types()
  14. {
  15. typedef IntervalSet<T> IntervalSetT;
  16. typedef typename IntervalSetT::interval_type IntervalT;
  17. typedef typename IntervalSet<T>::size_type size_T;
  18. // ordered types is the largest set of instance types.
  19. // Because we can not generate values via incrementation for e.g. string,
  20. // we are able to test operations only for the most basic values
  21. // identity_element (0, empty, T() ...) and unit_element.
  22. T v0 = boost::icl::identity_element<T>::value();
  23. T v1 = unit_element<T>::value();
  24. IntervalT I0_0I(v0);
  25. IntervalT I1_1I(v1);
  26. IntervalT I0_1I(v0, v1, interval_bounds::closed());
  27. //-------------------------------------------------------------------------
  28. //empty set
  29. //-------------------------------------------------------------------------
  30. BOOST_CHECK_EQUAL(IntervalSet<T>().empty(), true);
  31. BOOST_CHECK_EQUAL(icl::is_empty(IntervalSet<T>()), true);
  32. BOOST_CHECK_EQUAL(cardinality(IntervalSet<T>()), boost::icl::identity_element<size_T>::value());
  33. BOOST_CHECK_EQUAL(IntervalSet<T>().size(), boost::icl::identity_element<size_T>::value());
  34. BOOST_CHECK_EQUAL(interval_count(IntervalSet<T>()), 0);
  35. BOOST_CHECK_EQUAL(IntervalSet<T>().iterative_size(), 0);
  36. BOOST_CHECK_EQUAL(iterative_size(IntervalSet<T>()), 0);
  37. BOOST_CHECK_EQUAL(IntervalSet<T>(), IntervalSet<T>());
  38. IntervalT mt_interval = boost::icl::identity_element<IntervalT>::value();
  39. BOOST_CHECK_EQUAL(mt_interval, IntervalT());
  40. IntervalSet<T> mt_set = boost::icl::identity_element<IntervalSet<T> >::value();
  41. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  42. //adding emptieness to emptieness yields emptieness ;)
  43. mt_set.add(mt_interval).add(mt_interval);
  44. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  45. mt_set.insert(mt_interval).insert(mt_interval);
  46. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  47. (mt_set += mt_interval) += mt_interval;
  48. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  49. BOOST_CHECK_EQUAL(hull(mt_set), boost::icl::identity_element<IntervalT >::value());
  50. //subtracting emptieness
  51. mt_set.subtract(mt_interval).subtract(mt_interval);
  52. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  53. mt_set.erase(mt_interval).erase(mt_interval);
  54. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  55. (mt_set -= mt_interval) -= mt_interval;
  56. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  57. //subtracting elements form emptieness
  58. mt_set.subtract(v0).subtract(v1);
  59. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  60. mt_set.erase(v0).erase(v1);
  61. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  62. (mt_set -= v1) -= v0;
  63. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  64. //subtracting intervals form emptieness
  65. mt_set.subtract(I0_1I).subtract(I1_1I);
  66. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  67. mt_set.erase(I0_1I).erase(I1_1I);
  68. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  69. (mt_set -= I1_1I) -= I0_1I;
  70. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  71. //insecting emptieness
  72. //mt_set.insect(mt_interval).insect(mt_interval);
  73. //BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  74. (mt_set &= mt_interval) &= mt_interval;
  75. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  76. //insecting emptieness with elements
  77. (mt_set &= v1) &= v0;
  78. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  79. //insecting emptieness with intervals
  80. (mt_set &= I1_1I) &= I0_1I;
  81. BOOST_CHECK_EQUAL(mt_set, IntervalSet<T>());
  82. //-------------------------------------------------------------------------
  83. //unary set
  84. //-------------------------------------------------------------------------
  85. IntervalSet<T> single_I0_0I_from_element(v0);
  86. IntervalSet<T> single_I0_0I_from_interval(I0_0I);
  87. IntervalSet<T> single_I0_0I(single_I0_0I_from_interval);
  88. BOOST_CHECK_EQUAL(single_I0_0I_from_element, single_I0_0I_from_interval);
  89. BOOST_CHECK_EQUAL(single_I0_0I_from_element, single_I0_0I);
  90. BOOST_CHECK_EQUAL(icl::hull(single_I0_0I).lower(), I0_0I.lower());
  91. BOOST_CHECK_EQUAL(icl::hull(single_I0_0I).upper(), I0_0I.upper());
  92. IntervalSet<T> single_I1_1I_from_element(v1);
  93. IntervalSet<T> single_I1_1I_from_interval(I1_1I);
  94. IntervalSet<T> single_I1_1I(single_I1_1I_from_interval);
  95. BOOST_CHECK_EQUAL(single_I1_1I_from_element, single_I1_1I_from_interval);
  96. BOOST_CHECK_EQUAL(single_I1_1I_from_element, single_I1_1I);
  97. IntervalSet<T> single_I0_1I_from_interval(I0_1I);
  98. IntervalSet<T> single_I0_1I(single_I0_1I_from_interval);
  99. BOOST_CHECK_EQUAL(single_I0_1I_from_interval, single_I0_1I);
  100. BOOST_CHECK_EQUAL(hull(single_I0_1I), I0_1I);
  101. BOOST_CHECK_EQUAL(hull(single_I0_1I).lower(), I0_1I.lower());
  102. BOOST_CHECK_EQUAL(hull(single_I0_1I).upper(), I0_1I.upper());
  103. //contains predicate
  104. BOOST_CHECK_EQUAL(icl::contains(single_I0_0I, v0), true);
  105. BOOST_CHECK_EQUAL(icl::contains(single_I0_0I, I0_0I), true);
  106. BOOST_CHECK_EQUAL(icl::contains(single_I1_1I, v1), true);
  107. BOOST_CHECK_EQUAL(icl::contains(single_I1_1I, I1_1I), true);
  108. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, v0), true);
  109. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, I0_1I), true);
  110. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, v1), true);
  111. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, I1_1I), true);
  112. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, single_I0_0I), true);
  113. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, single_I1_1I), true);
  114. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I, single_I0_1I), true);
  115. BOOST_CHECK_EQUAL(cardinality(single_I0_0I), unit_element<size_T>::value());
  116. BOOST_CHECK_EQUAL(single_I0_0I.size(), unit_element<size_T>::value());
  117. BOOST_CHECK_EQUAL(interval_count(single_I0_0I), 1);
  118. BOOST_CHECK_EQUAL(single_I0_0I.iterative_size(), 1);
  119. BOOST_CHECK_EQUAL(iterative_size(single_I0_0I), 1);
  120. }
  121. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  122. void interval_set_ctor_4_bicremental_types()
  123. {
  124. typedef IntervalSet<T> IntervalSetT;
  125. typedef typename IntervalSetT::interval_type IntervalT;
  126. T v4 = make<T>(4);
  127. IntervalT I4_4I(v4);
  128. IntervalSet<T> _I4_4I;
  129. BOOST_CHECK_EQUAL( _I4_4I.empty(), true );
  130. IntervalSet<T> _I4_4I_1;
  131. IntervalSet<T> _I4_4I_2;
  132. IntervalSet<T> _I4_4I_3;
  133. _I4_4I += v4;
  134. _I4_4I_1 += I4_4I;
  135. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_1 );
  136. _I4_4I_2.add(v4);
  137. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_2 );
  138. _I4_4I_3.add(I4_4I);
  139. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_3 );
  140. _I4_4I_1.add(v4).add(I4_4I);
  141. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_1 );
  142. _I4_4I_1.insert(v4).insert(I4_4I);
  143. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_1 );
  144. (_I4_4I_1 += v4) += I4_4I;
  145. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_1 );
  146. BOOST_CHECK_EQUAL( cardinality(_I4_4I), unit_element<typename IntervalSet<T>::size_type>::value() );
  147. BOOST_CHECK_EQUAL( _I4_4I.size(), unit_element<typename IntervalSet<T>::size_type>::value() );
  148. BOOST_CHECK_EQUAL( interval_count(_I4_4I), 1 );
  149. BOOST_CHECK_EQUAL( _I4_4I.iterative_size(), 1 );
  150. BOOST_CHECK_EQUAL( iterative_size(_I4_4I), 1 );
  151. BOOST_CHECK_EQUAL( hull(_I4_4I).lower(), v4 );
  152. BOOST_CHECK_EQUAL( hull(_I4_4I).upper(), v4 );
  153. IntervalSet<T> _I4_4I_copy(_I4_4I);
  154. IntervalSet<T> _I4_4I_assigned;
  155. _I4_4I_assigned = _I4_4I;
  156. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_copy );
  157. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_assigned );
  158. _I4_4I_assigned.clear();
  159. BOOST_CHECK_EQUAL( true, _I4_4I_assigned.empty() );
  160. _I4_4I_assigned.swap(_I4_4I_copy);
  161. BOOST_CHECK_EQUAL( true, _I4_4I_copy.empty() );
  162. BOOST_CHECK_EQUAL( _I4_4I, _I4_4I_assigned );
  163. }
  164. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  165. void interval_set_add_sub_4_bicremental_types()
  166. {
  167. typedef IntervalSet<T> IntervalSetT;
  168. typedef typename IntervalSetT::interval_type IntervalT;
  169. T v0 = make<T>(0);
  170. T v5 = make<T>(5);
  171. T v6 = make<T>(6);
  172. T v9 = make<T>(9);
  173. IntervalT I5_6I(v5,v6,interval_bounds::closed());
  174. IntervalT I5_9I(v5,v9,interval_bounds::closed());
  175. IntervalT I0_9I = IntervalT::closed(v0, v9);
  176. BOOST_CHECK_EQUAL( IntervalSet<T>(I5_6I).add(v0).add(v9),
  177. IntervalSet<T>().insert(v9).insert(I5_6I).insert(v0) );
  178. IntervalSet<T> set_A = IntervalSet<T>(I5_6I).add(v0).add(v9);
  179. IntervalSet<T> set_B = IntervalSet<T>().insert(v9).insert(I5_6I).insert(v0);
  180. BOOST_CHECK_EQUAL( set_A, set_B );
  181. BOOST_CHECK_EQUAL( hull(set_A), I0_9I );
  182. BOOST_CHECK_EQUAL( hull(set_A).lower(), I0_9I.lower() );
  183. BOOST_CHECK_EQUAL( hull(set_A).upper(), I0_9I.upper() );
  184. IntervalSet<T> set_A1 = set_A, set_B1 = set_B,
  185. set_A2 = set_A, set_B2 = set_B;
  186. set_A1.subtract(I5_6I).subtract(v9);
  187. set_B1.erase(v9).erase(I5_6I);
  188. BOOST_CHECK_EQUAL( set_A1, set_B1 );
  189. set_A2.subtract(I5_9I);
  190. set_B2.erase(I5_9I);
  191. BOOST_CHECK_EQUAL( set_A1, set_B1 );
  192. BOOST_CHECK_EQUAL( set_A1, set_A2 );
  193. BOOST_CHECK_EQUAL( set_B1, set_B2 );
  194. }
  195. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  196. void interval_set_distinct_4_bicremental_types()
  197. {
  198. typedef typename IntervalSet<T>::size_type size_T;
  199. T v1 = make<T>(1);
  200. T v3 = make<T>(3);
  201. T v5 = make<T>(5);
  202. size_T s3 = make<size_T>(3);
  203. IntervalSet<T> is_1_3_5;
  204. is_1_3_5.add(v1).add(v3).add(v5);
  205. BOOST_CHECK_EQUAL( cardinality(is_1_3_5), s3 );
  206. BOOST_CHECK_EQUAL( is_1_3_5.size(), s3 );
  207. BOOST_CHECK_EQUAL( interval_count(is_1_3_5), 3 );
  208. BOOST_CHECK_EQUAL( iterative_size(is_1_3_5), 3 );
  209. BOOST_CHECK_EQUAL( is_1_3_5.iterative_size(), 3 );
  210. }
  211. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  212. void interval_set_distinct_4_bicremental_continuous_types()
  213. {
  214. typedef IntervalSet<T> IntervalSetT;
  215. typedef typename IntervalSetT::interval_type IntervalT;
  216. typedef typename IntervalSet<T>::size_type size_T;
  217. typedef typename IntervalSet<T>::difference_type diff_T;
  218. T v1 = make<T>(1);
  219. T v3 = make<T>(3);
  220. T v5 = make<T>(5);
  221. size_T s3 = make<size_T>(3);
  222. diff_T d0 = make<diff_T>(0);
  223. diff_T d2 = make<diff_T>(2);
  224. IntervalSet<T> is_1_3_5;
  225. is_1_3_5.add(v1).add(v3).add(v5);
  226. BOOST_CHECK_EQUAL( cardinality(is_1_3_5), s3 );
  227. BOOST_CHECK_EQUAL( is_1_3_5.size(), s3 );
  228. BOOST_CHECK_EQUAL( icl::length(is_1_3_5), d0 );
  229. BOOST_CHECK_EQUAL( interval_count(is_1_3_5), 3 );
  230. BOOST_CHECK_EQUAL( is_1_3_5.iterative_size(), 3 );
  231. BOOST_CHECK_EQUAL( iterative_size(is_1_3_5), 3 );
  232. IntervalSet<T> is_123_5;
  233. is_123_5 = is_1_3_5;
  234. is_123_5 += IntervalT::open(v1,v3);
  235. BOOST_CHECK_EQUAL( cardinality(is_123_5), icl::infinity<size_T>::value() );
  236. BOOST_CHECK_EQUAL( is_123_5.size(), icl::infinity<size_T>::value() );
  237. BOOST_CHECK_EQUAL( icl::length(is_123_5), d2 );
  238. }
  239. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  240. void interval_set_isolate_4_bicremental_continuous_types()
  241. {
  242. typedef IntervalSet<T> IntervalSetT;
  243. typedef typename IntervalSetT::interval_type IntervalT;
  244. typedef typename IntervalSet<T>::size_type size_T;
  245. T v0 = make<T>(0);
  246. T v2 = make<T>(2);
  247. T v4 = make<T>(4);
  248. IntervalT I0_4I = IntervalT::closed(v0,v4);
  249. IntervalT C0_2D = IntervalT::open(v0,v2);
  250. IntervalT C2_4D = IntervalT::open(v2,v4);
  251. // {[0 4]}
  252. // - { (0,2) (2,4) }
  253. // = {[0] [2] [4]}
  254. IntervalSet<T> iso_set = IntervalSet<T>(I0_4I);
  255. IntervalSet<T> gap_set;
  256. gap_set.add(C0_2D).add(C2_4D);
  257. BOOST_CHECK_EQUAL( true, true );
  258. iso_set -= gap_set;
  259. BOOST_CHECK_EQUAL( cardinality(iso_set), static_cast<size_T>(3) );
  260. BOOST_CHECK_EQUAL( iso_set.iterative_size(), static_cast<std::size_t>(3) );
  261. BOOST_CHECK_EQUAL( iterative_size(iso_set), static_cast<std::size_t>(3) );
  262. IntervalSet<T> iso_set2;
  263. iso_set2.add(I0_4I);
  264. iso_set2.subtract(C0_2D).subtract(C2_4D);
  265. IntervalSet<T> iso_set3(I0_4I);
  266. (iso_set3 -= C0_2D) -= C2_4D;
  267. IntervalSet<T> iso_set4;
  268. iso_set4.insert(I0_4I);
  269. iso_set4.erase(C0_2D).erase(C2_4D);
  270. BOOST_CHECK_EQUAL( iso_set, iso_set2 );
  271. BOOST_CHECK_EQUAL( iso_set, iso_set3 );
  272. BOOST_CHECK_EQUAL( iso_set, iso_set4 );
  273. }
  274. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  275. void interval_set_element_compare_4_bicremental_types()
  276. {
  277. typedef IntervalSet<T> ISet;
  278. BOOST_CHECK_EQUAL( is_element_equal( ISet(), ISet()), true );
  279. BOOST_CHECK_EQUAL( is_element_equal( ISet(), ISet(I_D(0,1))), false );
  280. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,1)), ISet()), false );
  281. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,1)), ISet(I_D(0,1))), true );
  282. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,5)), ISet(I_D(3,8))), false );
  283. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(3,8)), ISet(I_D(0,5))), false );
  284. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,1)), ISet(I_D(0,1)) ), true );
  285. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,1)), ISet(I_D(0,1))+I_D(1,2) ), false );
  286. BOOST_CHECK_EQUAL( is_element_equal( I_D(1,2)+ISet(I_D(0,1)), ISet(I_D(0,1)) ), false );
  287. BOOST_CHECK_EQUAL( is_element_equal( I_D(1,2)+ISet(I_D(0,1)), ISet(I_D(0,1))+I_D(1,2) ), true );
  288. //[0 1)[1 2)
  289. //[0 2)
  290. BOOST_CHECK_EQUAL( is_element_equal( I_D(0,1)+ISet(I_D(1,2)), ISet(I_D(0,2)) ), true );
  291. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,2)), ISet(I_D(0,1))+I_D(1,2) ), true );
  292. //[0 1) [2 3)
  293. //[0 3)
  294. BOOST_CHECK_EQUAL( is_element_equal( I_D(0,1)+ISet(I_D(2,3)), ISet(I_D(0,3)) ), false );
  295. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(0,3)), ISet(I_D(0,1))+I_D(2,3) ), false );
  296. //[0 2)[2 4)
  297. // [1 4)
  298. BOOST_CHECK_EQUAL( is_element_equal( I_D(0,2)+ISet(I_D(2,4)), ISet(I_D(1,4)) ), false );
  299. BOOST_CHECK_EQUAL( is_element_equal( ISet(I_D(1,4)), ISet(I_D(0,2))+I_D(2,4) ), false );
  300. //[0 2)[2 4)
  301. //[0 1)[1 3)[3 4)
  302. BOOST_CHECK_EQUAL( is_element_equal( I_D(0,2)+ISet(I_D(2,4)), I_D(0,1)+ISet(I_D(1,4))+I_D(3,4) ), true );
  303. BOOST_CHECK_EQUAL( is_element_equal( I_D(0,1)+ISet(I_D(1,4))+I_D(3,4), I_D(0,2)+ISet(I_D(2,4)) ), true );
  304. }
  305. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  306. void interval_set_contains_4_bicremental_types()
  307. {
  308. typedef IntervalSet<T> IntervalSetT;
  309. typedef typename IntervalSetT::interval_type IntervalT;
  310. //LAW: x.add(e).contains(e);
  311. //LAW: z = x + y => contains(z, x) && contains(z, y);
  312. T v1 = make<T>(1);
  313. T v3 = make<T>(3);
  314. T v5 = make<T>(5);
  315. T v7 = make<T>(7);
  316. T v8 = make<T>(8);
  317. T v9 = make<T>(9);
  318. T v11 = make<T>(11);
  319. IntervalSet<T> is(v1);
  320. BOOST_CHECK_EQUAL( icl::contains(is, v1), true );
  321. BOOST_CHECK_EQUAL( icl::contains(IntervalSet<T>().add(make<T>(2)), make<T>(2)), true );
  322. BOOST_CHECK_EQUAL( icl::contains(IntervalSet<T>().insert(make<T>(2)), make<T>(2)), true );
  323. BOOST_CHECK_EQUAL( icl::contains((is += IntervalT(v3,v7)), IntervalT(v3,v7)), true );
  324. IntervalSet<T> is0 = is;
  325. IntervalSet<T> is2(IntervalT::closed(v5,v8));
  326. is2.add(v9).add(v11);
  327. is += is2;
  328. BOOST_CHECK_EQUAL( contains(is, is2), true );
  329. is = is0;
  330. IntervalSet<T> is3(IntervalT::closed(v5,v8));
  331. is3.insert(v9).insert(v11);
  332. is += is3;
  333. BOOST_CHECK_EQUAL( contains(is, is3), true );
  334. }
  335. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  336. void interval_set_operators_4_bicremental_types()
  337. {
  338. typedef IntervalSet<T> IntervalSetT;
  339. typedef typename IntervalSetT::interval_type IntervalT;
  340. T v0 = make<T>(0);
  341. T v1 = make<T>(1);
  342. T v3 = make<T>(3);
  343. T v5 = make<T>(5);
  344. T v7 = make<T>(7);
  345. T v8 = make<T>(8);
  346. IntervalSet<T> left, left2, right, all, all2, section, complement, naught;
  347. left.add(IntervalT::closed(v0,v1)).add(IntervalT::closed(v3,v5));
  348. (right += IntervalT::closed(v3,v5)) += IntervalT::closed(v7,v8);
  349. BOOST_CHECK_EQUAL( disjoint(left, right), false );
  350. (all += left) += right;
  351. (section += left) &= right;
  352. (complement += all) -= section;
  353. (all2 += section) += complement;
  354. BOOST_CHECK_EQUAL( disjoint(section, complement), true );
  355. BOOST_CHECK_EQUAL( all, all2 );
  356. BOOST_CHECK_EQUAL( icl::contains(all, left), true );
  357. BOOST_CHECK_EQUAL( icl::contains(all, right), true );
  358. BOOST_CHECK_EQUAL( icl::contains(all, complement), true );
  359. BOOST_CHECK_EQUAL( icl::contains(left, section), true );
  360. BOOST_CHECK_EQUAL( icl::contains(right, section), true );
  361. BOOST_CHECK_EQUAL( within(left, all), true );
  362. BOOST_CHECK_EQUAL( within(right, all), true );
  363. BOOST_CHECK_EQUAL( within(complement, all), true );
  364. BOOST_CHECK_EQUAL( within(section, left), true );
  365. BOOST_CHECK_EQUAL( within(section, right), true );
  366. }
  367. // Test for nontrivial intersection of interval sets with intervals and values
  368. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  369. void interval_set_base_intersect_4_bicremental_types()
  370. {
  371. typedef IntervalSet<T> IntervalSetT;
  372. typedef typename IntervalSetT::interval_type IntervalT;
  373. T v0 = make<T>(0);
  374. T v1 = make<T>(1);
  375. T v2 = make<T>(2);
  376. T v3 = make<T>(3);
  377. T v6 = make<T>(6);
  378. T v7 = make<T>(7);
  379. T v8 = make<T>(8);
  380. T v9 = make<T>(9);
  381. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  382. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  383. IntervalT I1_8D = IntervalT::right_open(v1,v8);
  384. IntervalT I2_7D = IntervalT::right_open(v2,v7);
  385. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  386. IntervalT I6_7D = IntervalT::right_open(v6,v7);
  387. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  388. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  389. //--------------------------------------------------------------------------
  390. // IntervalSet
  391. //--------------------------------------------------------------------------
  392. //split_A [0 3) [6 9)
  393. // &= [1 8)
  394. //split_AB -> [1 3) [6 8)
  395. // &= [2 7)
  396. // -> [2 3) [6 7)
  397. IntervalSet<T> split_A, split_B, split_AB, split_ab, split_ab2;
  398. split_A.add(I0_3D).add(I6_9D);
  399. split_AB = split_A;
  400. split_AB &= I1_8D;
  401. split_ab.add(I1_3D).add(I6_8D);
  402. BOOST_CHECK_EQUAL( split_AB, split_ab );
  403. split_AB = split_A;
  404. (split_AB &= I1_8D) &= I2_7D;
  405. split_ab2.add(I2_3D).add(I6_7D);
  406. BOOST_CHECK_EQUAL( split_AB, split_ab2 );
  407. //--------------------------------------------------------------------------
  408. //split_A [0 3) [6 9)
  409. // &= 1
  410. //split_AB -> [1]
  411. // += (1 7)
  412. // -> [1](1 7)
  413. split_A.add(I0_3D).add(I6_9D);
  414. split_AB = split_A;
  415. split_AB &= v1;
  416. split_ab.clear();
  417. split_ab.add(v1);
  418. BOOST_CHECK_EQUAL( split_AB, split_ab );
  419. split_AB = split_A;
  420. (split_AB &= v1) += IntervalT::open(v1,v7);
  421. split_ab2.clear();
  422. split_ab2 += IntervalT::right_open(v1,v7);
  423. BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
  424. }
  425. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  426. void interval_set_flip_4_bicremental_types()
  427. {
  428. typedef IntervalSet<T> IntervalSetT;
  429. typedef IntervalSetT ISet;
  430. IntervalSetT set_a, set_b, lhs, rhs;
  431. //[0 2)
  432. // [1 3)
  433. //[0 1) [2 3) : {[0 2)} ^= [2 3)
  434. //gcc seed ambiguities with std::_Ios_Iostate& std::operator^= here:
  435. // BOOST_CHECK_EQUAL(ISet(I_D(0,2)) ^= I_D(1,3), ISet(I_D(0,1)) + I_D(2,3));
  436. set_a = ISet(I_D(0,2));
  437. BOOST_CHECK_EQUAL(set_a ^= I_D(1,3), ISet(I_D(0,1)) + I_D(2,3));
  438. // [1 3)
  439. //[0 2)
  440. //[0 1) [2 3) : {[1 3)} ^= [0 2)
  441. set_a = ISet(I_D(1,3));
  442. BOOST_CHECK_EQUAL(set_a ^= I_D(0,2), ISet(I_D(0,1)) + I_D(2,3));
  443. //[0 2) (3 5]
  444. // [1 3)
  445. //[0 1) [2 3) (3 5] : a ^= b
  446. set_a.clear();
  447. set_a.add(I_D(0,2)).add(C_I(3,5));
  448. set_b.add(I_D(1,3));
  449. lhs = set_a;
  450. lhs ^= set_b;
  451. rhs.add(I_D(0,1)).add(I_D(2,3)).add(C_I(3,5));
  452. BOOST_CHECK_EQUAL(lhs, rhs);
  453. }
  454. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  455. void interval_set_infix_plus_overload_4_bicremental_types()
  456. {
  457. typedef IntervalSet<T> IntervalSetT;
  458. typedef typename IntervalSetT::interval_type IntervalT;
  459. IntervalT itv = I_D(3,5);
  460. IntervalSetT set_a, set_b;
  461. set_a.add(C_D(1,3)).add(I_D(8,9)).add(I_I(6,11));
  462. set_b.add(I_D(0,9)).add(I_I(3,6)).add(I_D(5,7));
  463. BOOST_CHECK_EQUAL(set_a + set_b, set_b + set_a);
  464. // This checks all cases of is_interval_set_derivative<T>
  465. BOOST_CHECK_EQUAL(set_a + itv, itv + set_a);
  466. BOOST_CHECK_EQUAL(set_b + MK_v(4), MK_v(4) + set_b);
  467. }
  468. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  469. void interval_set_infix_pipe_overload_4_bicremental_types()
  470. {
  471. typedef IntervalSet<T> IntervalSetT;
  472. typedef typename IntervalSetT::interval_type IntervalT;
  473. IntervalT itv = I_D(3,5);
  474. IntervalSetT set_a, set_b;
  475. set_a.add(C_D(1,3)).add(I_D(8,9)).add(I_I(6,11));
  476. set_b.add(I_D(0,9)).add(I_I(3,6)).add(I_D(5,7));
  477. BOOST_CHECK_EQUAL(set_a | set_b, set_b | set_a);
  478. //This checks all cases of is_interval_set_derivative<T>
  479. BOOST_CHECK_EQUAL(set_a | itv, itv | set_a);
  480. BOOST_CHECK_EQUAL(set_b | MK_v(4), MK_v(4) | set_b);
  481. }
  482. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  483. void interval_set_infix_minus_overload_4_bicremental_types()
  484. {
  485. typedef IntervalSet<T> IntervalSetT;
  486. typedef typename IntervalSetT::interval_type IntervalT;
  487. IntervalT itv = I_D(3,5);
  488. IntervalSetT set_a, set_b;
  489. set_a.add(C_D(1,3)).add(I_D(8,9)).add(I_I(6,11));
  490. set_b.add(I_D(0,9)).add(I_I(3,6)).add(I_D(5,7));
  491. BOOST_CHECK_EQUAL(set_a - set_b, (set_b + set_a) - set_b);
  492. //This checks all cases of is_interval_set_derivative<T>
  493. BOOST_CHECK_EQUAL(set_a - itv, (itv + set_a) - itv);
  494. BOOST_CHECK_EQUAL(set_b - MK_v(4), (MK_v(4) + set_b) - MK_v(4));
  495. }
  496. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  497. void interval_set_infix_et_overload_4_bicremental_types()
  498. {
  499. typedef IntervalSet<T> IntervalSetT;
  500. typedef typename IntervalSetT::interval_type IntervalT;
  501. IntervalT itv = I_D(3,5);
  502. IntervalSetT set_a, set_b;
  503. set_a.add(C_D(1,3)).add(I_D(8,9)).add(I_I(6,11));
  504. set_b.add(I_D(0,9)).add(I_I(3,6)).add(I_D(5,7));
  505. BOOST_CHECK_EQUAL(set_a & set_b, set_b & set_a);
  506. //This checks all cases of is_interval_set_derivative<T>
  507. BOOST_CHECK_EQUAL(set_a & itv, itv & set_a);
  508. BOOST_CHECK_EQUAL(set_b & MK_v(4), MK_v(4) & set_b);
  509. }
  510. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  511. void interval_set_infix_caret_overload_4_bicremental_types()
  512. {
  513. typedef IntervalSet<T> IntervalSetT;
  514. typedef typename IntervalSetT::interval_type IntervalT;
  515. IntervalT itv = I_D(3,5);
  516. IntervalSetT set_a, set_b;
  517. set_a.add(C_D(1,3)).add(I_D(8,9)).add(I_I(6,11));
  518. set_b.add(I_D(0,9)).add(I_I(3,6)).add(I_D(5,7));
  519. BOOST_CHECK_EQUAL(set_a ^ set_b, set_b ^ set_a);
  520. //This checks all cases of is_interval_set_derivative<T>
  521. BOOST_CHECK_EQUAL(set_a ^ itv, itv ^ set_a);
  522. BOOST_CHECK_EQUAL(set_b ^ MK_v(4), MK_v(4) ^ set_b);
  523. }
  524. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  525. void interval_set_find_4_bicremental_types()
  526. {
  527. typedef IntervalSet<T> IntervalSetT;
  528. typedef typename IntervalSetT::const_iterator c_iterator;
  529. IntervalSetT set_a;
  530. set_a.add(C_D(1,3)).add(I_I(6,11));
  531. typename IntervalSetT::const_iterator found = set_a.find(MK_v(6));
  532. BOOST_CHECK_EQUAL( *found, I_I(6,11) );
  533. found = set_a.find(MK_v(5));
  534. BOOST_CHECK_EQUAL( found == set_a.end(), true );
  535. c_iterator found1 = set_a.find(MK_v(6));
  536. c_iterator found2 = icl::find(set_a, MK_v(6));
  537. BOOST_CHECK ( found1 == found2 );
  538. BOOST_CHECK_EQUAL( *found1, *found2 );
  539. BOOST_CHECK_EQUAL( *found1, I_I(6,11) );
  540. found1 = set_a.find(MK_v(5));
  541. BOOST_CHECK_EQUAL( found1 == set_a.end(), true );
  542. //LAW map c; key k: k in dom(c) => contains(c, *find(c, k))
  543. BOOST_CHECK( icl::contains(set_a, *icl::find(set_a, MK_v(2))) );
  544. BOOST_CHECK( icl::contains(set_a, *set_a.find(MK_v(11))) );
  545. BOOST_CHECK( icl::contains(set_a, MK_v(2)) );
  546. BOOST_CHECK( icl::contains(set_a, MK_v(10)) );
  547. BOOST_CHECK( !icl::contains(set_a, MK_v(1)) );
  548. BOOST_CHECK( !icl::contains(set_a, MK_v(3)) );
  549. BOOST_CHECK( icl::intersects(set_a, MK_v(2)) );
  550. BOOST_CHECK( icl::intersects(set_a, MK_v(10)) );
  551. BOOST_CHECK( !icl::intersects(set_a, MK_v(1)) );
  552. BOOST_CHECK( !icl::intersects(set_a, MK_v(3)) );
  553. }
  554. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  555. void interval_set_intersects_4_bicremental_types()
  556. {
  557. typedef IntervalSet<T> IntervalSetT;
  558. typedef typename IntervalSetT::interval_type IntervalT;
  559. IntervalT between = I_D(3,5);
  560. IntervalSetT set_a;
  561. set_a.add(C_D(1,3)).add(I_I(6,11));
  562. // (1 3) [6 11]
  563. BOOST_CHECK( icl::intersects(set_a, MK_v(2)) );
  564. BOOST_CHECK( icl::intersects(set_a, MK_v(11)) );
  565. BOOST_CHECK( icl::disjoint(set_a, MK_v(3)) );
  566. BOOST_CHECK( icl::disjoint(set_a, MK_v(5)) );
  567. BOOST_CHECK( icl::intersects(set_a, C_D(1,3)) );
  568. BOOST_CHECK( icl::intersects(set_a, I_D(8,10)) );
  569. BOOST_CHECK( icl::disjoint(set_a, between) );
  570. BOOST_CHECK( icl::disjoint(set_a, I_I(0,1)) );
  571. IntervalSetT to_12 = IntervalSetT(I_D(0, 13));
  572. IntervalSetT complement_a = to_12 - set_a;
  573. BOOST_CHECK( icl::disjoint(set_a, complement_a) );
  574. BOOST_CHECK( icl::intersects(to_12, set_a) );
  575. BOOST_CHECK_EQUAL( icl::lower(set_a), icl::lower(*(set_a.begin())) );
  576. BOOST_CHECK_EQUAL( icl::lower(set_a), MK_v(1) );
  577. BOOST_CHECK_EQUAL( icl::upper(set_a), icl::upper(*(set_a.rbegin())) );
  578. BOOST_CHECK_EQUAL( icl::upper(set_a), MK_v(11) );
  579. }
  580. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  581. void interval_set_range_4_discrete_types()
  582. {
  583. typedef IntervalSet<T> IntervalSetT;
  584. IntervalSetT set_a;
  585. set_a.add(C_D(1,3)).add(I_I(6,11));
  586. // (1 3) [6 11]
  587. BOOST_CHECK_EQUAL( icl::first(set_a), icl::first(*(set_a.begin())) );
  588. BOOST_CHECK_EQUAL( icl::first(set_a), MK_v(2) );
  589. BOOST_CHECK_EQUAL( icl::last(set_a), icl::last(*(set_a.rbegin())) );
  590. BOOST_CHECK_EQUAL( icl::last(set_a), MK_v(11) );
  591. }
  592. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  593. void interval_bitset_find_4_integral_types()
  594. {
  595. typedef IntervalSet<T> IntervalSetT;
  596. typedef typename IntervalSetT::interval_type IntervalT;
  597. IntervalT itv = I_D(3,5);
  598. IntervalSetT set_a;
  599. set_a.add(C_D(1,3)).add(I_I(6,11));
  600. typename IntervalSetT::const_iterator found = set_a.find(MK_v(6));
  601. BOOST_CHECK( (found->second).contains(6) );
  602. found = set_a.find(MK_v(5));
  603. BOOST_CHECK( found == set_a.end() );
  604. set_a.add(MK_v(64));
  605. found = set_a.find(MK_v(64));
  606. BOOST_CHECK( (found->second).contains(0) );
  607. set_a.add(MK_v(65));
  608. found = set_a.find(MK_v(65));
  609. BOOST_CHECK( (found->second).contains(1) );
  610. found = set_a.find(MK_v(66));
  611. BOOST_CHECK( found == set_a.end() );
  612. }
  613. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  614. void interval_set_element_iter_4_discrete_types()
  615. {
  616. typedef IntervalSet<T> IntervalSetT;
  617. typedef std::vector<T> VectorT;
  618. IntervalSetT set_a;
  619. set_a.add(I_I(1,3)).add(I_I(6,7));
  620. VectorT vec(5), cev(5);
  621. vec[0]=MK_v(1);vec[1]=MK_v(2);vec[2]=MK_v(3);vec[3]=MK_v(6);vec[4]=MK_v(7);
  622. cev[0]=MK_v(7);cev[1]=MK_v(6);cev[2]=MK_v(3);cev[3]=MK_v(2);cev[4]=MK_v(1);
  623. VectorT dest;
  624. // element iteration -----------------------------------------------------
  625. std::copy(elements_begin(set_a), elements_end(set_a), std::back_inserter(dest));
  626. BOOST_CHECK_EQUAL( vec == dest, true );
  627. dest.clear();
  628. std::copy(elements_rbegin(set_a), elements_rend(set_a), std::back_inserter(dest));
  629. BOOST_CHECK_EQUAL( cev == dest, true );
  630. dest.clear();
  631. std::reverse_copy(elements_begin(set_a), elements_end(set_a), std::back_inserter(dest));
  632. BOOST_CHECK_EQUAL( cev == dest, true );
  633. dest.clear();
  634. std::reverse_copy(elements_rbegin(set_a), elements_rend(set_a), std::back_inserter(dest));
  635. BOOST_CHECK_EQUAL( vec == dest, true );
  636. // range based element iteration -----------------------------------------
  637. dest.clear();
  638. boost::copy(elements(set_a), std::back_inserter(dest));
  639. BOOST_CHECK( vec == dest );
  640. dest.clear();
  641. boost::reverse_copy(elements(set_a), std::back_inserter(dest));
  642. BOOST_CHECK( cev == dest );
  643. }
  644. template <ICL_IntervalSet_TEMPLATE(_T) IntervalSet, class T>
  645. void interval_set_move_4_discrete_types()
  646. {
  647. typedef IntervalSet<T> IntervalSetT;
  648. //JODO static_cast fails for gcc compilers
  649. //IntervalSetT set_A(boost::move(static_cast<IntervalSetT&>(IntervalSetT(I_D(0,4)))));
  650. IntervalSetT set_A(boost::move(static_cast<IntervalSetT&>(IntervalSetT(I_D(0,4)).add(I_D(0,0)) )));
  651. IntervalSetT set_B(boost::move(static_cast<IntervalSetT&>(IntervalSetT(I_D(0,2)).add(I_D(2,4)).add(I_D(0,4)))));
  652. BOOST_CHECK( icl::is_element_equal(set_A, set_B) );
  653. BOOST_CHECK_EQUAL( set_A, join(set_B) );
  654. //JODO static_cast fails for gcc compilers
  655. //set_A = boost::move(static_cast<IntervalSetT&>(IntervalSetT(I_I(1,4))));
  656. set_A = boost::move(static_cast<IntervalSetT&>(IntervalSetT(I_I(1,4)).add(I_D(0,0))));
  657. set_B = boost::move(static_cast<IntervalSetT&>(IntervalSetT(C_I(0,2)).insert(I_D(3,5)).add(C_D(0,5))));
  658. BOOST_CHECK( icl::is_element_equal(set_A, set_B) );
  659. BOOST_CHECK_EQUAL( set_A, join(set_B) );
  660. }
  661. #endif // LIBS_ICL_TEST_TEST_INTERVAL_SET_SHARED_HPP_JOFA_080920