test_interval_map_shared.hpp 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518
  1. /*-----------------------------------------------------------------------------+
  2. Copyright (c) 2008-2012: 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_MAP_SHARED_HPP_JOFA_081005
  9. #define LIBS_ICL_TEST_TEST_INTERVAL_MAP_SHARED_HPP_JOFA_081005
  10. #include "portability.hpp"
  11. template
  12. <
  13. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  14. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  15. #else
  16. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  17. #endif
  18. class T, class U
  19. >
  20. void interval_map_fundamentals_4_ordered_types()
  21. {
  22. typedef IntervalMap<T,U> IntervalMapT;
  23. typedef typename IntervalMapT::interval_type IntervalT;
  24. typedef typename IntervalMapT::size_type size_T;
  25. // ordered types is the largest set of instance types.
  26. // Because we can not generate values via incrementation for e.g. string,
  27. // we are able to test operations only for the most basic values
  28. // identity_element (0, empty, T() ...) and unit_element.
  29. T v0 = boost::icl::identity_element<T>::value();
  30. T v1 = unit_element<T>::value();
  31. IntervalT I0_0I(v0);
  32. IntervalT I1_1I(v1);
  33. #ifndef BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  34. IntervalT I0_1I(v0, v1, interval_bounds::closed());
  35. #else
  36. IntervalT I0_1I = icl::interval<T>::closed(v0, v1);
  37. #endif
  38. U u1 = unit_element<U>::value();
  39. //-------------------------------------------------------------------------
  40. //empty set
  41. //-------------------------------------------------------------------------
  42. BOOST_CHECK_EQUAL(IntervalMapT().empty(), true);
  43. BOOST_CHECK_EQUAL(icl::is_empty(IntervalMapT()), true);
  44. BOOST_CHECK_EQUAL(cardinality(IntervalMapT()), boost::icl::identity_element<size_T>::value());
  45. BOOST_CHECK_EQUAL(IntervalMapT().size(), boost::icl::identity_element<size_T>::value());
  46. BOOST_CHECK_EQUAL(icl::size(IntervalMapT()), boost::icl::identity_element<size_T>::value());
  47. BOOST_CHECK_EQUAL(interval_count(IntervalMapT()), 0);
  48. BOOST_CHECK_EQUAL(IntervalMapT().iterative_size(), 0);
  49. BOOST_CHECK_EQUAL(iterative_size(IntervalMapT()), 0);
  50. BOOST_CHECK_EQUAL(IntervalMapT(), IntervalMapT());
  51. IntervalT mt_interval = boost::icl::identity_element<IntervalT >::value();
  52. BOOST_CHECK_EQUAL(mt_interval, IntervalT());
  53. typename IntervalMapT::value_type mt_u1 = make_pair(mt_interval, u1);
  54. IntervalMapT mt_map = boost::icl::identity_element<IntervalMapT >::value();
  55. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  56. //adding emptieness to emptieness yields emptieness ;)
  57. mt_map.add(mt_u1).add(mt_u1);
  58. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  59. mt_map.insert(mt_u1).insert(mt_u1);
  60. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  61. (mt_map += mt_u1) += mt_u1;
  62. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  63. BOOST_CHECK_EQUAL(hull(mt_map), boost::icl::identity_element<IntervalT >::value());
  64. //subtracting emptieness
  65. mt_map.subtract(mt_u1).subtract(mt_u1);
  66. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  67. mt_map.erase(mt_interval).erase(mt_interval);
  68. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  69. (mt_map -= mt_u1) -= mt_u1;
  70. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  71. //subtracting elements form emptieness
  72. typename IntervalMapT::domain_mapping_type v0_u1 = make_pair(v0,u1);
  73. typename IntervalMapT::domain_mapping_type v1_u1 = make_pair(v1,u1);
  74. //mt_map.subtract(make_pair(v0,u1)).subtract(make_pair(v1,u1));
  75. mt_map.subtract(v0_u1).subtract(v1_u1);
  76. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  77. mt_map.erase(v0_u1).erase(v1_u1);
  78. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  79. (mt_map -= v0_u1) -= v1_u1;
  80. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  81. //subtracting intervals form emptieness
  82. typename IntervalMapT::segment_type I0_0I_u1 = make_pair(I0_0I,u1);
  83. typename IntervalMapT::segment_type I0_1I_u1 = make_pair(I0_1I,u1);
  84. typename IntervalMapT::segment_type I1_1I_u1 = make_pair(I1_1I,u1);
  85. mt_map.subtract(I0_1I_u1).subtract(I1_1I_u1);
  86. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  87. mt_map.erase(I0_1I_u1).erase(I1_1I_u1);
  88. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  89. (mt_map -= I0_1I_u1) -= I1_1I_u1;
  90. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  91. mt_map.erase(I0_1I).erase(I1_1I);
  92. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  93. //insecting emptieness
  94. (mt_map &= mt_u1) &= mt_u1;
  95. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  96. (mt_map &= mt_interval) &= mt_interval;
  97. BOOST_CHECK_EQUAL(mt_map, IntervalMapT());
  98. //-------------------------------------------------------------------------
  99. //unary set
  100. //-------------------------------------------------------------------------
  101. IntervalMapT single_I0_0I_u1_from_element(v0_u1);
  102. IntervalMapT single_I0_0I_u1_from_interval(I0_0I_u1);
  103. IntervalMapT single_I0_0I_u1(single_I0_0I_u1_from_interval);
  104. BOOST_CHECK_EQUAL(single_I0_0I_u1_from_element, single_I0_0I_u1_from_interval);
  105. BOOST_CHECK_EQUAL(single_I0_0I_u1_from_element, single_I0_0I_u1);
  106. BOOST_CHECK_EQUAL(hull(single_I0_0I_u1), I0_0I);
  107. BOOST_CHECK_EQUAL(hull(single_I0_0I_u1).lower(), I0_0I.lower());
  108. BOOST_CHECK_EQUAL(hull(single_I0_0I_u1).upper(), I0_0I.upper());
  109. IntervalMapT single_I1_1I_u1_from_element(v1_u1);
  110. IntervalMapT single_I1_1I_u1_from_interval(I1_1I_u1);
  111. IntervalMapT single_I1_1I_u1(single_I1_1I_u1_from_interval);
  112. BOOST_CHECK_EQUAL(single_I1_1I_u1_from_element, single_I1_1I_u1_from_interval);
  113. BOOST_CHECK_EQUAL(single_I1_1I_u1_from_element, single_I1_1I_u1);
  114. IntervalMapT single_I0_1I_u1_from_interval(I0_1I_u1);
  115. IntervalMapT single_I0_1I_u1(single_I0_1I_u1_from_interval);
  116. BOOST_CHECK_EQUAL(single_I0_1I_u1_from_interval, single_I0_1I_u1);
  117. BOOST_CHECK_EQUAL(hull(single_I0_1I_u1), I0_1I);
  118. BOOST_CHECK_EQUAL(hull(single_I0_1I_u1).lower(), I0_1I.lower());
  119. BOOST_CHECK_EQUAL(hull(single_I0_1I_u1).upper(), I0_1I.upper());
  120. //contains predicate
  121. BOOST_CHECK_EQUAL(icl::contains(single_I0_0I_u1, v0), true);
  122. BOOST_CHECK_EQUAL(icl::contains(single_I0_0I_u1, v0_u1), true);
  123. BOOST_CHECK_EQUAL(icl::contains(single_I0_0I_u1, I0_0I_u1), true);
  124. BOOST_CHECK_EQUAL(icl::contains(single_I1_1I_u1, v1), true);
  125. BOOST_CHECK_EQUAL(icl::contains(single_I1_1I_u1, v1_u1), true);
  126. BOOST_CHECK_EQUAL(icl::contains(single_I1_1I_u1, I1_1I_u1), true);
  127. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, v0), true);
  128. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, I0_1I_u1), true);
  129. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, v1), true);
  130. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, I1_1I_u1), true);
  131. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, single_I0_0I_u1), true);
  132. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, single_I1_1I_u1), true);
  133. BOOST_CHECK_EQUAL(icl::contains(single_I0_1I_u1, single_I0_1I_u1), true);
  134. BOOST_CHECK_EQUAL(cardinality(single_I0_0I_u1), unit_element<size_T>::value());
  135. BOOST_CHECK_EQUAL(single_I0_0I_u1.size(), unit_element<size_T>::value());
  136. BOOST_CHECK_EQUAL(interval_count(single_I0_0I_u1), 1);
  137. BOOST_CHECK_EQUAL(single_I0_0I_u1.iterative_size(), 1);
  138. BOOST_CHECK_EQUAL(iterative_size(single_I0_0I_u1), 1);
  139. }
  140. template
  141. <
  142. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  143. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  144. #else
  145. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  146. #endif
  147. class T, class U
  148. >
  149. void interval_map_ctor_4_bicremental_types()
  150. {
  151. typedef IntervalMap<T,U> IntervalMapT;
  152. typedef typename IntervalMapT::interval_type IntervalT;
  153. T v4 = make<T>(4);
  154. U u2 = make<U>(2);
  155. IntervalT I4_4I(v4);
  156. typename IntervalMapT::domain_mapping_type v4_u2(v4,u2);
  157. typename IntervalMapT::value_type I4_4I_u2(I4_4I,u2);
  158. IntervalMapT _I4_4I_u2;
  159. BOOST_CHECK_EQUAL( _I4_4I_u2.empty(), true );
  160. IntervalMapT _I4_4I_u2_1;
  161. IntervalMapT _I4_4I_u2_2;
  162. IntervalMapT _I4_4I_u2_3;
  163. _I4_4I_u2 += v4_u2;
  164. _I4_4I_u2_1 += I4_4I_u2;
  165. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_1 );
  166. _I4_4I_u2_2.add(v4_u2);
  167. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_2 );
  168. _I4_4I_u2_3.add(I4_4I_u2);
  169. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_3 );
  170. _I4_4I_u2.clear();
  171. _I4_4I_u2.add(I4_4I_u2).add(I4_4I_u2);
  172. IntervalMapT _I4_4I_u4(make_pair(I4_4I, make<U>(4)));
  173. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u4 );
  174. _I4_4I_u2.clear();
  175. _I4_4I_u2.insert(I4_4I_u2).insert(I4_4I_u2);
  176. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_1 );
  177. BOOST_CHECK_EQUAL( cardinality(_I4_4I_u2), unit_element<typename IntervalMapT::size_type>::value() );
  178. BOOST_CHECK_EQUAL( _I4_4I_u2.size(), unit_element<typename IntervalMapT::size_type>::value() );
  179. BOOST_CHECK_EQUAL( interval_count(_I4_4I_u2), 1 );
  180. BOOST_CHECK_EQUAL( _I4_4I_u2.iterative_size(), 1 );
  181. BOOST_CHECK_EQUAL( iterative_size(_I4_4I_u2), 1 );
  182. if(has_dynamic_bounds<IntervalT>::value)
  183. {
  184. BOOST_CHECK_EQUAL( hull(_I4_4I_u2).lower(), v4 );
  185. BOOST_CHECK_EQUAL( hull(_I4_4I_u2).upper(), v4 );
  186. }
  187. IntervalMapT _I4_4I_u2_copy(_I4_4I_u2);
  188. IntervalMapT _I4_4I_u2_assigned;
  189. _I4_4I_u2_assigned = _I4_4I_u2;
  190. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_copy );
  191. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_assigned );
  192. _I4_4I_u2_assigned.clear();
  193. BOOST_CHECK_EQUAL( true, _I4_4I_u2_assigned.empty() );
  194. _I4_4I_u2_assigned.swap(_I4_4I_u2_copy);
  195. BOOST_CHECK_EQUAL( true, _I4_4I_u2_copy.empty() );
  196. BOOST_CHECK_EQUAL( _I4_4I_u2, _I4_4I_u2_assigned );
  197. }
  198. template
  199. <
  200. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  201. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  202. #else
  203. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  204. #endif
  205. class T, class U
  206. >
  207. void interval_map_add_sub_4_bicremental_types()
  208. {
  209. typedef IntervalMap<T,U> IntervalMapT;
  210. typedef typename IntervalMapT::interval_type IntervalT;
  211. T v0 = make<T>(0);
  212. T v5 = make<T>(5);
  213. T v6 = make<T>(6);
  214. T v9 = make<T>(9);
  215. U u1 = make<U>(1);
  216. #ifndef BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  217. IntervalT I5_6I(v5,v6, interval_bounds::closed());
  218. IntervalT I5_9I(v5,v9, interval_bounds::closed());
  219. IntervalT I0_9I = IntervalT::closed(v0, v9);
  220. #else
  221. IntervalT I5_6I = icl::interval<T>::closed(v5,v6);
  222. IntervalT I5_9I = icl::interval<T>::closed(v5,v9);
  223. IntervalT I0_9I = icl::interval<T>::closed(v0,v9);
  224. #endif
  225. typename IntervalMapT::domain_mapping_type v0_u1 = make_pair(v0, u1);
  226. typename IntervalMapT::domain_mapping_type v9_u1 = make_pair(v9, u1);
  227. typename IntervalMapT::value_type I5_6I_u1 = make_pair(I5_6I, u1);
  228. typename IntervalMapT::value_type I5_9I_u1 = make_pair(I5_9I, u1);
  229. BOOST_CHECK_EQUAL( IntervalMapT(I5_6I_u1).add(v0_u1).add(v9_u1),
  230. IntervalMapT().add(v9_u1).add(I5_6I_u1).add(v0_u1) );
  231. IntervalMapT map_A = IntervalMapT(I5_6I_u1).add(v0_u1).add(v9_u1);
  232. IntervalMapT map_B = IntervalMapT().insert(v9_u1).insert(I5_6I_u1).insert(v0_u1);
  233. BOOST_CHECK_EQUAL( map_A, map_B );
  234. BOOST_CHECK_EQUAL( hull(map_A), I0_9I );
  235. BOOST_CHECK_EQUAL( hull(map_A).lower(), I0_9I.lower() );
  236. BOOST_CHECK_EQUAL( hull(map_A).upper(), I0_9I.upper() );
  237. IntervalMapT map_A1 = map_A, map_B1 = map_B,
  238. map_A2 = map_A, map_B2 = map_B;
  239. map_A1.subtract(I5_6I_u1).subtract(v9_u1);
  240. map_B1.erase(v9_u1).erase(I5_6I_u1);
  241. BOOST_CHECK_EQUAL( map_A1, map_B1 );
  242. map_B1 = map_B;
  243. map_B2.erase(v9).erase(I5_6I);
  244. BOOST_CHECK_EQUAL( map_A1, map_B2 );
  245. map_A2.subtract(I5_9I_u1);
  246. map_B2.erase(I5_9I);
  247. BOOST_CHECK_EQUAL( map_A2, map_B2 );
  248. }
  249. template
  250. <
  251. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  252. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  253. #else
  254. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  255. #endif
  256. class T, class U
  257. >
  258. void interval_map_distinct_4_bicremental_types()
  259. {
  260. typedef IntervalMap<T,U> IntervalMapT;
  261. typedef typename IntervalMap<T,U>::size_type size_T;
  262. T v1 = make<T>(1);
  263. T v3 = make<T>(3);
  264. T v5 = make<T>(5);
  265. U u1 = make<U>(1);
  266. typename IntervalMapT::domain_mapping_type v1_u1(v1,u1);
  267. typename IntervalMapT::domain_mapping_type v3_u1(v3,u1);
  268. typename IntervalMapT::domain_mapping_type v5_u1(v5,u1);
  269. size_T s3 = make<size_T>(3);
  270. IntervalMapT is_1_3_5;
  271. is_1_3_5.add(v1_u1).add(v3_u1).add(v5_u1);
  272. BOOST_CHECK_EQUAL( cardinality(is_1_3_5), s3 );
  273. BOOST_CHECK_EQUAL( is_1_3_5.size(), s3 );
  274. BOOST_CHECK_EQUAL( interval_count(is_1_3_5), 3 );
  275. BOOST_CHECK_EQUAL( is_1_3_5.iterative_size(), 3 );
  276. BOOST_CHECK_EQUAL( iterative_size(is_1_3_5), 3 );
  277. }
  278. template
  279. <
  280. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  281. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  282. #else
  283. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  284. #endif
  285. class T, class U
  286. >
  287. void interval_map_distinct_4_bicremental_continuous_types()
  288. {
  289. #ifndef BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  290. typedef IntervalMap<T,U> IntervalMapT;
  291. typedef typename IntervalMapT::size_type size_T;
  292. typedef typename IntervalMapT::difference_type diff_T;
  293. T v1 = make<T>(1);
  294. T v3 = make<T>(3);
  295. T v5 = make<T>(5);
  296. U u1 = make<U>(1);
  297. typename IntervalMapT::domain_mapping_type v1_u1(v1,u1);
  298. typename IntervalMapT::domain_mapping_type v3_u1(v3,u1);
  299. typename IntervalMapT::domain_mapping_type v5_u1(v5,u1);
  300. size_T s3 = make<size_T>(3);
  301. diff_T d0 = make<diff_T>(0);
  302. diff_T d2 = make<diff_T>(2);
  303. IntervalMapT is_1_3_5;
  304. is_1_3_5.add(v1_u1).add(v3_u1).add(v5_u1);
  305. BOOST_CHECK_EQUAL( cardinality(is_1_3_5), s3 );
  306. BOOST_CHECK_EQUAL( is_1_3_5.size(), s3 );
  307. icl::length(is_1_3_5);
  308. BOOST_CHECK_EQUAL( icl::length(is_1_3_5), d0 );
  309. BOOST_CHECK_EQUAL( interval_count(is_1_3_5), 3 );
  310. BOOST_CHECK_EQUAL( is_1_3_5.iterative_size(), 3 );
  311. BOOST_CHECK_EQUAL( iterative_size(is_1_3_5), 3 );
  312. IntervalMapT is_123_5;
  313. is_123_5 = is_1_3_5;
  314. //OPROM: open problem: Ambiguity resolving value_type and mapping_type for overloaded o= operators.
  315. //is_123_5 += make_pair(IntervalT::open(v1,v3),u1); //error C2593: 'operator +=' is ambiguous
  316. //is_123_5 += make_pair<IntervalT, U>(IntervalT::open(v1,v3),u1); //error C2593: 'operator +=' is ambiguous
  317. //USASO: unsatisfctory solution 1: explicit IntervalMapT::value_type instead of make_pair
  318. is_123_5 += typename IntervalMapT::value_type(icl::interval<T>::open(v1,v3),u1);
  319. //USASO: unsatisfctory solution 2: not implementing mapping_type version of o=
  320. BOOST_CHECK_EQUAL( cardinality(is_123_5), icl::infinity<size_T>::value() );
  321. BOOST_CHECK_EQUAL( is_123_5.size(), icl::infinity<size_T>::value() );
  322. BOOST_CHECK_EQUAL( icl::length(is_123_5), d2 );
  323. #endif //BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  324. }
  325. template
  326. <
  327. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  328. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  329. #else
  330. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  331. #endif
  332. class T, class U
  333. >
  334. void interval_map_isolate_4_bicremental_continuous_types()
  335. {
  336. #ifndef BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  337. typedef IntervalMap<T,U> IntervalMapT;
  338. typedef typename IntervalMapT::interval_type IntervalT;
  339. typedef typename IntervalMapT::size_type size_T;
  340. T v0 = make<T>(0);
  341. T v2 = make<T>(2);
  342. T v4 = make<T>(4);
  343. U u1 = make<U>(1);
  344. IntervalT I0_4I = icl::interval<T>::closed(v0,v4);
  345. IntervalT C0_2D = icl::interval<T>::open(v0,v2);
  346. IntervalT C2_4D = icl::interval<T>::open(v2,v4);
  347. typename IntervalMapT::value_type I0_4I_u1(I0_4I,u1);
  348. typename IntervalMapT::value_type C0_2D_u1(C0_2D,u1);
  349. typename IntervalMapT::value_type C2_4D_u1(C2_4D,u1);
  350. // {[0 4]}
  351. // - { (0,2) (2,4) }
  352. // = {[0] [2] [4]}
  353. IntervalMapT iso_map = IntervalMapT(I0_4I_u1);
  354. IntervalMapT gap_set;
  355. gap_set.add(C0_2D_u1).add(C2_4D_u1);
  356. iso_map -= gap_set;
  357. BOOST_CHECK_EQUAL( cardinality(iso_map), static_cast<size_T>(3) );
  358. BOOST_CHECK_EQUAL( iso_map.iterative_size(), static_cast<std::size_t>(3) );
  359. BOOST_CHECK_EQUAL( iterative_size(iso_map), static_cast<std::size_t>(3) );
  360. BOOST_CHECK_EQUAL( iterative_size(iso_map), static_cast<std::size_t>(3) );
  361. IntervalMapT iso_map2;
  362. iso_map2.add(I0_4I_u1);
  363. iso_map2.subtract(C0_2D_u1).subtract(C2_4D_u1);
  364. IntervalMapT iso_map3(I0_4I_u1);
  365. (iso_map3 -= C0_2D_u1) -= C2_4D_u1;
  366. IntervalMapT iso_map4;
  367. iso_map4.insert(I0_4I_u1);
  368. iso_map4.erase(C0_2D_u1).erase(C2_4D_u1);
  369. BOOST_CHECK_EQUAL( iso_map, iso_map2 );
  370. BOOST_CHECK_EQUAL( iso_map, iso_map3 );
  371. BOOST_CHECK_EQUAL( iso_map, iso_map4 );
  372. #endif //BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  373. }
  374. template
  375. <
  376. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  377. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  378. #else
  379. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  380. #endif
  381. class T, class U
  382. >
  383. void interval_map_contains_4_bicremental_types()
  384. {
  385. typedef IntervalMap<T,U> IntervalMapT;
  386. typedef typename IntervalMapT::set_type IntervalSetT;
  387. IntervalMapT itv_map;
  388. itv_map.add(K_v(3,1));
  389. BOOST_CHECK_EQUAL( icl::contains(itv_map, MK_v(3)), true );
  390. BOOST_CHECK_EQUAL( icl::contains(itv_map, K_v(3,1)), true );
  391. BOOST_CHECK_EQUAL( icl::contains(IntervalMapT().add(K_v(3,1)), K_v(3,1)), true );
  392. BOOST_CHECK_EQUAL( icl::contains(IntervalMapT().add(K_v(3,1)), MK_v(3)), true );
  393. BOOST_CHECK_EQUAL( icl::contains(IntervalMapT().insert(K_v(3,1)), K_v(3,1)), true );
  394. itv_map.clear();
  395. BOOST_CHECK_EQUAL( icl::contains((itv_map += IIv(3,7,1)), IIv(3,7,1)), true );
  396. BOOST_CHECK_EQUAL( icl::contains(itv_map, IIv(3,7,2)), false );
  397. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(3,7)), true );
  398. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(4,6)), true );
  399. BOOST_CHECK_EQUAL( icl::contains((itv_map += CIv(7,9,1)),IIv(3,9,1)), true );
  400. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(4,8)), true );
  401. BOOST_CHECK_EQUAL( icl::contains((itv_map += IIv(11,12,1)), IIv(3,12,1)), false );
  402. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(4,11)), false );
  403. IntervalMapT itv_map0 = itv_map;
  404. itv_map.clear();
  405. IntervalMapT itv_map2(IIv(5,8,1));
  406. itv_map2.add(K_v(9,1)).add(K_v(11,1));
  407. itv_map += itv_map2;
  408. BOOST_CHECK_EQUAL( icl::contains(itv_map, itv_map2), true );
  409. IntervalSetT itv_set2;
  410. icl::domain(itv_set2, itv_map2);
  411. BOOST_CHECK_EQUAL( icl::contains(itv_map, itv_set2), true );
  412. }
  413. template
  414. <
  415. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  416. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  417. #else
  418. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  419. #endif
  420. class T, class U
  421. >
  422. void interval_map_contains_key_objects_4_bicremental_types()
  423. {
  424. typedef IntervalMap<T,U> IntervalMapT;
  425. typedef typename IntervalMapT::set_type IntervalSetT;
  426. IntervalMapT itv_map;
  427. itv_map.add(IDv(1,3,1));
  428. BOOST_CHECK_EQUAL( icl::contains(itv_map, MK_v(0)), false );
  429. BOOST_CHECK_EQUAL( icl::contains(itv_map, MK_v(2)), true );
  430. BOOST_CHECK_EQUAL( icl::contains(itv_map, MK_v(3)), false );
  431. itv_map.add(IDv(3,6,2));
  432. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(0,0)), false );
  433. contains(itv_map, I_I(2,4));
  434. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(2,4)), true );
  435. BOOST_CHECK_EQUAL( icl::contains(itv_map, I_I(6,6)), false );
  436. itv_map.add(IDv(8,9,2));
  437. IntervalSetT itv_set;
  438. itv_set.add(C_I(1,2)).add(C_D(2,6)).add(I_I(8,8));
  439. BOOST_CHECK_EQUAL( icl::contains(itv_map, itv_set), true );
  440. itv_set.add(I_I(1,4));
  441. BOOST_CHECK_EQUAL( icl::contains(itv_map, itv_set), true );
  442. itv_set.add(I_I(1,4));
  443. BOOST_CHECK_EQUAL( icl::contains(itv_map, itv_set), true );
  444. itv_set.add(I_I(7,7));
  445. BOOST_CHECK_EQUAL( icl::contains(itv_map, itv_set), false );
  446. }
  447. template
  448. <
  449. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  450. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  451. #else
  452. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  453. #endif
  454. class T, class U
  455. >
  456. void interval_map_operators_4_bicremental_types()
  457. {
  458. typedef IntervalMap<T,U> IntervalMapT;
  459. T v0 = make<T>(0);
  460. T v1 = make<T>(1);
  461. T v3 = make<T>(3);
  462. T v5 = make<T>(5);
  463. T v7 = make<T>(7);
  464. T v8 = make<T>(8);
  465. U u1 = make<U>(1);
  466. //typename IntervalMapT::interval_type I3_5I(icl::interval<T>::closed(v3,v5));
  467. typename IntervalMapT::value_type I0_1I_u1(icl::interval<T>::closed(v0,v1),u1);
  468. typename IntervalMapT::value_type I3_5I_u1(icl::interval<T>::closed(v3,v5),u1);
  469. typename IntervalMapT::value_type I7_8I_u1(icl::interval<T>::closed(v7,v8),u1);
  470. IntervalMapT left, left2, right, all, section, complement;
  471. left.add(I0_1I_u1).add(I3_5I_u1);
  472. (right += I3_5I_u1) += I7_8I_u1;
  473. BOOST_CHECK_EQUAL( disjoint(left, right), false );
  474. BOOST_CHECK_EQUAL( intersects(left, right), true );
  475. (all += left) += right;
  476. (section += left) &= right;
  477. all -= section;
  478. complement += all;
  479. //complement.erase(I3_5I);
  480. icl::erase(complement, section);
  481. BOOST_CHECK_EQUAL( disjoint(section, complement), true );
  482. BOOST_CHECK_EQUAL( intersects(section, complement), false );
  483. }
  484. // Test for nontrivial intersection of interval maps with intervals and values
  485. template
  486. <
  487. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  488. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  489. #else
  490. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  491. #endif
  492. class T, class U
  493. >
  494. void interval_map_base_intersect_4_bicremental_types()
  495. {
  496. typedef IntervalMap<T,U> IntervalMapT;
  497. typedef typename IntervalMapT::interval_type IntervalT;
  498. T v0 = make<T>(0);
  499. T v1 = make<T>(1);
  500. T v2 = make<T>(2);
  501. T v3 = make<T>(3);
  502. T v4 = make<T>(4);
  503. T v5 = make<T>(5);
  504. T v6 = make<T>(6);
  505. T v7 = make<T>(7);
  506. T v8 = make<T>(8);
  507. T v9 = make<T>(9);
  508. U u1 = make<U>(1);
  509. IntervalT I0_3D = icl::interval<T>::right_open(v0,v3);
  510. IntervalT I1_3D = icl::interval<T>::right_open(v1,v3);
  511. IntervalT I1_4D = icl::interval<T>::right_open(v1,v4);
  512. IntervalT I1_8D = icl::interval<T>::right_open(v1,v8);
  513. IntervalT I2_7D = icl::interval<T>::right_open(v2,v7);
  514. IntervalT I2_3D = icl::interval<T>::right_open(v2,v3);
  515. IntervalT I5_8D = icl::interval<T>::right_open(v5,v8);
  516. IntervalT I6_7D = icl::interval<T>::right_open(v6,v7);
  517. IntervalT I6_8D = icl::interval<T>::right_open(v6,v8);
  518. IntervalT I6_9D = icl::interval<T>::right_open(v6,v9);
  519. typename IntervalMapT::value_type I0_3D_1(I0_3D, u1);
  520. typename IntervalMapT::value_type I6_9D_1(I6_9D, u1);
  521. typename IntervalMapT::value_type I1_3D_1(I1_3D, u1);
  522. typename IntervalMapT::value_type I6_8D_1(I6_8D, u1);
  523. typename IntervalMapT::value_type I2_3D_1(I2_3D, u1);
  524. typename IntervalMapT::value_type I6_7D_1(I6_7D, u1);
  525. //--------------------------------------------------------------------------
  526. //map_A [0 3) [6 9)
  527. // 1 1
  528. // &= [1 8)
  529. //map_AB -> [1 3) [6 8)
  530. // 1 1
  531. // &= [2 7)
  532. // -> [2 3) [6 7)
  533. // 1 1
  534. IntervalMap<T,U> map_A, map_AB, map_ab, map_ab2;
  535. interval_set<T> set_B;
  536. map_A.add(I0_3D_1).add(I6_9D_1);
  537. map_AB = map_A;
  538. map_AB &= I1_8D;
  539. map_ab.add(I1_3D_1).add(I6_8D_1);
  540. BOOST_CHECK_EQUAL( map_AB, map_ab );
  541. map_AB = map_A;
  542. (map_AB &= I1_8D) &= I2_7D;
  543. map_ab2.add(I2_3D_1).add(I6_7D_1);
  544. BOOST_CHECK_EQUAL( map_AB, map_ab2 );
  545. //--------------------------------------------------------------------------
  546. //map_A [0 3) [6 9)
  547. // 1 1
  548. // &= [1 4) [5 8)
  549. //map_AB -> [1 3) [6 8)
  550. // 1 1
  551. // &= [2 4) [5 7)
  552. // -> [2 3) [6 7)
  553. // 1 1
  554. map_A.clear();
  555. map_A.add(I0_3D_1).add(I6_9D_1);
  556. set_B.add(I1_4D).add(I5_8D);
  557. map_AB = map_A;
  558. map_AB &= set_B;
  559. map_ab.clear();
  560. map_ab.add(I1_3D_1).add(I6_8D_1);
  561. BOOST_CHECK_EQUAL( map_AB, map_ab );
  562. //--------------------------------------------------------------------------
  563. //map_A [0 3) [6 9)
  564. // 1 1
  565. // &= 1
  566. //map_AB -> [1]
  567. // 1
  568. map_A.clear();
  569. map_A.add(I0_3D_1).add(I6_9D_1);
  570. map_AB = map_A;
  571. map_AB &= v1;
  572. map_ab.clear();
  573. map_ab.add(mapping_pair<T,U>(v1,u1));
  574. BOOST_CHECK_EQUAL( map_AB, map_ab );
  575. }
  576. // Test for nontrivial erasure of interval maps with intervals and interval sets
  577. template
  578. <
  579. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  580. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  581. #else
  582. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  583. #endif
  584. class T, class U
  585. >
  586. void interval_map_base_erase_4_bicremental_types()
  587. {
  588. typedef IntervalMap<T,U> IntervalMapT;
  589. typedef typename IntervalMapT::interval_type IntervalT;
  590. T v0 = make<T>(0);
  591. T v1 = make<T>(1);
  592. T v2 = make<T>(2);
  593. T v3 = make<T>(3);
  594. T v4 = make<T>(4);
  595. T v5 = make<T>(5);
  596. T v6 = make<T>(6);
  597. T v7 = make<T>(7);
  598. T v8 = make<T>(8);
  599. T v9 = make<T>(9);
  600. U u1 = make<U>(1);
  601. IntervalT I0_1D = icl::interval<T>::right_open(v0,v1);
  602. IntervalT I0_2D = icl::interval<T>::right_open(v0,v2);
  603. IntervalT I0_3D = icl::interval<T>::right_open(v0,v3);
  604. IntervalT I1_3D = icl::interval<T>::right_open(v1,v3);
  605. //IntervalT I1_4D = icl::interval<T>::right_open(v1,v4);
  606. IntervalT I1_8D = icl::interval<T>::right_open(v1,v8);
  607. IntervalT I2_4D = icl::interval<T>::right_open(v2,v4);
  608. IntervalT I2_7D = icl::interval<T>::right_open(v2,v7);
  609. IntervalT I2_3D = icl::interval<T>::right_open(v2,v3);
  610. IntervalT I5_7D = icl::interval<T>::right_open(v5,v7);
  611. //IntervalT I5_8D = icl::interval<T>::right_open(v5,v8);
  612. IntervalT I6_7D = icl::interval<T>::right_open(v6,v7);
  613. IntervalT I6_8D = icl::interval<T>::right_open(v6,v8);
  614. IntervalT I6_9D = icl::interval<T>::right_open(v6,v9);
  615. IntervalT I7_9D = icl::interval<T>::right_open(v7,v9);
  616. IntervalT I8_9D = icl::interval<T>::right_open(v8,v9);
  617. typename IntervalMapT::value_type I0_1D_1(I0_1D, u1);
  618. typename IntervalMapT::value_type I0_3D_1(I0_3D, u1);
  619. typename IntervalMapT::value_type I0_2D_1(I0_2D, u1);
  620. typename IntervalMapT::value_type I6_9D_1(I6_9D, u1);
  621. typename IntervalMapT::value_type I1_3D_1(I1_3D, u1);
  622. typename IntervalMapT::value_type I6_8D_1(I6_8D, u1);
  623. typename IntervalMapT::value_type I2_3D_1(I2_3D, u1);
  624. typename IntervalMapT::value_type I6_7D_1(I6_7D, u1);
  625. typename IntervalMapT::value_type I7_9D_1(I7_9D, u1);
  626. typename IntervalMapT::value_type I8_9D_1(I8_9D, u1);
  627. //--------------------------------------------------------------------------
  628. //map_A [0 3) [6 9)
  629. // 1 1
  630. // erase [2 7)
  631. //map_A2 -> [0 2) [7 9)
  632. // 1 1
  633. // erase [1 8)
  634. // -> [0 1) [8 9)
  635. // 1 1
  636. IntervalMap<T,U> map_A, map_A2, map_A3, map_check2, map_check3;
  637. interval_set<T> set_B;
  638. map_A.add(I0_3D_1).add(I6_9D_1);
  639. map_A2 = map_A;
  640. map_A2.erase(I2_7D);
  641. map_check2.add(I0_2D_1).add(I7_9D_1);
  642. BOOST_CHECK_EQUAL( map_A2, map_check2 );
  643. map_A3 = map_A2;
  644. map_A3.erase(I1_8D);
  645. map_check3.add(I0_1D_1).add(I8_9D_1);
  646. BOOST_CHECK_EQUAL( map_A3, map_check3 );
  647. //--------------------------------------------------------------------------
  648. //map_A [0 3) [6 9)
  649. // 1 1
  650. // erase [2 7)
  651. // -> [0 2) [7 9)
  652. // 1 1
  653. // erase [1 8)
  654. // -> [0 1) [8 9)
  655. // 1 1
  656. map_A3 = map_A;
  657. map_A3.erase(I2_7D).erase(I1_8D);
  658. BOOST_CHECK_EQUAL( map_A3, map_check3 );
  659. //--------------------------------------------------------------------------
  660. //map_A [0 3) [6 9)
  661. // 1 1
  662. // -= [2 7)
  663. // -> [0 2) [7 9)
  664. // 1 1
  665. // -= [1 8)
  666. // -> [0 1) [8 9)
  667. // 1 1
  668. map_A3 = map_A;
  669. (map_A3 -= I2_7D) -= I1_8D;
  670. BOOST_CHECK_EQUAL( map_A3, map_check3 );
  671. //--------------------------------------------------------------------------
  672. //map_A [0 3) [6 9)
  673. // 1 1
  674. // erase [2 4) [5 7)
  675. // -> [0 2) [7 9)
  676. // 1 1
  677. map_A3 = map_A;
  678. set_B.add(I2_4D).add(I5_7D);
  679. map_A3 -= set_B;
  680. BOOST_CHECK_EQUAL( map_A3, map_check2 );
  681. }
  682. // Test first_collision
  683. template
  684. <
  685. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  686. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  687. #else
  688. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  689. #endif
  690. class T, class U
  691. >
  692. void interval_map_base_is_disjoint_4_bicremental_types()
  693. {
  694. typedef IntervalMap<T,U> IntervalMapT;
  695. typedef typename IntervalMapT::interval_type IntervalT;
  696. typedef typename IntervalMap<T,U>::interval_set_type IntervalSetT;
  697. T v0 = make<T>(0);
  698. T v1 = make<T>(1);
  699. T v3 = make<T>(3);
  700. T v5 = make<T>(5);
  701. T v6 = make<T>(6);
  702. T v7 = make<T>(7);
  703. T v8 = make<T>(8);
  704. T v9 = make<T>(9);
  705. U u1 = make<U>(1);
  706. IntervalT I0_1D = icl::interval<T>::right_open(v0,v1);
  707. IntervalT I1_3D = icl::interval<T>::right_open(v1,v3);
  708. IntervalT I3_6D = icl::interval<T>::right_open(v3,v6);
  709. IntervalT I5_7D = icl::interval<T>::right_open(v5,v7);
  710. IntervalT I6_8D = icl::interval<T>::right_open(v6,v8);
  711. IntervalT I8_9D = icl::interval<T>::right_open(v8,v9);
  712. typename IntervalMapT::value_type I0_1D_1(I0_1D, u1);
  713. typename IntervalMapT::value_type I1_3D_1(I1_3D, u1);
  714. typename IntervalMapT::value_type I3_6D_1(I3_6D, u1);
  715. typename IntervalMapT::value_type I5_7D_1(I5_7D, u1);
  716. typename IntervalMapT::value_type I6_8D_1(I6_8D, u1);
  717. typename IntervalMapT::value_type I8_9D_1(I8_9D, u1);
  718. //--------------------------------------------------------------------------
  719. //map_A [1 3) [6 8)
  720. // 1 1
  721. //map_B [0 1) [3 6) [8 9)
  722. // 1 1 1
  723. IntervalMapT map_A, map_B;
  724. IntervalSetT set_A, set_B;
  725. map_A.add(I1_3D_1).add(I6_8D_1);
  726. map_B.add(I0_1D_1).add(I3_6D_1).add(I8_9D_1);
  727. BOOST_CHECK_EQUAL( disjoint(map_A, map_B), true );
  728. BOOST_CHECK_EQUAL( disjoint(map_B, map_A), true );
  729. BOOST_CHECK_EQUAL( intersects(map_A, map_B), false );
  730. BOOST_CHECK_EQUAL( intersects(map_B, map_A), false );
  731. icl::domain(set_A, map_A);
  732. icl::domain(set_B, map_B);
  733. BOOST_CHECK_EQUAL( disjoint(map_A, set_B), true );
  734. BOOST_CHECK_EQUAL( disjoint(set_B, map_A), true );
  735. BOOST_CHECK_EQUAL( disjoint(set_A, map_B), true );
  736. BOOST_CHECK_EQUAL( disjoint(map_B, set_A), true );
  737. BOOST_CHECK_EQUAL( intersects(map_A, set_B), false );
  738. BOOST_CHECK_EQUAL( intersects(set_B, map_A), false );
  739. BOOST_CHECK_EQUAL( intersects(set_A, map_B), false );
  740. BOOST_CHECK_EQUAL( intersects(map_B, set_A), false );
  741. map_A += I5_7D_1;
  742. BOOST_CHECK_EQUAL( disjoint(map_A, map_B), false );
  743. BOOST_CHECK_EQUAL( disjoint(map_B, map_A), false );
  744. BOOST_CHECK_EQUAL( intersects(map_A, map_B), true );
  745. BOOST_CHECK_EQUAL( intersects(map_B, map_A), true );
  746. icl::domain(set_A, map_A);
  747. icl::domain(set_B, map_B);
  748. BOOST_CHECK_EQUAL( disjoint(map_A, set_B), false );
  749. BOOST_CHECK_EQUAL( disjoint(set_B, map_A), false );
  750. BOOST_CHECK_EQUAL( disjoint(set_A, map_B), false );
  751. BOOST_CHECK_EQUAL( disjoint(map_B, set_A), false );
  752. BOOST_CHECK_EQUAL( intersects(map_A, set_B), true );
  753. BOOST_CHECK_EQUAL( intersects(set_B, map_A), true );
  754. BOOST_CHECK_EQUAL( intersects(set_A, map_B), true );
  755. BOOST_CHECK_EQUAL( intersects(map_B, set_A), true );
  756. }
  757. template
  758. <
  759. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  760. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  761. #else
  762. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  763. #endif
  764. class T, class U
  765. >
  766. void interval_map_flip_4_bicremental_types()
  767. {
  768. typedef IntervalMap<T,U> IntervalMapT;
  769. typedef IntervalMapT IMap;
  770. IntervalMapT set_a;
  771. //[0 2)
  772. // 1
  773. // [1 3)
  774. // 1
  775. //[0 1) [2 3) : {[0 2)->1} ^= ([2 3)->1)
  776. // 1 1
  777. //BOOST_CHECK_EQUAL(IMap(IDv(0,2,1)) ^= (IDv(1,3,1)), IMap(IDv(0,1,1)) + IDv(2,3,1));
  778. set_a = IMap(IDv(0,2,1));
  779. IntervalMapT set_b = set_a;
  780. BOOST_CHECK_EQUAL(set_a ^= IDv(1,3,1), IMap(IDv(0,1,1)) + IDv(2,3,1));
  781. }
  782. template
  783. <
  784. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  785. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  786. #else
  787. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  788. #endif
  789. class T, class U
  790. >
  791. void interval_map_infix_plus_overload_4_bicremental_types()
  792. {
  793. typedef IntervalMap<T,U> IntervalMapT;
  794. typedef typename IntervalMapT::interval_type IntervalT;
  795. typename IntervalMapT::interval_mapping_type val_pair1 = IDv(6,9,1);
  796. std::pair<const IntervalT, U> val_pair2 = IDv(3,5,3);
  797. mapping_pair<T,U> map_pair = K_v(4,3);
  798. IntervalMapT map_a, map_b;
  799. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  800. map_b.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  801. BOOST_CHECK_EQUAL(map_a + map_b, map_b + map_a);
  802. //This checks all cases of is_interval_map_derivative<T>
  803. BOOST_CHECK_EQUAL(map_a + val_pair1, val_pair1 + map_a);
  804. BOOST_CHECK_EQUAL(map_b + val_pair2, val_pair2 + map_b);
  805. BOOST_CHECK_EQUAL(map_b + map_pair, map_pair + map_b);
  806. }
  807. template
  808. <
  809. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  810. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  811. #else
  812. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  813. #endif
  814. class T, class U
  815. >
  816. void interval_map_infix_pipe_overload_4_bicremental_types()
  817. {
  818. typedef IntervalMap<T,U> IntervalMapT;
  819. typedef typename IntervalMapT::interval_type IntervalT;
  820. typename IntervalMapT::interval_mapping_type val_pair1 = IDv(6,9,1);
  821. std::pair<const IntervalT, U> val_pair2 = IDv(3,5,3);
  822. mapping_pair<T,U> map_pair = K_v(4,3);
  823. IntervalMapT map_a, map_b;
  824. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  825. map_b.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  826. BOOST_CHECK_EQUAL(map_a | map_b, map_b | map_a);
  827. //This checks all cases of is_interval_map_derivative<T>
  828. BOOST_CHECK_EQUAL(map_a | val_pair1, val_pair1 | map_a);
  829. BOOST_CHECK_EQUAL(map_b | val_pair2, val_pair2 | map_b);
  830. BOOST_CHECK_EQUAL(map_b | map_pair, map_pair | map_b);
  831. }
  832. template
  833. <
  834. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  835. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  836. #else
  837. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  838. #endif
  839. class T, class U
  840. >
  841. void interval_map_infix_minus_overload_4_bicremental_types()
  842. {
  843. typedef IntervalMap<T,U> IntervalMapT;
  844. typedef typename IntervalMapT::interval_type IntervalT;
  845. typename IntervalMapT::interval_mapping_type val_pair1 = IDv(6,9,1);
  846. std::pair<const IntervalT, U> val_pair2 = IDv(3,5,3);
  847. mapping_pair<T,U> map_pair = K_v(4,3);
  848. IntervalT itv = C_D(4,11);
  849. typename IntervalMapT::interval_mapping_type itv_v = CDv(4,11,3);
  850. IntervalMapT map_a, map_b, map_c;
  851. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  852. map_b.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  853. map_c = map_a;
  854. interval_set<T> join_set_a;
  855. separate_interval_set<T> sep_set_a;
  856. split_interval_set<T> split_set_a;
  857. join_set_a .add(I_D(0,4)).add(I_I(4,6)).add(I_D(5,9));
  858. sep_set_a .add(I_D(0,4)).add(I_I(4,6)).add(I_D(5,11));
  859. split_set_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  860. //Happy day overloading
  861. BOOST_CHECK_EQUAL(map_a - map_b, (map_c = map_a) -= map_b);
  862. BOOST_CHECK_EQUAL(map_a - map_b, map_c);
  863. //This checks all cases of is_interval_map_derivative<T>
  864. BOOST_CHECK_EQUAL((map_a - val_pair1) + val_pair1, (map_a + val_pair1) - val_pair1);
  865. BOOST_CHECK_EQUAL((map_b - val_pair2) + val_pair2, (map_b + val_pair2) - val_pair2);
  866. BOOST_CHECK_EQUAL((map_b - map_pair) + map_pair, (map_b + map_pair) - map_pair);
  867. //This checks all cases of is_interval_set_derivative<T>
  868. BOOST_CHECK_EQUAL(map_a - itv, (map_a + itv_v) - itv);
  869. BOOST_CHECK_EQUAL(map_b - MK_v(8), (IIv(8,8,3) + map_b) - MK_v(8));
  870. //This checks all cases of is_interval_set_companion<T>
  871. BOOST_CHECK_EQUAL(map_a - split_set_a, ((split_set_a & map_a) + map_a) - split_set_a);
  872. BOOST_CHECK_EQUAL(map_a - sep_set_a, ((sep_set_a & map_a) + map_a) - sep_set_a);
  873. BOOST_CHECK_EQUAL(map_a - join_set_a, ((join_set_a & map_a) + map_a) - join_set_a);
  874. }
  875. template
  876. <
  877. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  878. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  879. #else
  880. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  881. #endif
  882. class T, class U
  883. >
  884. void interval_map_infix_et_overload_4_bicremental_types()
  885. {
  886. typedef IntervalMap<T,U> IntervalMapT;
  887. typedef typename IntervalMapT::interval_type IntervalT;
  888. typename IntervalMapT::interval_mapping_type val_pair1 = IDv(6,9,1);
  889. std::pair<const IntervalT, U> val_pair2 = IDv(3,5,3);
  890. mapping_pair<T,U> map_pair = K_v(4,3);
  891. IntervalT itv = C_D(4,11);
  892. IntervalMapT map_a, map_b;
  893. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  894. map_b.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  895. interval_set<T> join_set_a;
  896. separate_interval_set<T> sep_set_a;
  897. split_interval_set<T> split_set_a;
  898. join_set_a .add(I_D(0,4)).add(I_I(4,6)).add(I_D(5,9));
  899. sep_set_a .add(I_D(0,4)).add(I_I(4,6)).add(I_D(5,11));
  900. split_set_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  901. //Happy day overloading
  902. BOOST_CHECK_EQUAL(map_a & map_b, map_b & map_a);
  903. //This checks all cases of is_interval_map_derivative<T>
  904. BOOST_CHECK_EQUAL(map_a & val_pair1, val_pair1 & map_a);
  905. BOOST_CHECK_EQUAL(map_b & val_pair2, val_pair2 & map_b);
  906. BOOST_CHECK_EQUAL(map_b & map_pair, map_pair & map_b);
  907. //This checks all cases of is_interval_set_derivative<T>
  908. BOOST_CHECK_EQUAL(map_a & itv, itv & map_a);
  909. BOOST_CHECK_EQUAL(map_b & MK_v(8), MK_v(8) & map_b);
  910. //This checks all cases of is_interval_set_companion<T>
  911. BOOST_CHECK_EQUAL(map_a & split_set_a, split_set_a & map_a);
  912. BOOST_CHECK_EQUAL(map_a & sep_set_a, sep_set_a & map_a);
  913. BOOST_CHECK_EQUAL(map_a & join_set_a, join_set_a & map_a);
  914. }
  915. template
  916. <
  917. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  918. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  919. #else
  920. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  921. #endif
  922. class T, class U
  923. >
  924. void interval_map_infix_caret_overload_4_bicremental_types()
  925. {
  926. typedef IntervalMap<T,U> IntervalMapT;
  927. typedef typename IntervalMapT::interval_type IntervalT;
  928. typename IntervalMapT::interval_mapping_type val_pair1 = IDv(6,9,1);
  929. std::pair<const IntervalT, U> val_pair2 = IDv(3,5,3);
  930. mapping_pair<T,U> map_pair = K_v(4,3);
  931. //IntervalT itv = C_D(4,11);
  932. IntervalMapT map_a, map_b;
  933. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  934. map_b.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
  935. interval_set<T> join_set_a;
  936. separate_interval_set<T> sep_set_a;
  937. split_interval_set<T> split_set_a;
  938. join_set_a .add(I_D(0,4)).add(I_I(4,6)).add(I_D(5,9));
  939. sep_set_a .add(I_D(0,4)).add(I_I(4,6)).add(I_D(5,11));
  940. split_set_a.add(I_I(0,0)).add(I_D(8,7)).add(I_I(6,11));
  941. //Happy day overloading
  942. BOOST_CHECK_EQUAL(map_a ^ map_b, map_b ^ map_a);
  943. //This checks all cases of is_interval_map_derivative<T>
  944. BOOST_CHECK_EQUAL(map_a ^ val_pair1, val_pair1 ^ map_a);
  945. BOOST_CHECK_EQUAL(map_b ^ val_pair2, val_pair2 ^ map_b);
  946. BOOST_CHECK_EQUAL(map_b ^ map_pair, map_pair ^ map_b);
  947. }
  948. template
  949. <
  950. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  951. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  952. #else
  953. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  954. #endif
  955. class T, class U
  956. >
  957. void interval_map_find_4_bicremental_types()
  958. {
  959. typedef IntervalMap<T,U> IntervalMapT;
  960. typedef typename IntervalMapT::const_iterator c_iterator;
  961. IntervalMapT map_a;
  962. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  963. // {(1 3) [6 8)[8 9)[9 11)
  964. // 1 3 4 3
  965. // 5? 6?
  966. c_iterator found1 = map_a.find(MK_v(6));
  967. c_iterator found2 = icl::find(map_a, MK_v(6));
  968. BOOST_CHECK ( found1 == found2 );
  969. BOOST_CHECK_EQUAL( found1->second, found2->second );
  970. BOOST_CHECK_EQUAL( found1->second, MK_u(3) );
  971. BOOST_CHECK_EQUAL( map_a(MK_v(6)), MK_u(3) );
  972. found1 = map_a.find(MK_v(5));
  973. BOOST_CHECK_EQUAL( found1 == map_a.end(), true );
  974. BOOST_CHECK_EQUAL( map_a(MK_v(5)), MK_u(0) );
  975. BOOST_CHECK_EQUAL( map_a(MK_v(8)), MK_u(4) );
  976. /*JODO fix err for boost::chrono instantiation
  977. T k_2 = MK_v( 2);
  978. T k_11 = MK_v(11);
  979. //LAW map c; key k: k in dom(c) => contains(c, (k, find(c, k)->second))
  980. BOOST_CHECK( icl::contains(map_a, K_v(k_2, icl::find(map_a, k_2)->second)) );
  981. BOOST_CHECK( icl::contains(map_a, K_v(k_11, map_a.find(k_11)->second)) );
  982. */
  983. BOOST_CHECK( icl::contains(map_a, MK_v(2)) );
  984. BOOST_CHECK( icl::contains(map_a, MK_v(10)) );
  985. BOOST_CHECK( !icl::contains(map_a, MK_v(1)) );
  986. BOOST_CHECK( !icl::contains(map_a, MK_v(3)) );
  987. BOOST_CHECK( !icl::contains(map_a, MK_v(12)) );
  988. BOOST_CHECK( icl::intersects(map_a, MK_v(2)) );
  989. BOOST_CHECK( icl::intersects(map_a, MK_v(10)) );
  990. BOOST_CHECK( !icl::intersects(map_a, MK_v(1)) );
  991. BOOST_CHECK( !icl::intersects(map_a, MK_v(3)) );
  992. BOOST_CHECK( !icl::intersects(map_a, MK_v(12)) );
  993. }
  994. template
  995. <
  996. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  997. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  998. #else
  999. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  1000. #endif
  1001. class T, class U
  1002. >
  1003. void interval_map_find_4_numeric_continuous_types()
  1004. {
  1005. #ifndef BOOST_ICL_TEST_CHRONO
  1006. typedef IntervalMap<T,U> IntervalMapT;
  1007. typedef typename IntervalMapT::interval_type IntervalT;
  1008. typedef typename IntervalMapT::const_iterator c_iterator;
  1009. T q_1_2 = MK_v(1) / MK_v(2);//JODO Doesn't work with chrono
  1010. T q_3_2 = MK_v(3) / MK_v(2);
  1011. T q_1_3 = MK_v(1) / MK_v(3);
  1012. T q_2_3 = MK_v(2) / MK_v(3);
  1013. T q_4_3 = MK_v(4) / MK_v(3);
  1014. T q_5_3 = MK_v(5) / MK_v(3);
  1015. IntervalMapT map_a;
  1016. map_a.add(MK_seg(IntervalT(q_1_3, q_2_3), 1)).add(MK_seg(IntervalT(q_4_3, q_5_3), 2));
  1017. // {[1/3 2/3) [4/3 5/3)}
  1018. // 1 2
  1019. c_iterator found1 = map_a.find(q_1_2);
  1020. c_iterator found2 = icl::find(map_a, q_1_2);
  1021. BOOST_CHECK ( found1 == found2 );
  1022. BOOST_CHECK_EQUAL( found1->second, found2->second );
  1023. BOOST_CHECK_EQUAL( found1->second, MK_u(1) );
  1024. found1 = map_a.find(q_3_2);
  1025. found2 = icl::find(map_a, q_3_2);
  1026. BOOST_CHECK ( found1 == found2 );
  1027. BOOST_CHECK_EQUAL( found1->second, found2->second );
  1028. BOOST_CHECK_EQUAL( found1->second, MK_u(2) );
  1029. if( mpl::or_<mpl::not_<is_static_left_open<IntervalT> >, boost::is_signed<T> >::value )
  1030. {
  1031. found1 = map_a.find(MK_v(0));
  1032. found2 = icl::find(map_a, MK_v(0));
  1033. BOOST_CHECK ( found1 == found2 );
  1034. BOOST_CHECK ( found1 == map_a.end() );
  1035. }
  1036. found1 = map_a.find(MK_v(1));
  1037. found2 = icl::find(map_a, MK_v(1));
  1038. BOOST_CHECK ( found1 == found2 );
  1039. BOOST_CHECK ( found1 == map_a.end() );
  1040. if( mpl::or_<mpl::not_<is_static_left_open<IntervalT> >, boost::is_signed<T> >::value )
  1041. {
  1042. BOOST_CHECK( !icl::contains(map_a, MK_v(0)) );
  1043. }
  1044. BOOST_CHECK( icl::contains(map_a, q_1_2) );
  1045. BOOST_CHECK( !icl::contains(map_a, MK_v(1)) );
  1046. BOOST_CHECK( icl::contains(map_a, q_3_2) );
  1047. BOOST_CHECK( !icl::contains(map_a, MK_v(2)) );
  1048. #endif
  1049. }
  1050. template
  1051. <
  1052. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1053. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  1054. #else
  1055. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  1056. #endif
  1057. class T, class U
  1058. >
  1059. void interval_map_range_4_bicremental_types()
  1060. {
  1061. typedef IntervalMap<T,U> IntervalMapT;
  1062. typedef typename IntervalMapT::interval_type IntervalT;
  1063. typedef typename IntervalMapT::const_iterator c_iterator;
  1064. IntervalMapT map_a;
  1065. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1066. // {(1 3) [6 8)[8 9)[9 11)
  1067. // 1 3 4 3
  1068. // [2 7) := itv
  1069. IntervalT itv = I_D(2, 7);
  1070. c_iterator lwb1 = icl::find(map_a, itv);
  1071. c_iterator lwb2 = map_a.lower_bound(itv);
  1072. BOOST_CHECK ( lwb1 == lwb2 );
  1073. BOOST_CHECK_EQUAL( lwb1->second, lwb2->second );
  1074. BOOST_CHECK_EQUAL( lwb1->second, MK_u(1) );
  1075. c_iterator upb1 = map_a.upper_bound(itv);
  1076. BOOST_CHECK_EQUAL( upb1->second, MK_u(4) );
  1077. std::pair<c_iterator,c_iterator> exterior = map_a.equal_range(itv);
  1078. BOOST_CHECK ( lwb1 == exterior.first );
  1079. BOOST_CHECK ( upb1 == exterior.second );
  1080. }
  1081. template
  1082. <
  1083. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1084. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  1085. #else
  1086. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  1087. #endif
  1088. class T, class U
  1089. >
  1090. void interval_map_set_4_bicremental_types()
  1091. {
  1092. typedef IntervalMap<T,U> IntervalMapT;
  1093. IntervalMapT map_a;
  1094. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1095. BOOST_CHECK_EQUAL( icl::contains(map_a.set(CDv(2,10,4)), CDv(2,10,4)), true );
  1096. BOOST_CHECK_EQUAL( icl::contains(map_a.set(K_v(4,5)), K_v(4,5)), true );
  1097. BOOST_CHECK_EQUAL( icl::contains(map_a.set(K_v(4,5)).set(CDv(3,5,6)), CDv(3,5,6)), true );
  1098. }
  1099. template
  1100. <
  1101. class T, class U, class Trt,
  1102. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1103. ICL_IntervalMap_TEMPLATE(T,U,Traits,Trt) IntervalMap
  1104. #else
  1105. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,Trt) IntervalMap
  1106. #endif
  1107. >
  1108. void interval_map_inclusion_compare_4_bicremental_types()
  1109. {
  1110. typedef IntervalMap<T,U,Trt> IntervalMapT;
  1111. typedef typename IntervalMap<T,U,Trt>::set_type IntervalSetT;
  1112. IntervalMapT itv_map_sub_a, itv_map_a, itv_map_a2, itv_map_super_a,
  1113. itv_map_b, itv_map_c;
  1114. itv_map_sub_a.add(IDv(2,4,1)).add(IIv(6,7,3));
  1115. itv_map_a = itv_map_sub_a;
  1116. itv_map_a.add(IIv(9,9,1));
  1117. itv_map_a2 = itv_map_a;
  1118. itv_map_c = itv_map_sub_a;
  1119. itv_map_c.erase(MK_v(7)).add(IIv(11,11,2));
  1120. itv_map_b = itv_map_a;
  1121. itv_map_b.set(IIv(6,7,2));
  1122. BOOST_CHECK_EQUAL( inclusion_compare(IntervalMapT(), IntervalMapT()), inclusion::equal );
  1123. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, itv_map_a), inclusion::equal );
  1124. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, itv_map_a2), inclusion::equal );
  1125. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, IntervalMapT()), inclusion::superset );
  1126. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, itv_map_sub_a), inclusion::superset );
  1127. BOOST_CHECK_EQUAL( inclusion_compare(IntervalMapT(), itv_map_a), inclusion::subset );
  1128. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_sub_a, itv_map_a), inclusion::subset );
  1129. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, itv_map_b), inclusion::unrelated );
  1130. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, itv_map_c), inclusion::unrelated );
  1131. IntervalSetT set_sub_a, set_a, set_a2, set_b, set_c;
  1132. icl::domain(set_a, itv_map_a);
  1133. icl::domain(set_a2, itv_map_a2);
  1134. icl::domain(set_sub_a, itv_map_sub_a);
  1135. BOOST_CHECK_EQUAL( inclusion_compare(IntervalMapT(), IntervalSetT()), inclusion::equal );
  1136. BOOST_CHECK_EQUAL( inclusion_compare(IntervalSetT(), IntervalMapT()), inclusion::equal );
  1137. BOOST_CHECK_EQUAL( inclusion_compare(IntervalSetT(), IntervalSetT()), inclusion::equal );
  1138. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, set_a), inclusion::equal );
  1139. BOOST_CHECK_EQUAL( inclusion_compare(set_a, itv_map_a), inclusion::equal );
  1140. BOOST_CHECK_EQUAL( inclusion_compare(set_a, set_a2), inclusion::equal );
  1141. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, IntervalSetT()), inclusion::superset );
  1142. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_a, set_sub_a), inclusion::superset );
  1143. BOOST_CHECK_EQUAL( inclusion_compare(IntervalSetT(), itv_map_a), inclusion::subset );
  1144. BOOST_CHECK_EQUAL( inclusion_compare(set_sub_a, itv_map_a), inclusion::subset );
  1145. BOOST_CHECK_EQUAL( inclusion_compare(set_a, IntervalSetT()), inclusion::superset );
  1146. BOOST_CHECK_EQUAL( inclusion_compare(set_a, set_sub_a), inclusion::superset );
  1147. BOOST_CHECK_EQUAL( inclusion_compare(IntervalSetT(), set_a), inclusion::subset );
  1148. BOOST_CHECK_EQUAL( inclusion_compare(set_sub_a, set_a), inclusion::subset );
  1149. BOOST_CHECK_EQUAL( inclusion_compare(set_a, itv_map_c), inclusion::unrelated );
  1150. BOOST_CHECK_EQUAL( inclusion_compare(itv_map_c, set_a), inclusion::unrelated );
  1151. }
  1152. template
  1153. <
  1154. class T, class U, class Trt,
  1155. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1156. ICL_IntervalMap_TEMPLATE(T,U,Traits,Trt) IntervalMap
  1157. #else
  1158. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,Trt) IntervalMap
  1159. #endif
  1160. >
  1161. void interval_map_std_copy_via_inserter_4_bicremental_types()
  1162. {
  1163. typedef IntervalMap<T,U,Trt> IntervalMapT; //Nedded for the test value generator
  1164. typedef typename IntervalMapT::interval_type IntervalT;
  1165. // Check equality of copying using handcoded loop or std::copy via inserter.
  1166. typedef std::pair<IntervalT, U> SegmentT;
  1167. std::vector<SegmentT> seg_vec_a;
  1168. IntervalMapT std_copied_map;
  1169. // For an empty sequence
  1170. test_interval_map_copy_via_inserter(seg_vec_a, std_copied_map);
  1171. // For an singleton sequence
  1172. seg_vec_a.push_back(IDv(0,1,1));
  1173. test_interval_map_copy_via_inserter(seg_vec_a, std_copied_map);
  1174. // Two separate segments
  1175. seg_vec_a.push_back(IDv(3,5,1));
  1176. test_interval_map_copy_via_inserter(seg_vec_a, std_copied_map);
  1177. // Touching case
  1178. seg_vec_a.push_back(IDv(5,7,1));
  1179. test_interval_map_copy_via_inserter(seg_vec_a, std_copied_map);
  1180. // Overlapping case
  1181. seg_vec_a.push_back(IDv(6,9,1));
  1182. test_interval_map_copy_via_inserter(seg_vec_a, std_copied_map);
  1183. }
  1184. template
  1185. <
  1186. class T, class U, class Trt,
  1187. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1188. ICL_IntervalMap_TEMPLATE(T,U,Traits,Trt) IntervalMap
  1189. #else
  1190. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,Trt) IntervalMap
  1191. #endif
  1192. >
  1193. void interval_map_element_iter_4_discrete_types()
  1194. {
  1195. typedef IntervalMap<T,U,Trt> IntervalMapT;
  1196. typedef std::vector<std::pair<T,U> > VectorT;
  1197. IntervalMapT map_a;
  1198. map_a.insert(IIv(1,3,1)).insert(IIv(6,7,2));
  1199. typename IntervalMapT::atomized_type ato_map_a;
  1200. //ReptatorT el_it = elements_begin(map_a);
  1201. VectorT vec(5), cev(5);
  1202. vec[0]=sK_v(1,1);vec[1]=sK_v(2,1);vec[2]=sK_v(3,1);vec[3]=sK_v(6,2);vec[4]=sK_v(7,2);
  1203. cev[0]=sK_v(7,2);cev[1]=sK_v(6,2);cev[2]=sK_v(3,1);cev[3]=sK_v(2,1);cev[4]=sK_v(1,1);
  1204. VectorT dest;
  1205. std::copy(elements_begin(map_a), elements_end(map_a), std::back_inserter(dest));
  1206. BOOST_CHECK_EQUAL( vec == dest, true );
  1207. dest.clear();
  1208. std::copy(elements_rbegin(map_a), elements_rend(map_a), std::back_inserter(dest));
  1209. BOOST_CHECK_EQUAL( cev == dest, true );
  1210. dest.clear();
  1211. std::reverse_copy(elements_rbegin(map_a), elements_rend(map_a), std::back_inserter(dest));
  1212. BOOST_CHECK_EQUAL( vec == dest, true );
  1213. dest.clear();
  1214. std::reverse_copy(elements_begin(map_a), elements_end(map_a), std::back_inserter(dest));
  1215. BOOST_CHECK_EQUAL( cev == dest, true );
  1216. }
  1217. template
  1218. <
  1219. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1220. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  1221. #else
  1222. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  1223. #endif
  1224. class T, class U
  1225. >
  1226. void interval_map_intersects_4_bicremental_types()
  1227. {
  1228. // Test of intersects and disjoint for domain_type and interval_type.
  1229. typedef IntervalMap<T,U> IntervalMapT;
  1230. IntervalMapT map_a;
  1231. map_a.add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
  1232. BOOST_CHECK( icl::is_interval_container<IntervalMapT>::value );
  1233. BOOST_CHECK( icl::has_domain_type<IntervalMapT>::value );
  1234. BOOST_CHECK( (boost::is_same<T, typename domain_type_of<IntervalMapT>::type>::value) );
  1235. BOOST_CHECK( icl::intersects(map_a, MK_v(2) ) );
  1236. BOOST_CHECK( icl::intersects(map_a, MK_v(11)) );
  1237. BOOST_CHECK( icl::disjoint(map_a, MK_v(1) ) );
  1238. BOOST_CHECK( icl::disjoint(map_a, MK_v(12)) );
  1239. BOOST_CHECK( icl::intersects(map_a, I_D(2,3)) );
  1240. BOOST_CHECK( icl::intersects(map_a, I_D(6,8)) );
  1241. BOOST_CHECK( icl::disjoint(map_a, I_D(3,5)) );
  1242. BOOST_CHECK( icl::disjoint(map_a, I_D(12,14)) );
  1243. //-------------------------------------+
  1244. // (1 3) [6 8)[8 9)[9 11]
  1245. // 1 3 4 3
  1246. mapping_pair<T,U> map_pair_2_1 = K_v(2,1);
  1247. BOOST_CHECK( icl::intersects(map_a, map_pair_2_1 ) );
  1248. BOOST_CHECK( icl::intersects(map_a, K_v(6,3) ) );
  1249. BOOST_CHECK( icl::intersects(map_a, IDv(6,8,3) ) );
  1250. BOOST_CHECK( icl::intersects(map_a, CIv(8,11,3) ) );
  1251. BOOST_CHECK( icl::intersects(map_a, IIv(6,11,3) ) );
  1252. BOOST_CHECK( icl::intersects(map_a, IIv(6,11,5) ) );
  1253. BOOST_CHECK(!icl::intersects(map_a, IDv(4,6,5) ) );
  1254. BOOST_CHECK( icl::disjoint(map_a, IDv(4,6,5) ) );
  1255. BOOST_CHECK(!icl::disjoint(map_a, IDv(0,12,1) ) );
  1256. }
  1257. template
  1258. <
  1259. #if (defined(__GNUC__) && (__GNUC__ < 4)) //MEMO Can be simplified, if gcc-3.4 is obsolete
  1260. ICL_IntervalMap_TEMPLATE(T,U,Traits,partial_absorber) IntervalMap,
  1261. #else
  1262. ICL_IntervalMap_TEMPLATE(_T,_U,Traits,partial_absorber) IntervalMap,
  1263. #endif
  1264. class T, class U
  1265. >
  1266. void interval_map_move_4_discrete_types()
  1267. {
  1268. # ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
  1269. typedef IntervalMap<T,U> IntervalMapT;
  1270. IntervalMapT map_A(boost::move(IntervalMapT(IDv(0,4,2))));
  1271. IntervalMapT map_B(boost::move(IntervalMapT(IDv(0,2,1)).add(IDv(2,4,1)).add(IDv(0,4,1))));
  1272. BOOST_CHECK( icl::is_element_equal(map_A, map_B) );
  1273. BOOST_CHECK_EQUAL( map_A, join(map_B) );
  1274. map_A = boost::move(IntervalMapT(IIv(1,4,2)));
  1275. map_B = boost::move(IntervalMapT(CIv(0,2,1)).insert(IDv(3,5,1)).add(CDv(0,5,1)));
  1276. BOOST_CHECK( icl::is_element_equal(map_A, map_B) );
  1277. BOOST_CHECK_EQUAL( map_A, join(map_B) );
  1278. # endif // BOOST_NO_CXX11_RVALUE_REFERENCES
  1279. }
  1280. #endif // LIBS_ICL_TEST_TEST_INTERVAL_MAP_SHARED_HPP_JOFA_081005