test_interval_map_mixed.hpp 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560
  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_ICL_interval_map_mixed_hpp_JOFA_081005__
  9. #define LIBS_ICL_TEST_TEST_ICL_interval_map_mixed_hpp_JOFA_081005__
  10. //------------------------------------------------------------------------------
  11. //- part1: Basic operations and predicates
  12. //------------------------------------------------------------------------------
  13. template <class T, class U>
  14. void interval_map_mixed_ctor_4_ordered_types()
  15. {
  16. typedef interval_map<T,U> IntervalMapT;
  17. typedef split_interval_map<T,U> SplitIntervalMapT;
  18. T v0 = boost::icl::identity_element<T>::value();
  19. U u1 = unit_element<U>::value();
  20. SplitIntervalMapT split_map(mapping_pair<T,U>(v0,u1));
  21. //JODO: clang err: ctor ambiguous. Should compile
  22. //JODO CLANG SplitIntervalMapT split_map(make_pair(v0,u1));
  23. IntervalMapT join_map(split_map);
  24. BOOST_CHECK_EQUAL( hull(split_map).lower(), hull(join_map).lower() );
  25. BOOST_CHECK_EQUAL( hull(split_map).upper(), hull(join_map).upper() );
  26. }
  27. template <class T, class U>
  28. void interval_map_mixed_equal_4_ordered_types()
  29. {
  30. typedef interval_map<T,U> IntervalMapT;
  31. typedef split_interval_map<T,U> SplitIntervalMapT;
  32. T v0 = boost::icl::identity_element<T>::value();
  33. U u1 = unit_element<U>::value();
  34. SplitIntervalMapT split_empty, split_single(mapping_pair<T,U>(v0,u1));
  35. IntervalMapT join_empty, join_single(mapping_pair<T,U>(v0,u1));
  36. //JODO CLANG SplitIntervalMapT split_empty, split_single(make_pair(v0,u1));
  37. //JODO CLANG IntervalMapT join_empty, join_single(make_pair(v0,u1));
  38. // mixed ==-equality is a strange thing. Most times is does not
  39. // make sense. It is better to allow only for same type == equality.
  40. BOOST_CHECK_EQUAL( split_empty == split_empty, true );
  41. BOOST_CHECK_EQUAL( join_empty == join_empty, true );
  42. // There were Problems with operator== and emtpy sets.
  43. BOOST_CHECK_EQUAL( split_empty == split_single, false );
  44. BOOST_CHECK_EQUAL( join_empty == join_single, false );
  45. BOOST_CHECK_EQUAL( split_single == split_empty, false );
  46. BOOST_CHECK_EQUAL( join_single == join_empty, false );
  47. BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_empty), true );
  48. BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_empty), true );
  49. BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_empty), true );
  50. BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_empty), true );
  51. //--------------------------------------------------------------------------
  52. BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_single), false );
  53. BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_single), false );
  54. BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_single), false );
  55. BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_single), false );
  56. BOOST_CHECK_EQUAL( is_element_equal(split_single, split_empty), false );
  57. BOOST_CHECK_EQUAL( is_element_equal(split_single, join_empty), false );
  58. BOOST_CHECK_EQUAL( is_element_equal(join_single, split_empty), false );
  59. BOOST_CHECK_EQUAL( is_element_equal(join_single, join_empty), false );
  60. }
  61. template <class T, class U>
  62. void interval_map_mixed_assign_4_ordered_types()
  63. {
  64. typedef interval_map<T,U> IntervalMapT;
  65. typedef split_interval_map<T,U> SplitIntervalMapT;
  66. T v0 = boost::icl::identity_element<T>::value();
  67. T v1 = unit_element<T>::value();
  68. U u1 = unit_element<U>::value();
  69. mapping_pair<T,U> v0_u1(v0,u1);
  70. mapping_pair<T,U> v1_u1(v1,u1);
  71. SplitIntervalMapT split_map;
  72. IntervalMapT join_map;
  73. split_map.add(v0_u1); //NOTE: make_pair(v0,u1); fails
  74. join_map = split_map; //=t T& T::operator=(const P&) ...
  75. BOOST_CHECK_EQUAL( hull(split_map).lower(), hull(join_map).lower() );
  76. BOOST_CHECK_EQUAL( hull(split_map).upper(), hull(join_map).upper() );
  77. SplitIntervalMapT split_self = SplitIntervalMapT().add(v0_u1);
  78. IntervalMapT join_self = IntervalMapT().add(v1_u1);
  79. split_self = split_self;
  80. join_self = join_self;
  81. BOOST_CHECK_EQUAL( split_self, split_self );
  82. BOOST_CHECK_EQUAL( join_self, join_self );
  83. }
  84. template <class T, class U>
  85. void interval_map_mixed_ctor_4_bicremental_types()
  86. {
  87. typedef interval_map<T,U> IntervalMapT;
  88. typedef split_interval_map<T,U> SplitIntervalMapT;
  89. typedef typename IntervalMapT::interval_type IntervalT;
  90. U u1 = make<U>(1);
  91. T v1 = make<T>(1);
  92. T v2 = make<T>(2);
  93. T v3 = make<T>(3);
  94. T v4 = make<T>(4);
  95. T v5 = make<T>(5);
  96. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  97. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  98. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  99. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  100. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  101. std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
  102. SplitIntervalMapT split_map;
  103. split_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
  104. BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
  105. IntervalMapT join_map(split_map);
  106. }
  107. template <class T, class U>
  108. void interval_map_mixed_assign_4_bicremental_types()
  109. {
  110. typedef interval_map<T,U> IntervalMapT;
  111. typedef split_interval_map<T,U> SplitIntervalMapT;
  112. typedef typename IntervalMapT::interval_type IntervalT;
  113. U u1 = make<U>(1);
  114. T v1 = make<T>(1);
  115. T v2 = make<T>(2);
  116. T v3 = make<T>(3);
  117. T v4 = make<T>(4);
  118. T v5 = make<T>(5);
  119. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  120. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  121. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  122. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  123. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  124. std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
  125. SplitIntervalMapT split_map;
  126. split_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
  127. BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
  128. IntervalMapT join_map;
  129. join_map = split_map;
  130. BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
  131. }
  132. template <class T, class U>
  133. void interval_map_mixed_equal_4_bicremental_types()
  134. {
  135. typedef interval_map<T,U> IntervalMapT;
  136. typedef split_interval_map<T,U> SplitIntervalMapT;
  137. typedef typename IntervalMapT::interval_type IntervalT;
  138. U u1 = make<U>(1);
  139. T v1 = make<T>(1);
  140. T v2 = make<T>(2);
  141. T v3 = make<T>(3);
  142. T v4 = make<T>(4);
  143. T v5 = make<T>(5);
  144. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  145. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  146. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  147. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  148. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  149. std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
  150. IntervalMapT join_map;
  151. join_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
  152. IntervalMapT join_map2 = join_map;
  153. BOOST_CHECK_EQUAL( join_map, join_map2 );
  154. BOOST_CHECK_EQUAL( is_element_equal(join_map, join_map2), true );
  155. SplitIntervalMapT split_map;
  156. split_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
  157. SplitIntervalMapT split_map2 = split_map;
  158. BOOST_CHECK_EQUAL( split_map, split_map2 );
  159. BOOST_CHECK_EQUAL( is_element_equal(split_map2, split_map), true );
  160. BOOST_CHECK_EQUAL( is_element_equal(split_map, join_map), true );
  161. BOOST_CHECK_EQUAL( is_element_equal(join_map, split_map), true );
  162. }
  163. template <class T, class U, class Trt>
  164. void partial_interval_map_mixed_inclusion_compare_4_bicremental_types()
  165. {
  166. typedef interval_map<T,U,Trt> IntervalMapT;
  167. //--------------------------------------------------------------------------
  168. // equalities
  169. // { 0 1 2 3 4 5 8 9 }
  170. // {[0,2)[2,3](3,6) (7,9]}
  171. // ->2 ->1 ->1 ->2
  172. split_interval_map<T,U,Trt> split_map;
  173. interval_map<T,U,Trt> join_map;
  174. split_interval_set<T> split_set;
  175. separate_interval_set<T> sep_set;
  176. interval_set<T> join_set;
  177. split_map.add(IDv(0,2,2)).add(IIv(2,3,1)).add(CDv(3,6,1)).add(CIv(7,9,2));
  178. join_map = split_map;
  179. icl::domain(split_set, split_map);
  180. icl::domain(sep_set, split_map);
  181. icl::domain(join_set, split_map);
  182. iterative_size(split_map);
  183. BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
  184. BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
  185. BOOST_CHECK_EQUAL( iterative_size(split_set), 4 );
  186. BOOST_CHECK_EQUAL( iterative_size(sep_set), 4 );
  187. BOOST_CHECK_EQUAL( iterative_size(join_set), 2 );
  188. BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_map), inclusion::equal );
  189. BOOST_CHECK_EQUAL( inclusion_compare(join_map, split_map), inclusion::equal );
  190. BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_set), inclusion::equal );
  191. BOOST_CHECK_EQUAL( inclusion_compare(split_map, sep_set ), inclusion::equal );
  192. BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_set ), inclusion::equal );
  193. BOOST_CHECK_EQUAL( inclusion_compare(join_map , split_set), inclusion::equal );
  194. BOOST_CHECK_EQUAL( inclusion_compare(join_map , sep_set ), inclusion::equal );
  195. BOOST_CHECK_EQUAL( inclusion_compare(join_map , join_set ), inclusion::equal );
  196. BOOST_CHECK_EQUAL( inclusion_compare(split_set, split_map), inclusion::equal );
  197. BOOST_CHECK_EQUAL( inclusion_compare(sep_set , split_map), inclusion::equal );
  198. BOOST_CHECK_EQUAL( inclusion_compare(join_set , split_map), inclusion::equal );
  199. BOOST_CHECK_EQUAL( inclusion_compare(split_set, join_map ), inclusion::equal );
  200. BOOST_CHECK_EQUAL( inclusion_compare(sep_set , join_map ), inclusion::equal );
  201. BOOST_CHECK_EQUAL( inclusion_compare(join_set , join_map ), inclusion::equal );
  202. //--------------------------------------------------------------------------
  203. // inclusions
  204. // { 0 1 2 3 4 5 8 9 }
  205. // {[0, 2)[2, 3](3, 6) (7, 9]}
  206. // ->2 ->1 ->1 ->2
  207. // {[0, 2) [3,3](3, 6) (7, 9]}
  208. // ->2 ->1 ->1 ->2
  209. split_interval_map<T,U,Trt> split_sub_map1 = split_map;
  210. split_sub_map1.erase(MK_v(2));
  211. BOOST_CHECK_EQUAL( icl::contains(split_sub_map1, MK_v(2)), false );
  212. interval_map<T,U,Trt> join_sub_map2;
  213. join_sub_map2 = split_map;
  214. join_sub_map2.erase(MK_v(1));
  215. BOOST_CHECK_EQUAL( icl::contains(join_sub_map2, MK_v(1)), false );
  216. split_interval_set<T> split_sub_set1;
  217. separate_interval_set<T> sep_sub_set1;
  218. interval_set<T> join_sub_set1;
  219. icl::domain(split_sub_set1, split_sub_map1);
  220. icl::domain(sep_sub_set1, split_sub_map1);
  221. icl::domain(join_sub_set1, split_sub_map1);
  222. BOOST_CHECK_EQUAL( inclusion_compare(split_sub_map1, split_map), inclusion::subset );
  223. BOOST_CHECK_EQUAL( inclusion_compare( join_sub_map2, split_map), inclusion::subset );
  224. BOOST_CHECK_EQUAL( inclusion_compare(split_sub_map1, join_map), inclusion::subset );
  225. BOOST_CHECK_EQUAL( inclusion_compare( join_sub_map2, join_map), inclusion::subset );
  226. BOOST_CHECK_EQUAL( inclusion_compare(split_sub_set1, split_map), inclusion::subset );
  227. BOOST_CHECK_EQUAL( inclusion_compare( sep_sub_set1, split_map), inclusion::subset );
  228. BOOST_CHECK_EQUAL( inclusion_compare( join_sub_set1, split_map), inclusion::subset );
  229. BOOST_CHECK_EQUAL( inclusion_compare(split_sub_set1, join_map), inclusion::subset );
  230. BOOST_CHECK_EQUAL( inclusion_compare( sep_sub_set1, join_map), inclusion::subset );
  231. BOOST_CHECK_EQUAL( inclusion_compare( join_sub_set1, join_map), inclusion::subset );
  232. BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_sub_map1), inclusion::superset );
  233. BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_sub_map2), inclusion::superset );
  234. BOOST_CHECK_EQUAL( inclusion_compare( join_map, split_sub_map1), inclusion::superset );
  235. BOOST_CHECK_EQUAL( inclusion_compare( join_map, join_sub_map2), inclusion::superset );
  236. BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_sub_set1), inclusion::superset );
  237. BOOST_CHECK_EQUAL( inclusion_compare(split_map, sep_sub_set1), inclusion::superset );
  238. BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_sub_set1), inclusion::superset );
  239. BOOST_CHECK_EQUAL( inclusion_compare( join_map, split_sub_set1), inclusion::superset );
  240. BOOST_CHECK_EQUAL( inclusion_compare( join_map, sep_sub_set1), inclusion::superset );
  241. BOOST_CHECK_EQUAL( inclusion_compare( join_map, join_sub_set1), inclusion::superset );
  242. split_interval_map<T,U,Trt> split_unrel_map11 = split_sub_map1;
  243. split_unrel_map11.set(CIv(7,9,1));
  244. BOOST_CHECK_EQUAL( split_unrel_map11(MK_v(8)), MK_u(1) );
  245. interval_map<T,U,Trt> join_unrel_map21 = join_sub_map2;
  246. join_unrel_map21.set(K_v(0,1));
  247. BOOST_CHECK_EQUAL( join_unrel_map21(MK_v(0)), MK_u(1) );
  248. BOOST_CHECK_EQUAL( inclusion_compare(split_unrel_map11, split_map), inclusion::unrelated );
  249. BOOST_CHECK_EQUAL( inclusion_compare( join_unrel_map21, split_map), inclusion::unrelated );
  250. BOOST_CHECK_EQUAL( inclusion_compare(split_unrel_map11, join_map), inclusion::unrelated );
  251. BOOST_CHECK_EQUAL( inclusion_compare( join_unrel_map21, join_map), inclusion::unrelated );
  252. BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_unrel_map11), inclusion::unrelated );
  253. BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_unrel_map21), inclusion::unrelated );
  254. BOOST_CHECK_EQUAL( inclusion_compare( join_map, split_unrel_map11), inclusion::unrelated );
  255. BOOST_CHECK_EQUAL( inclusion_compare( join_map, join_unrel_map21), inclusion::unrelated );
  256. split_interval_map<T,U,Trt> split_unrel_map1 = split_sub_map1;
  257. split_unrel_map1.add(IDv(11,12,1));
  258. BOOST_CHECK_EQUAL( split_unrel_map1(MK_v(11)), MK_u(1) );
  259. interval_map<T,U,Trt> join_unrel_map2 = join_sub_map2;
  260. join_unrel_map2.add(K_v(6,1));
  261. BOOST_CHECK_EQUAL( join_unrel_map2(MK_v(6)), MK_u(1) );
  262. }
  263. template <class T, class U, class Trt>
  264. void partial_interval_map_mixed_contains_4_bicremental_types()
  265. {
  266. typedef interval_map<T,U,Trt> IntervalMapT;
  267. //--------------------------------------------------------------------------
  268. // { 0 1 2 3 4 5 8 9 }
  269. // {[0,2)[2,3](3,6) (7,9]}
  270. // ->2 ->1 ->1 ->2
  271. split_interval_map<T,U,Trt> split_map;
  272. interval_map<T,U,Trt> join_map;
  273. split_interval_set<T> split_set;
  274. separate_interval_set<T> sep_set;
  275. interval_set<T> join_set;
  276. split_map.add(IDv(0,2,2)).add(IIv(2,3,1)).add(CDv(3,6,1)).add(CIv(7,9,2));
  277. join_map = split_map;
  278. icl::domain(split_set, split_map);
  279. icl::domain(sep_set, split_map);
  280. icl::domain(join_set, split_map);
  281. BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
  282. BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
  283. BOOST_CHECK_EQUAL( iterative_size(split_set), 4 );
  284. BOOST_CHECK_EQUAL( iterative_size(sep_set), 4 );
  285. BOOST_CHECK_EQUAL( iterative_size(join_set), 2 );
  286. // Key types
  287. BOOST_CHECK_EQUAL( icl::contains(split_map, MK_v(0)), true );
  288. BOOST_CHECK_EQUAL( icl::contains(split_map, MK_v(5)), true );
  289. BOOST_CHECK_EQUAL( icl::contains(split_map, MK_v(9)), true );
  290. BOOST_CHECK_EQUAL( icl::contains(split_map, I_D(2,3)), true );
  291. BOOST_CHECK_EQUAL( icl::contains(split_map, I_D(0,6)), true );
  292. BOOST_CHECK_EQUAL( icl::contains(split_map, I_D(0,7)), false );
  293. BOOST_CHECK_EQUAL( icl::contains(join_map, I_D(2,3)), true );
  294. BOOST_CHECK_EQUAL( icl::contains(join_map, I_D(0,6)), true );
  295. BOOST_CHECK_EQUAL( icl::contains(join_map, I_D(0,7)), false );
  296. // Map types
  297. BOOST_CHECK_EQUAL( icl::contains(join_map, K_v(1,2)), true );
  298. BOOST_CHECK_EQUAL( icl::contains(join_map, K_v(5,1)), true );
  299. BOOST_CHECK_EQUAL( icl::contains(join_map, K_v(9,2)), true );
  300. BOOST_CHECK_EQUAL( icl::contains(split_map, IDv(2,6,1)), true );
  301. BOOST_CHECK_EQUAL( icl::contains(split_map, IDv(1,6,1)), false );
  302. BOOST_CHECK_EQUAL( icl::contains(split_map, IIv(8,9,2)), true );
  303. BOOST_CHECK_EQUAL( icl::contains(split_map, IIv(8,9,3)), false );
  304. BOOST_CHECK_EQUAL( icl::contains(join_map, IDv(2,6,1)), true );
  305. BOOST_CHECK_EQUAL( icl::contains(join_map, IDv(1,6,1)), false );
  306. BOOST_CHECK_EQUAL( icl::contains(join_map, IIv(8,9,2)), true );
  307. BOOST_CHECK_EQUAL( icl::contains(join_map, IIv(8,9,3)), false );
  308. BOOST_CHECK_EQUAL( icl::contains(split_map, join_map), true );
  309. BOOST_CHECK_EQUAL( icl::contains(join_map, split_map), true );
  310. BOOST_CHECK_EQUAL( icl::within(split_map, join_map), true );
  311. BOOST_CHECK_EQUAL( icl::within(join_map, split_map), true );
  312. //--------------------------------------------------------------------------
  313. // inclusions
  314. // { 0 1 2 3 4 5 8 9 }
  315. // {[0, 2)[2, 3](3, 6) (7, 9]}
  316. // ->2 ->1 ->1 ->2
  317. // {[0, 2) [3,3](3, 6) (7, 9]}
  318. // ->2 ->1 ->1 ->2
  319. split_interval_map<T,U,Trt> split_sub_map1 = split_map;
  320. split_sub_map1.erase(MK_v(2));
  321. BOOST_CHECK_EQUAL( icl::contains(split_sub_map1, MK_v(2)), false );
  322. interval_map<T,U,Trt> join_sub_map2;
  323. join_sub_map2 = split_map;
  324. join_sub_map2.erase(MK_v(1));
  325. BOOST_CHECK_EQUAL( icl::contains(join_sub_map2, MK_v(1)), false );
  326. split_interval_set<T> split_sub_set1;
  327. separate_interval_set<T> sep_sub_set1;
  328. interval_set<T> join_sub_set1;
  329. icl::domain(split_sub_set1, split_sub_map1);
  330. icl::domain(sep_sub_set1, split_sub_map1);
  331. icl::domain(join_sub_set1, split_sub_map1);
  332. BOOST_CHECK_EQUAL( icl::within(split_sub_map1, split_map), true );
  333. BOOST_CHECK_EQUAL( icl::within(join_sub_map2, split_map), true );
  334. BOOST_CHECK_EQUAL( icl::within(split_sub_map1, join_map ), true );
  335. BOOST_CHECK_EQUAL( icl::within(join_sub_map2, join_map ), true );
  336. BOOST_CHECK_EQUAL( icl::contains(split_map, split_sub_map1), true );
  337. BOOST_CHECK_EQUAL( icl::contains(split_map, join_sub_map2), true );
  338. BOOST_CHECK_EQUAL( icl::contains(join_map, split_sub_map1), true );
  339. BOOST_CHECK_EQUAL( icl::contains(join_map, join_sub_map2), true );
  340. BOOST_CHECK_EQUAL( icl::contains(split_map, split_sub_set1), true );
  341. BOOST_CHECK_EQUAL( icl::contains(split_map, sep_sub_set1), true );
  342. BOOST_CHECK_EQUAL( icl::contains(split_map, join_sub_set1), true );
  343. BOOST_CHECK_EQUAL( icl::contains(join_map, split_sub_set1), true );
  344. BOOST_CHECK_EQUAL( icl::contains(join_map, sep_sub_set1), true );
  345. BOOST_CHECK_EQUAL( icl::contains(join_map, join_sub_set1), true );
  346. split_interval_map<T,U,Trt> split_unrel_map11 = split_sub_map1;
  347. split_unrel_map11.set(CIv(7,9,1));
  348. BOOST_CHECK_EQUAL( split_unrel_map11(MK_v(8)), MK_u(1) );
  349. interval_map<T,U,Trt> join_unrel_map21 = join_sub_map2;
  350. join_unrel_map21.set(K_v(0,1));
  351. BOOST_CHECK_EQUAL( join_unrel_map21(MK_v(0)), MK_u(1) );
  352. BOOST_CHECK_EQUAL( icl::contains(split_unrel_map11, split_map), false );
  353. BOOST_CHECK_EQUAL( icl::contains(join_unrel_map21, split_map), false );
  354. BOOST_CHECK_EQUAL( icl::contains(split_unrel_map11, join_map), false );
  355. BOOST_CHECK_EQUAL( icl::contains(join_unrel_map21, join_map), false );
  356. BOOST_CHECK_EQUAL( icl::within(split_unrel_map11, split_map), false );
  357. BOOST_CHECK_EQUAL( icl::within(join_unrel_map21, split_map), false );
  358. BOOST_CHECK_EQUAL( icl::within(split_unrel_map11, join_map), false );
  359. BOOST_CHECK_EQUAL( icl::within(join_unrel_map21, join_map), false );
  360. BOOST_CHECK_EQUAL( icl::contains(split_map, split_unrel_map11), false );
  361. BOOST_CHECK_EQUAL( icl::contains(split_map, join_unrel_map21), false );
  362. BOOST_CHECK_EQUAL( icl::contains(join_map, split_unrel_map11), false );
  363. BOOST_CHECK_EQUAL( icl::contains(join_map, join_unrel_map21), false );
  364. }
  365. //------------------------------------------------------------------------------
  366. //- part2: Operations
  367. //------------------------------------------------------------------------------
  368. template <class T, class U>
  369. void interval_map_mixed_add_4_bicremental_types()
  370. {
  371. typedef interval_map<T,U> IntervalMapT;
  372. typedef split_interval_map<T,U> SplitIntervalMapT;
  373. typedef typename IntervalMapT::interval_type IntervalT;
  374. U u1 = make<U>(1);
  375. T v1 = make<T>(1);
  376. T v2 = make<T>(2);
  377. T v3 = make<T>(3);
  378. T v4 = make<T>(4);
  379. T v5 = make<T>(5);
  380. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  381. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  382. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  383. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  384. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  385. std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
  386. mapping_pair<T,U> v1_1(v1, u1);
  387. mapping_pair<T,U> v3_1(v3, u1);
  388. mapping_pair<T,U> v5_1(v5, u1);
  389. SplitIntervalMapT split_map;
  390. split_map.add(I1_3D_1).add(I2_4D_1);
  391. split_map += I4_5D_1;
  392. BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
  393. IntervalMapT join_map;
  394. join_map += split_map;
  395. BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
  396. IntervalMapT join_map3;
  397. join_map3.add(v1_1).add(v3_1);
  398. join_map3 += v5_1;
  399. BOOST_CHECK_EQUAL( iterative_size(join_map3), 3 );
  400. SplitIntervalMapT split_map3;
  401. split_map3 += join_map3;
  402. BOOST_CHECK_EQUAL( iterative_size(split_map3), 3 );
  403. }
  404. template <class T, class U>
  405. void interval_map_mixed_add2_4_bicremental_types()
  406. {
  407. typedef interval_map<T,U> IntervalMapT;
  408. typedef split_interval_map<T,U> SplitIntervalMapT;
  409. typedef typename IntervalMapT::interval_type IntervalT;
  410. U u1 = make<U>(1);
  411. T v1 = make<T>(1);
  412. T v2 = make<T>(2);
  413. T v3 = make<T>(3);
  414. T v4 = make<T>(4);
  415. T v5 = make<T>(5);
  416. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  417. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  418. IntervalT I4_5D = IntervalT::right_open(v4,v5);
  419. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  420. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  421. std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
  422. mapping_pair<T,U> v1_1(v1, u1);
  423. mapping_pair<T,U> v3_1(v3, u1);
  424. mapping_pair<T,U> v5_1(v5, u1);
  425. SplitIntervalMapT split_map;
  426. split_map.add(I1_3D_1).add(I2_4D_1);
  427. split_map |= I4_5D_1;
  428. BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
  429. IntervalMapT join_map;
  430. join_map |= split_map;
  431. BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
  432. IntervalMapT join_map3;
  433. join_map3.add(v1_1).add(v3_1);
  434. join_map3 |= v5_1;
  435. BOOST_CHECK_EQUAL( iterative_size(join_map3), 3 );
  436. SplitIntervalMapT split_map3;
  437. split_map3 |= join_map3;
  438. BOOST_CHECK_EQUAL( iterative_size(split_map3), 3 );
  439. }
  440. template <class T, class U>
  441. void interval_map_mixed_subtract_4_bicremental_types()
  442. {
  443. typedef interval_map<T,U> IntervalMapT;
  444. typedef split_interval_map<T,U> SplitIntervalMapT;
  445. typedef typename IntervalMapT::interval_type IntervalT;
  446. U u1 = make<U>(1);
  447. T v0 = make<T>(0);
  448. T v2 = make<T>(2);
  449. T v3 = make<T>(3);
  450. T v4 = make<T>(4);
  451. T v5 = make<T>(5);
  452. T v6 = make<T>(6);
  453. T v7 = make<T>(7);
  454. T v8 = make<T>(8);
  455. T v9 = make<T>(9);
  456. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  457. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  458. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  459. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  460. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  461. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  462. IntervalT I8_9I = IntervalT::closed(v8,v9);
  463. std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
  464. std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
  465. std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
  466. std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
  467. std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
  468. std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
  469. std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
  470. SplitIntervalMapT split_map;
  471. split_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
  472. BOOST_CHECK_EQUAL( iterative_size(split_map), 7 );
  473. IntervalMapT join_map;
  474. join_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
  475. BOOST_CHECK_EQUAL( iterative_size(join_map), 5 );
  476. // Make maps to be subtracted
  477. SplitIntervalMapT split_sub;
  478. split_sub.add(I3_6D_1).add(I8_9D_1);
  479. IntervalMapT join_sub;
  480. join_sub.add(I3_6D_1).add(I8_9D_1);
  481. //--------------------------------------------------------------------------
  482. // Test for split_interval_map
  483. SplitIntervalMapT split_diff = split_map;
  484. IntervalMapT join_diff = join_map;
  485. //subtraction combinations
  486. split_diff -= split_sub;
  487. join_diff -= split_sub;
  488. BOOST_CHECK_EQUAL( iterative_size(split_diff), 7 );
  489. BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
  490. BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
  491. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  492. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  493. //--------------------------------------------------------------------------
  494. // Test for interval_map. Reinitialize
  495. split_diff = split_map;
  496. join_diff = join_map;
  497. //subtraction combinations
  498. split_diff -= join_sub;
  499. join_diff -= join_sub;
  500. BOOST_CHECK_EQUAL( iterative_size(split_diff), 7 );
  501. BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
  502. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  503. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  504. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  505. }
  506. template <class T, class U>
  507. void interval_map_mixed_erase_4_bicremental_types()
  508. {
  509. typedef interval_map<T,U> IntervalMapT;
  510. typedef split_interval_map<T,U> SplitIntervalMapT;
  511. typedef typename IntervalMapT::interval_type IntervalT;
  512. U u1 = make<U>(1);
  513. T v0 = make<T>(0);
  514. T v2 = make<T>(2);
  515. T v3 = make<T>(3);
  516. T v4 = make<T>(4);
  517. T v5 = make<T>(5);
  518. T v6 = make<T>(6);
  519. T v7 = make<T>(7);
  520. T v8 = make<T>(8);
  521. T v9 = make<T>(9);
  522. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  523. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  524. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  525. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  526. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  527. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  528. IntervalT I8_9I = IntervalT::closed(v8,v9);
  529. std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
  530. std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
  531. std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
  532. std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
  533. std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
  534. std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
  535. std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
  536. SplitIntervalMapT split_map;
  537. split_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
  538. BOOST_CHECK_EQUAL( iterative_size(split_map), 7 );
  539. IntervalMapT join_map;
  540. join_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
  541. BOOST_CHECK_EQUAL( iterative_size(join_map), 5 );
  542. // Make sets to be erased
  543. SplitIntervalMapT split_sub;
  544. split_sub.add(I3_6D_1).add(I8_9D_1);
  545. IntervalMapT join_sub;
  546. join_sub.add(I3_6D_1).add(I8_9D_1);
  547. //--------------------------------------------------------------------------
  548. // Test for split_interval_map
  549. SplitIntervalMapT split_diff = split_map;
  550. IntervalMapT join_diff = join_map;
  551. //subtraction combinations
  552. erase(split_diff, split_sub);
  553. erase(join_diff, split_sub);
  554. BOOST_CHECK_EQUAL( iterative_size(split_diff), 6 );
  555. BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
  556. BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
  557. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  558. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  559. //--------------------------------------------------------------------------
  560. // Test for interval_map. Reinitialize
  561. split_diff = split_map;
  562. join_diff = join_map;
  563. //subtraction combinations
  564. erase(split_diff, join_sub);
  565. erase(join_diff, join_sub);
  566. BOOST_CHECK_EQUAL( iterative_size(split_diff), 6 );
  567. BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
  568. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  569. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  570. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  571. }
  572. template <class T, class U>
  573. void interval_map_mixed_erase2_4_bicremental_types()
  574. {
  575. typedef interval_map<T,U> IntervalMapT;
  576. typedef split_interval_map<T,U> SplitIntervalMapT;
  577. typedef interval_set<T> IntervalSetT;
  578. typedef split_interval_set<T> SplitIntervalSetT;
  579. typedef typename IntervalMapT::interval_type IntervalT;
  580. U u1 = make<U>(1);
  581. T v0 = make<T>(0);
  582. T v2 = make<T>(2);
  583. T v3 = make<T>(3);
  584. T v4 = make<T>(4);
  585. T v5 = make<T>(5);
  586. T v6 = make<T>(6);
  587. T v7 = make<T>(7);
  588. T v8 = make<T>(8);
  589. T v9 = make<T>(9);
  590. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  591. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  592. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  593. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  594. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  595. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  596. IntervalT I8_9I = IntervalT::closed(v8,v9);
  597. std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
  598. std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
  599. std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
  600. std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
  601. std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
  602. std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
  603. std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
  604. SplitIntervalMapT split_map;
  605. split_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
  606. BOOST_CHECK_EQUAL( iterative_size(split_map), 7 );
  607. IntervalMapT join_map;
  608. join_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
  609. BOOST_CHECK_EQUAL( iterative_size(join_map), 5 );
  610. // Make sets to be erased
  611. SplitIntervalSetT split_sub;
  612. split_sub.add(I3_6D).add(I8_9D);
  613. IntervalSetT join_sub;
  614. join_sub.add(I3_6D).add(I8_9D);
  615. //--------------------------------------------------------------------------
  616. // Test for split_interval_map
  617. SplitIntervalMapT split_diff = split_map;
  618. IntervalMapT join_diff = join_map;
  619. SplitIntervalMapT split_diff2 = split_map;
  620. IntervalMapT join_diff2 = join_map;
  621. //erase combinations
  622. erase(split_diff, split_sub);
  623. erase(join_diff, split_sub);
  624. BOOST_CHECK_EQUAL( iterative_size(split_diff), 5 );
  625. BOOST_CHECK_EQUAL( iterative_size(join_diff), 4 );
  626. BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
  627. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  628. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  629. //subtraction combinations
  630. split_diff2 -= split_sub;
  631. join_diff2 -= split_sub;
  632. BOOST_CHECK_EQUAL( iterative_size(split_diff2), 5 );
  633. BOOST_CHECK_EQUAL( iterative_size(join_diff2), 4 );
  634. BOOST_CHECK_EQUAL( is_element_equal(split_diff2, split_diff2), true );
  635. BOOST_CHECK_EQUAL( is_element_equal(split_diff2, join_diff2), true );
  636. BOOST_CHECK_EQUAL( is_element_equal(join_diff2, split_diff2), true );
  637. //--------------------------------------------------------------------------
  638. // Test for interval_map. Reinitialize
  639. split_diff = split_map;
  640. join_diff = join_map;
  641. split_diff2 = split_map;
  642. join_diff2 = join_map;
  643. //erase combinations
  644. erase(split_diff, join_sub);
  645. erase(join_diff, join_sub);
  646. BOOST_CHECK_EQUAL( iterative_size(split_diff), 5 );
  647. BOOST_CHECK_EQUAL( iterative_size(join_diff), 4 );
  648. BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
  649. BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
  650. BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
  651. //subtraction combinations
  652. split_diff2 -= join_sub;
  653. join_diff2 -= join_sub;
  654. BOOST_CHECK_EQUAL( iterative_size(split_diff2), 5 );
  655. BOOST_CHECK_EQUAL( iterative_size(join_diff2), 4 );
  656. BOOST_CHECK_EQUAL( is_element_equal(join_diff2, join_diff2), true );
  657. BOOST_CHECK_EQUAL( is_element_equal(join_diff2, split_diff2), true );
  658. BOOST_CHECK_EQUAL( is_element_equal(split_diff2, join_diff2), true );
  659. }
  660. template <class T, class U>
  661. void interval_map_mixed_insert_erase_4_bicremental_types()
  662. {
  663. typedef interval_map<T,U> IntervalMapT;
  664. typedef split_interval_map<T,U> SplitIntervalMapT;
  665. typedef typename IntervalMapT::interval_type IntervalT;
  666. U u1 = make<U>(1);
  667. T v0 = make<T>(0);
  668. T v2 = make<T>(2);
  669. T v3 = make<T>(3);
  670. T v4 = make<T>(4);
  671. T v5 = make<T>(5);
  672. T v6 = make<T>(6);
  673. T v7 = make<T>(7);
  674. T v8 = make<T>(8);
  675. T v9 = make<T>(9);
  676. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  677. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  678. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  679. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  680. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  681. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  682. IntervalT I8_9I = IntervalT::closed(v8,v9);
  683. std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
  684. std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
  685. std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
  686. std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
  687. std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
  688. std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
  689. std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
  690. SplitIntervalMapT split_A, split_B, split_all, split_X;
  691. IntervalMapT join_A, join_B, join_all, join_X;
  692. split_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
  693. split_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
  694. split_B.insert(I7_8D_1).insert(I8_9I_1);
  695. join_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
  696. join_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
  697. join_B.insert(I7_8D_1).insert(I8_9I_1);
  698. //-------------------------------------------------------------------------
  699. insert(split_X, split_A);
  700. BOOST_CHECK_EQUAL( split_X, split_A );
  701. insert(split_X, split_B);
  702. BOOST_CHECK_EQUAL( split_X, split_all );
  703. erase(split_X, split_B);
  704. BOOST_CHECK_EQUAL( split_X, split_A );
  705. erase(split_X, split_A);
  706. BOOST_CHECK_EQUAL( split_X, SplitIntervalMapT() );
  707. //-------------------------------------------------------------------------
  708. insert(join_X, join_A);
  709. BOOST_CHECK_EQUAL( join_X, join_A );
  710. insert(join_X, join_B);
  711. BOOST_CHECK_EQUAL( join_X, join_all );
  712. erase(join_X, join_B);
  713. BOOST_CHECK_EQUAL( join_X, join_A );
  714. erase(join_X, join_A);
  715. BOOST_CHECK_EQUAL( join_X, IntervalMapT() );
  716. //-------------------------------------------------------------------------
  717. split_X.clear();
  718. insert(split_X, join_A);
  719. BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
  720. insert(split_X, join_B);
  721. BOOST_CHECK_EQUAL( is_element_equal(split_X, split_all), true );
  722. erase(split_X, join_B);
  723. BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
  724. erase(split_X, join_A);
  725. BOOST_CHECK_EQUAL( is_element_equal(split_X, SplitIntervalMapT()), true );
  726. //-------------------------------------------------------------------------
  727. split_X.clear();
  728. insert(join_X, split_A);
  729. BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
  730. insert(join_X, split_B);
  731. BOOST_CHECK_EQUAL( is_element_equal(join_X, join_all), true );
  732. erase(join_X, split_B);
  733. BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
  734. erase(join_X, split_A);
  735. BOOST_CHECK_EQUAL( is_element_equal(join_X, IntervalMapT()), true );
  736. }
  737. template <class T, class U>
  738. void interval_map_mixed_insert_erase2_4_bicremental_types()
  739. {
  740. typedef interval_map<T,U> IntervalMapT;
  741. typedef split_interval_map<T,U> SplitIntervalMapT;
  742. typedef interval_set<T> IntervalSetT;
  743. typedef split_interval_set<T> SplitIntervalSetT;
  744. typedef typename IntervalMapT::interval_type IntervalT;
  745. U u1 = make<U>(1);
  746. T v0 = make<T>(0);
  747. T v2 = make<T>(2);
  748. T v3 = make<T>(3);
  749. T v4 = make<T>(4);
  750. T v5 = make<T>(5);
  751. T v6 = make<T>(6);
  752. T v7 = make<T>(7);
  753. T v8 = make<T>(8);
  754. T v9 = make<T>(9);
  755. IntervalT I0_4D = IntervalT::right_open(v0,v4);
  756. IntervalT I2_6D = IntervalT::right_open(v2,v6);
  757. IntervalT I3_6D = IntervalT::right_open(v3,v6);
  758. IntervalT I5_7D = IntervalT::right_open(v5,v7);
  759. IntervalT I7_8D = IntervalT::right_open(v7,v8);
  760. IntervalT I8_9D = IntervalT::right_open(v8,v9);
  761. IntervalT I8_9I = IntervalT::closed(v8,v9);
  762. std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
  763. std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
  764. std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
  765. std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
  766. std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
  767. std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
  768. std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
  769. SplitIntervalMapT split_A, split_B, split_all, split_X;
  770. IntervalMapT join_A, join_B, join_all, join_X;
  771. SplitIntervalSetT split_dA, split_dB;
  772. IntervalSetT join_dA, join_dB;
  773. split_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
  774. split_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
  775. split_B.insert(I7_8D_1).insert(I8_9I_1);
  776. join_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
  777. join_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
  778. join_B.insert(I7_8D_1).insert(I8_9I_1);
  779. icl::domain(split_dA, split_A);
  780. icl::domain(split_dB, split_B);
  781. icl::domain(join_dA, join_A);
  782. icl::domain(join_dB, join_B);
  783. //-------------------------------------------------------------------------
  784. insert(split_X, split_A);
  785. BOOST_CHECK_EQUAL( split_X, split_A );
  786. insert(split_X, split_B);
  787. BOOST_CHECK_EQUAL( split_X, split_all );
  788. erase(split_X, split_dB);
  789. BOOST_CHECK_EQUAL( split_X, split_A );
  790. erase(split_X, split_dA);
  791. BOOST_CHECK_EQUAL( split_X, SplitIntervalMapT() );
  792. //-------------------------------------------------------------------------
  793. insert(join_X, join_A);
  794. BOOST_CHECK_EQUAL( join_X, join_A );
  795. insert(join_X, join_B);
  796. BOOST_CHECK_EQUAL( join_X, join_all );
  797. erase(join_X, join_dB);
  798. BOOST_CHECK_EQUAL( join_X, join_A );
  799. erase(join_X, join_dA);
  800. BOOST_CHECK_EQUAL( join_X, IntervalMapT() );
  801. //-------------------------------------------------------------------------
  802. split_X.clear();
  803. insert(split_X, join_A);
  804. BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
  805. insert(split_X, join_B);
  806. BOOST_CHECK_EQUAL( is_element_equal(split_X, split_all), true );
  807. erase(split_X, join_dB);
  808. BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
  809. erase(split_X, join_dA);
  810. BOOST_CHECK_EQUAL( is_element_equal(split_X, SplitIntervalMapT()), true );
  811. //-------------------------------------------------------------------------
  812. split_X.clear();
  813. insert(join_X, split_A);
  814. BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
  815. insert(join_X, split_B);
  816. BOOST_CHECK_EQUAL( is_element_equal(join_X, join_all), true );
  817. erase(join_X, split_dB);
  818. BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
  819. erase(join_X, split_dA);
  820. BOOST_CHECK_EQUAL( is_element_equal(join_X, IntervalMapT()), true );
  821. }
  822. template <class T, class U>
  823. void interval_map_mixed_basic_intersect_4_bicremental_types()
  824. {
  825. typedef interval_map<T,U> IntervalMapT;
  826. typedef split_interval_map<T,U> SplitIntervalMapT;
  827. typedef typename IntervalMapT::interval_type IntervalT;
  828. U u1 = make<U>(1);
  829. U u2 = make<U>(2);
  830. U u3 = make<U>(3);
  831. T v0 = make<T>(0);
  832. T v1 = make<T>(1);
  833. T v2 = make<T>(2);
  834. T v3 = make<T>(3);
  835. T v6 = make<T>(6);
  836. T v7 = make<T>(7);
  837. T v8 = make<T>(8);
  838. T v9 = make<T>(9);
  839. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  840. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  841. IntervalT I1_8D = IntervalT::right_open(v1,v8);
  842. IntervalT I2_7D = IntervalT::right_open(v2,v7);
  843. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  844. IntervalT I6_7D = IntervalT::right_open(v6,v7);
  845. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  846. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  847. std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
  848. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  849. std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
  850. std::pair<IntervalT,U> I1_8D_1(I1_8D, u1);
  851. std::pair<const IntervalT,U> I2_7D_1(I2_7D, u1);
  852. std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
  853. std::pair<IntervalT,U> I2_3D_3(I2_3D, u3);
  854. std::pair<IntervalT,U> I6_7D_1(I6_7D, u1);
  855. std::pair<IntervalT,U> I6_7D_3(I6_7D, u3);
  856. std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
  857. std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
  858. std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
  859. //--------------------------------------------------------------------------
  860. // split_interval_map
  861. //--------------------------------------------------------------------------
  862. //split_A [0 3) [6 9)
  863. // &= [1 8)
  864. //split_AB -> [1 3) [6 8)
  865. // &= [2 7)
  866. // -> [2 3) [6 7)
  867. SplitIntervalMapT split_A, split_B, split_AB, split_ab, split_ab2;
  868. split_A.add(I0_3D_1).add(I6_9D_1);
  869. split_AB = split_A;
  870. split_AB &= I1_8D_1;
  871. split_ab.add(I1_3D_2).add(I6_8D_2);
  872. BOOST_CHECK_EQUAL( split_AB, split_ab );
  873. split_AB = split_A;
  874. (split_AB &= I1_8D_1) &= I2_7D_1;
  875. split_ab2.add(I2_3D_3).add(I6_7D_3);
  876. BOOST_CHECK_EQUAL( split_AB, split_ab2 );
  877. //--------------------------------------------------------------------------
  878. //split_A [0 3) [6 9)
  879. // 1 1
  880. // &= 1
  881. // 1
  882. //split_AB -> [1]
  883. // 2
  884. // += (1 7)
  885. // 2
  886. // -> [1](1 7)
  887. // 2 2
  888. split_A.clear();
  889. split_A.add(I0_3D_1).add(I6_9D_1);
  890. split_AB = split_A;
  891. split_AB &= mapping_pair<T,U>(v1,u1);
  892. split_ab.clear();
  893. split_ab.add(mapping_pair<T,U>(v1,u2));
  894. BOOST_CHECK_EQUAL( split_AB, split_ab );
  895. split_AB = split_A;
  896. split_AB &= mapping_pair<T,U>(v1,u1);
  897. split_AB += make_pair(IntervalT::open(v1,v7), u2);
  898. split_ab2.clear();
  899. split_ab2 += make_pair(IntervalT::right_open(v1,v7), u2);
  900. BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
  901. }
  902. template <class T, class U>
  903. void interval_map_mixed_basic_intersect2_4_bicremental_types()
  904. {
  905. typedef interval_map<T,U> IntervalMapT;
  906. typedef split_interval_map<T,U> SplitIntervalMapT;
  907. typedef typename IntervalMapT::interval_type IntervalT;
  908. U u1 = make<U>(1);
  909. U u2 = make<U>(2);
  910. U u3 = make<U>(3);
  911. T v0 = make<T>(0);
  912. T v1 = make<T>(1);
  913. T v2 = make<T>(2);
  914. T v3 = make<T>(3);
  915. T v6 = make<T>(6);
  916. T v7 = make<T>(7);
  917. T v8 = make<T>(8);
  918. T v9 = make<T>(9);
  919. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  920. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  921. IntervalT I1_8D = IntervalT::right_open(v1,v8);
  922. IntervalT I2_7D = IntervalT::right_open(v2,v7);
  923. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  924. IntervalT I6_7D = IntervalT::right_open(v6,v7);
  925. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  926. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  927. std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
  928. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  929. std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
  930. std::pair<IntervalT,U> I1_8D_1(I1_8D, u1);
  931. std::pair<IntervalT,U> I2_7D_1(I2_7D, u1);
  932. std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
  933. std::pair<IntervalT,U> I2_3D_3(I2_3D, u3);
  934. std::pair<IntervalT,U> I6_7D_1(I6_7D, u1);
  935. std::pair<IntervalT,U> I6_7D_3(I6_7D, u3);
  936. std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
  937. std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
  938. std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
  939. //--------------------------------------------------------------------------
  940. // split_interval_map
  941. //--------------------------------------------------------------------------
  942. //split_A [0 3) [6 9)
  943. // &= [1 8)
  944. //split_AB -> [1 3) [6 8)
  945. // &= [2 7)
  946. // -> [2 3) [6 7)
  947. SplitIntervalMapT split_A, split_B, split_AB, split_ab, split_ab2;
  948. split_A.add(I0_3D_1).add(I6_9D_1);
  949. split_AB = split_A;
  950. split_AB &= I1_8D;
  951. split_ab.add(I1_3D_1).add(I6_8D_1);
  952. BOOST_CHECK_EQUAL( split_AB, split_ab );
  953. split_AB = split_A;
  954. (split_AB &= I1_8D) &= I2_7D;
  955. split_ab2.add(I2_3D_1).add(I6_7D_1);
  956. BOOST_CHECK_EQUAL( split_AB, split_ab2 );
  957. //--------------------------------------------------------------------------
  958. //split_A [0 3) [6 9)
  959. // 1 1
  960. // &= 1
  961. // 1
  962. //split_AB -> [1]
  963. // 2
  964. // += (1 7)
  965. // 2
  966. // -> [1](1 7)
  967. // 2 2
  968. split_A.clear();
  969. split_A.add(I0_3D_1).add(I6_9D_1);
  970. split_AB = split_A;
  971. split_AB &= v1;
  972. split_ab.clear();
  973. split_ab.add(mapping_pair<T,U>(v1,u1));
  974. BOOST_CHECK_EQUAL( split_AB, split_ab );
  975. split_AB = split_A;
  976. split_AB &= IntervalT(v1);
  977. split_AB += make_pair(IntervalT::open(v1,v7), u1);
  978. split_ab2.clear();
  979. split_ab2 += make_pair(IntervalT::right_open(v1,v7), u1);
  980. BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
  981. split_interval_map<T,U> left, right;
  982. left. add(IDv(0,2,2));
  983. right.add(IDv(0,2,2));
  984. BOOST_CHECK_EQUAL( is_element_equal(left, right), true );
  985. split_interval_set<T> left2, right2;
  986. left2. add(I_D(0,2));
  987. right2.add(I_D(0,1));
  988. is_element_equal(left2, right2);
  989. BOOST_CHECK_EQUAL( is_element_equal(left2, right2), false );
  990. }
  991. template <class T, class U>
  992. void interval_map_mixed_intersect_4_bicremental_types()
  993. {
  994. typedef interval_map<T,U> IntervalMapT;
  995. typedef split_interval_map<T,U> SplitIntervalMapT;
  996. typedef typename IntervalMapT::interval_type IntervalT;
  997. U u1 = make<U>(1);
  998. U u2 = make<U>(2);
  999. T v0 = make<T>(0);
  1000. T v1 = make<T>(1);
  1001. T v2 = make<T>(2);
  1002. T v3 = make<T>(3);
  1003. T v4 = make<T>(4);
  1004. T v5 = make<T>(5);
  1005. T v6 = make<T>(6);
  1006. T v8 = make<T>(8);
  1007. T v9 = make<T>(9);
  1008. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  1009. IntervalT I1_2D = IntervalT::right_open(v1,v2);
  1010. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  1011. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  1012. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  1013. IntervalT I5_8D = IntervalT::right_open(v5,v8);
  1014. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  1015. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  1016. std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
  1017. std::pair<IntervalT,U> I1_2D_1(I1_2D, u1);
  1018. std::pair<IntervalT,U> I1_2D_2(I1_2D, u2);
  1019. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  1020. std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
  1021. std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
  1022. std::pair<IntervalT,U> I2_3D_2(I2_3D, u2);
  1023. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  1024. std::pair<IntervalT,U> I5_8D_1(I5_8D, u1);
  1025. std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
  1026. std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
  1027. std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
  1028. //--------------------------------------------------------------------------
  1029. // split_interval_set
  1030. //--------------------------------------------------------------------------
  1031. //split_A [0 3) [6 9)
  1032. // 1 1
  1033. //split_B &= [1 2)[2 4) [5 8)
  1034. // 1 1 1
  1035. //split_AB -> [1 2)[2 3) [6 8)
  1036. // 2 2 2
  1037. SplitIntervalMapT split_A, split_B, split_AB, split_ab, split_ab_jn;
  1038. IntervalMapT join_A, join_B, join_AB, join_ab;
  1039. split_A.add(I0_3D_1).add(I6_9D_1);
  1040. split_B.add(I1_2D_1).add(I2_4D_1).add(I5_8D_1);
  1041. split_ab.add(I1_2D_2).add(I2_3D_2).add(I6_8D_2);
  1042. split_ab_jn.add(I1_3D_2).add(I6_8D_2);
  1043. split_AB = split_A;
  1044. split_AB &= split_B;
  1045. BOOST_CHECK_EQUAL( iterative_size(split_AB), 3 );
  1046. BOOST_CHECK_EQUAL( split_AB, split_ab );
  1047. //split_A [0 3) [6 9)
  1048. // 1 1
  1049. //join_B &= [1 4) [5 8)
  1050. // 1 1
  1051. //split_AB -> [1 3) [6 8)
  1052. // 2 2
  1053. split_AB = split_A;
  1054. join_B = split_B;
  1055. split_AB &= join_B;
  1056. BOOST_CHECK_EQUAL( iterative_size(split_AB), 2 );
  1057. BOOST_CHECK_EQUAL( split_AB, split_ab_jn );
  1058. }
  1059. template <class T, class U>
  1060. void interval_map_mixed_intersect2_4_bicremental_types()
  1061. {
  1062. typedef interval_map<T,U> IntervalMapT;
  1063. typedef split_interval_map<T,U> SplitIntervalMapT;
  1064. typedef interval_set<T> IntervalSetT;
  1065. typedef split_interval_set<T> SplitIntervalSetT;
  1066. typedef typename IntervalMapT::interval_type IntervalT;
  1067. U u1 = make<U>(1);
  1068. U u2 = make<U>(2);
  1069. T v0 = make<T>(0);
  1070. T v1 = make<T>(1);
  1071. T v2 = make<T>(2);
  1072. T v3 = make<T>(3);
  1073. T v4 = make<T>(4);
  1074. T v5 = make<T>(5);
  1075. T v6 = make<T>(6);
  1076. T v8 = make<T>(8);
  1077. T v9 = make<T>(9);
  1078. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  1079. IntervalT I1_2D = IntervalT::right_open(v1,v2);
  1080. IntervalT I1_3D = IntervalT::right_open(v1,v3);
  1081. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  1082. IntervalT I2_4D = IntervalT::right_open(v2,v4);
  1083. IntervalT I5_8D = IntervalT::right_open(v5,v8);
  1084. IntervalT I6_8D = IntervalT::right_open(v6,v8);
  1085. IntervalT I6_9D = IntervalT::right_open(v6,v9);
  1086. std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
  1087. std::pair<IntervalT,U> I1_2D_1(I1_2D, u1);
  1088. std::pair<IntervalT,U> I1_2D_2(I1_2D, u2);
  1089. std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
  1090. std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
  1091. std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
  1092. std::pair<IntervalT,U> I2_3D_2(I2_3D, u2);
  1093. std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
  1094. std::pair<IntervalT,U> I5_8D_1(I5_8D, u1);
  1095. std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
  1096. std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
  1097. std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
  1098. //--------------------------------------------------------------------------
  1099. // split_interval_set
  1100. //--------------------------------------------------------------------------
  1101. //split_A [0 3) [6 9)
  1102. // 1 1
  1103. //split_B &= [1 2)[2 4) [5 8)
  1104. //split_AB -> [1 2)[2 3) [6 8)
  1105. // 1 1 1
  1106. SplitIntervalMapT split_A, split_AB, split_ab, split_ab_jn;
  1107. SplitIntervalSetT split_B;
  1108. IntervalMapT join_A, join_AB, join_ab;
  1109. IntervalSetT join_B;
  1110. split_A.add(I0_3D_1).add(I6_9D_1);
  1111. split_B.add(I1_2D).add(I2_4D).add(I5_8D);
  1112. split_ab.add(I1_2D_1).add(I2_3D_1).add(I6_8D_1);
  1113. split_ab_jn.add(I1_3D_1).add(I6_8D_1);
  1114. split_AB = split_A;
  1115. split_AB &= split_B;
  1116. BOOST_CHECK_EQUAL( iterative_size(split_AB), 3 );
  1117. BOOST_CHECK_EQUAL( split_AB, split_ab );
  1118. //split_A [0 3) [6 9)
  1119. // 1 1
  1120. //join_B &= [1 4) [5 8)
  1121. //split_AB -> [1 3) [6 8)
  1122. // 1 1
  1123. split_AB = split_A;
  1124. join_B = split_B;
  1125. split_AB &= join_B;
  1126. BOOST_CHECK_EQUAL( iterative_size(split_AB), 2 );
  1127. BOOST_CHECK_EQUAL( split_AB, split_ab_jn );
  1128. }
  1129. template <class T, class U>
  1130. void interval_map_mixed_disjoint_4_bicremental_types()
  1131. {
  1132. typedef interval_map<T,U> IntervalMapT;
  1133. typedef split_interval_map<T,U> SplitIntervalMapT;
  1134. typedef typename IntervalMapT::interval_type IntervalT;
  1135. U u1 = make<U>(1);
  1136. T v0 = make<T>(0);
  1137. T v2 = make<T>(2);
  1138. T v3 = make<T>(3);
  1139. T v4 = make<T>(4);
  1140. T v6 = make<T>(6);
  1141. IntervalT I0_2D = IntervalT::right_open(v0,v2);
  1142. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  1143. IntervalT I3_4D = IntervalT::right_open(v3,v4);
  1144. IntervalT I4_4I = IntervalT::closed(v4,v4);
  1145. IntervalT C4_6D = IntervalT::open(v4,v6);
  1146. IntervalT I6_6I = IntervalT::closed(v6,v6);
  1147. std::pair<IntervalT,U> I0_2D_1(I0_2D, u1);
  1148. std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
  1149. std::pair<IntervalT,U> I3_4D_1(I3_4D, u1);
  1150. std::pair<IntervalT,U> I4_4I_1(I4_4I, u1);
  1151. std::pair<IntervalT,U> C4_6D_1(C4_6D, u1);
  1152. std::pair<IntervalT,U> I6_6I_1(I6_6I, u1);
  1153. //--------------------------------------------------------------------------
  1154. //split_A: [0 2) [4 4] [6 6]
  1155. //split_B: [2 3)[3 4) (4 6)
  1156. SplitIntervalMapT split_A, split_B;
  1157. split_A.add(I0_2D_1).add(I4_4I_1).add(I6_6I_1);
  1158. split_B.add(I2_3D_1).add(I3_4D_1).add(C4_6D_1);
  1159. IntervalMapT join_A(split_A), join_B(split_B);
  1160. BOOST_CHECK_EQUAL( disjoint(split_A, split_B), true );
  1161. BOOST_CHECK_EQUAL( disjoint(split_A, join_B), true );
  1162. BOOST_CHECK_EQUAL( disjoint(join_A, split_B), true );
  1163. BOOST_CHECK_EQUAL( disjoint(join_A, join_B), true );
  1164. }
  1165. template<class Type>
  1166. struct size_greater_1 : public icl::property<Type>
  1167. {
  1168. bool operator()(const Type& value)const
  1169. {
  1170. return icl::size(value.first) > 1 ;
  1171. }
  1172. };
  1173. template <class T, class U>
  1174. void interval_map_mixed_erase_if_4_integral_types()
  1175. {
  1176. typedef interval_map<T,U> IntervalMapT;
  1177. typedef split_interval_map<T,U> SplitIntervalMapT;
  1178. typedef typename IntervalMapT::interval_type IntervalT;
  1179. U u1 = make<U>(1);
  1180. T v0 = make<T>(0);
  1181. T v2 = make<T>(2);
  1182. T v3 = make<T>(3);
  1183. T v4 = make<T>(4);
  1184. T v6 = make<T>(6);
  1185. IntervalT I0_3D = IntervalT::right_open(v0,v3);
  1186. IntervalT I2_3D = IntervalT::right_open(v2,v3);
  1187. IntervalT I3_4D = IntervalT::right_open(v3,v4);
  1188. IntervalT I4_4I = IntervalT::closed(v4,v4);
  1189. IntervalT C4_6D = IntervalT::open(v4,v6);
  1190. IntervalT I6_6I = IntervalT::closed(v6,v6);
  1191. std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
  1192. std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
  1193. std::pair<IntervalT,U> I3_4D_1(I3_4D, u1);
  1194. std::pair<IntervalT,U> I4_4I_1(I4_4I, u1);
  1195. std::pair<IntervalT,U> C4_6D_1(C4_6D, u1);
  1196. std::pair<IntervalT,U> I6_6I_1(I6_6I, u1);
  1197. //--------------------------------------------------------------------------
  1198. //split_A: [0 2) [4 4] [6 6]
  1199. //split_B: [2 3)[3 4) (4 6)
  1200. SplitIntervalMapT split_A, split_B;
  1201. split_A.add(I0_3D_1).add(I4_4I_1).add(I6_6I_1);
  1202. split_B.add(I4_4I_1).add(I6_6I_1);
  1203. icl::erase_if(size_greater_1<typename SplitIntervalMapT::value_type>(), split_A);
  1204. BOOST_CHECK_EQUAL( split_A, split_B );
  1205. }
  1206. //------------------------------------------------------------------------------
  1207. //- infix operators
  1208. //------------------------------------------------------------------------------
  1209. template <class T, class U>
  1210. void interval_map_mixed_infix_plus_overload_4_bicremental_types()
  1211. {
  1212. typedef interval_map<T,U> IntervalMapT;
  1213. interval_map<T,U> join_a;
  1214. split_interval_map<T,U> split_a;
  1215. join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1216. split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  1217. BOOST_CHECK_EQUAL(split_a + join_a, join_a + split_a);
  1218. }
  1219. template <class T, class U>
  1220. void interval_map_mixed_infix_pipe_overload_4_bicremental_types()
  1221. {
  1222. typedef interval_map<T,U> IntervalMapT;
  1223. interval_map<T,U> join_a;
  1224. split_interval_map<T,U> split_a;
  1225. join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1226. split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  1227. BOOST_CHECK_EQUAL(split_a | join_a, join_a | split_a);
  1228. }
  1229. template <class T, class U>
  1230. void interval_map_mixed_infix_minus_overload_4_bicremental_types()
  1231. {
  1232. typedef interval_map<T,U> IntervalMapT;
  1233. interval_map<T,U> join_a, join_b;
  1234. split_interval_map<T,U> split_a, split_b;
  1235. join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1236. split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  1237. join_b .add(CDv(1,3,1)).add(IIv(6,11,3));
  1238. split_b.add(IDv(0,9,2)).add(IIv(3,6,1));
  1239. BOOST_CHECK_EQUAL(split_a - join_a, (split_b = split_a) -= join_a);
  1240. BOOST_CHECK_EQUAL(split_a - join_a, split_b);
  1241. BOOST_CHECK_EQUAL(join_a - split_a, (join_b = join_a) -= split_a);
  1242. BOOST_CHECK_EQUAL(join_a - split_a, join_b);
  1243. }
  1244. template <class T, class U>
  1245. void interval_map_mixed_infix_et_overload_4_bicremental_types()
  1246. {
  1247. typedef interval_map<T,U> IntervalMapT;
  1248. interval_map<T,U> join_a, join_b;
  1249. split_interval_map<T,U> split_a, split_b;
  1250. join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1251. split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  1252. BOOST_CHECK_EQUAL(split_a & join_a, join_a & split_a);
  1253. BOOST_CHECK_EQUAL(split_a & join_a, (split_b = split_a) &= join_a);
  1254. BOOST_CHECK_EQUAL(split_a & join_a, split_b);
  1255. BOOST_CHECK_EQUAL(join_a & split_a, (split_b = split_a) &= join_a);
  1256. BOOST_CHECK_EQUAL(join_a & split_a, split_b);
  1257. }
  1258. #endif // LIBS_ICL_TEST_TEST_ICL_interval_map_mixed_hpp_JOFA_081005__