test_icl_interval_shared.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*-----------------------------------------------------------------------------+
  2. Copyright (c) 2008-2010: Joachim Faulhaber
  3. +------------------------------------------------------------------------------+
  4. Distributed under the Boost Software License, Version 1.0.
  5. (See accompanying file LICENCE.txt or copy at
  6. http://www.boost.org/LICENSE_1_0.txt)
  7. +-----------------------------------------------------------------------------*/
  8. #ifndef LIBS_ICL_TEST_TEST_ICL_interval_shared_hpp_JOFA_100306__
  9. #define LIBS_ICL_TEST_TEST_ICL_interval_shared_hpp_JOFA_100306__
  10. #include <boost/icl/interval_set.hpp>
  11. template <class DomainT, ICL_COMPARE Compare,
  12. ICL_INTERVAL(ICL_COMPARE) Interval>
  13. void test_inner_complement(const ICL_INTERVAL_TYPE(Interval,DomainT,Compare)& itv1,
  14. const ICL_INTERVAL_TYPE(Interval,DomainT,Compare)& itv2)
  15. {
  16. typedef interval_set<DomainT,Compare,Interval> ItvSetT;
  17. typedef ICL_INTERVAL_TYPE(Interval,DomainT,Compare) IntervalT;
  18. BOOST_CHECK_EQUAL(icl::length(inner_complement(itv1,itv2)), icl::distance(itv1,itv2));
  19. BOOST_CHECK_EQUAL(icl::length(inner_complement(itv1,itv2)), icl::distance(itv2,itv1));
  20. BOOST_CHECK_EQUAL(icl::length(inner_complement(itv2,itv1)), icl::distance(itv1,itv2));
  21. BOOST_CHECK_EQUAL(icl::length(inner_complement(itv2,itv1)), icl::distance(itv2,itv1));
  22. IntervalT in_comp = inner_complement(itv1,itv2);
  23. ItvSetT itvset, inner_comp;
  24. itvset.add(itv1).add(itv2);
  25. ItvSetT hullset = ItvSetT(hull(itvset));
  26. inner_comp = hullset - itvset;
  27. IntervalT inner_comp_itv;
  28. if(inner_comp.begin() != inner_comp.end())
  29. inner_comp_itv = *inner_comp.begin();
  30. BOOST_CHECK_EQUAL(inner_complement(itv1,itv2), inner_comp_itv);
  31. BOOST_CHECK_EQUAL(inner_complement(itv2,itv1), inner_comp_itv);
  32. BOOST_CHECK_EQUAL(icl::length(inner_comp), icl::distance(itv1,itv2));
  33. BOOST_CHECK_EQUAL(icl::length(inner_comp), icl::distance(itv2,itv1));
  34. BOOST_CHECK(icl::disjoint(itv1, in_comp));
  35. BOOST_CHECK(icl::disjoint(itv2, in_comp));
  36. IntervalT itv1_comp = hull(itv1, in_comp);
  37. IntervalT itv2_comp = hull(itv2, in_comp);
  38. if(!icl::is_empty(in_comp))
  39. {
  40. BOOST_CHECK(icl::intersects(itv1_comp, in_comp));
  41. BOOST_CHECK(icl::intersects(itv2_comp, in_comp));
  42. BOOST_CHECK_EQUAL(itv1_comp & itv2_comp, in_comp);
  43. BOOST_CHECK_EQUAL( icl::is_empty(itv1_comp & itv2_comp), icl::disjoint(itv1_comp, itv2_comp));
  44. BOOST_CHECK_EQUAL(!icl::is_empty(itv1_comp & itv2_comp), icl::intersects(itv1_comp, itv2_comp));
  45. }
  46. }
  47. template <class IntervalT>
  48. void test_inner_complement_(const IntervalT& itv1, const IntervalT& itv2)
  49. {
  50. typedef typename interval_traits<IntervalT>::domain_type DomainT;
  51. // For the test of plain interval types we assume that std::less is
  52. // the compare functor
  53. test_inner_complement<DomainT, std::less, IntervalT>(itv1, itv2);
  54. }
  55. #ifndef BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  56. void interval_ctor_specific()
  57. {
  58. BOOST_CHECK_EQUAL(icl::length(icl::interval<double>::type()), 0.0);
  59. BOOST_CHECK_EQUAL(icl::cardinality(icl::interval<double>::closed(5.0, 5.0)), 1);
  60. BOOST_CHECK_EQUAL(icl::cardinality(icl::interval<std::string>::closed("test", "test")), 1);
  61. BOOST_CHECK_EQUAL(icl::cardinality(icl::interval<std::string>::closed("best","test")),
  62. icl::cardinality(icl::interval<double>::closed(0.0,0.1)));
  63. BOOST_CHECK_EQUAL(icl::cardinality(icl::interval<std::string>::right_open("best","test")),
  64. icl::infinity<size_type_of<icl::interval<std::string>::type>::type >::value() );
  65. BOOST_CHECK_EQUAL(icl::cardinality(icl::interval<double>::right_open(0.0, 1.0)),
  66. icl::infinity<size_type_of<icl::interval<double>::type>::type >::value() );
  67. }
  68. #endif // ndef BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
  69. template <class T>
  70. void interval_equal_4_integral_types()
  71. {
  72. typedef typename icl::interval<T>::type IntervalT;
  73. T v2 = make<T>(2);
  74. T v3 = make<T>(3);
  75. T v7 = make<T>(7);
  76. T v8 = make<T>(8);
  77. BOOST_CHECK_EQUAL(IntervalT(), IntervalT(v7,v3));
  78. //I: (I)nside = closed bound
  79. //C: left open bound
  80. //D: right open bound
  81. IntervalT I3_7I = icl::interval<T>::closed(v3,v7);
  82. IntervalT I3__8D = icl::interval<T>::right_open(v3,v8);
  83. IntervalT C2__7I = icl::interval<T>::left_open(v2,v7);
  84. IntervalT C2___8D = icl::interval<T>::open(v2,v8);
  85. BOOST_CHECK_EQUAL( I3_7I , I3_7I );
  86. BOOST_CHECK_EQUAL( I3_7I , I3__8D );
  87. BOOST_CHECK_EQUAL( I3_7I , C2__7I );
  88. BOOST_CHECK_EQUAL( I3_7I , C2___8D );
  89. BOOST_CHECK_EQUAL( I3__8D, I3__8D );
  90. BOOST_CHECK_EQUAL( I3__8D, C2__7I );
  91. BOOST_CHECK_EQUAL( I3__8D, C2___8D );
  92. BOOST_CHECK_EQUAL( C2__7I , C2__7I );
  93. BOOST_CHECK_EQUAL( C2__7I , C2___8D );
  94. BOOST_CHECK_EQUAL( C2___8D, C2___8D );
  95. }
  96. template <class T>
  97. void interval_less_4_integral_types()
  98. {
  99. typedef typename icl::interval<T>::type IntervalT;
  100. T v2 = make<T>(2);
  101. T v3 = make<T>(3);
  102. T v4 = make<T>(4);
  103. T v7 = make<T>(7);
  104. T v8 = make<T>(8);
  105. BOOST_CHECK_EQUAL(IntervalT() < IntervalT(v7,v3), false);
  106. BOOST_CHECK_EQUAL(icl::interval<T>::open(v2,v3) < icl::interval<T>::right_open(v7,v7), false);
  107. BOOST_CHECK_EQUAL(icl::interval<T>::left_open(v3,v3) < icl::interval<T>::closed(v7,v3), false);
  108. BOOST_CHECK_EQUAL(IntervalT() < IntervalT(v3,v4), true);
  109. BOOST_CHECK_EQUAL(icl::interval<T>::open(v2,v3) < icl::interval<T>::right_open(v7,v8), true);
  110. //I: (I)nside = closed bound
  111. //C: left open bound
  112. //D: right open bound
  113. IntervalT I3_7I = icl::interval<T>::closed(v3,v7);
  114. IntervalT I4_7I = icl::interval<T>::closed(v4,v7);
  115. IntervalT I3__8D = icl::interval<T>::right_open(v3,v8);
  116. IntervalT C2__7I = icl::interval<T>::left_open(v2,v7);
  117. IntervalT C2___8D = icl::interval<T>::open(v2,v8);
  118. BOOST_CHECK_EQUAL( I3_7I < I3_7I , false);
  119. BOOST_CHECK_EQUAL( I3_7I < I3__8D , false);
  120. BOOST_CHECK_EQUAL( I3_7I < C2__7I , false);
  121. BOOST_CHECK_EQUAL( I3_7I < C2___8D , false);
  122. BOOST_CHECK_EQUAL( I3_7I < I4_7I , true);
  123. BOOST_CHECK_EQUAL( I3__8D< I3__8D , false);
  124. BOOST_CHECK_EQUAL( I3__8D< C2__7I , false);
  125. BOOST_CHECK_EQUAL( I3__8D< C2___8D , false);
  126. BOOST_CHECK_EQUAL( C2__7I < C2__7I , false);
  127. BOOST_CHECK_EQUAL( C2__7I < C2___8D , false);
  128. BOOST_CHECK_EQUAL( C2___8D< C2___8D , false);
  129. }
  130. template <class T>
  131. void interval_equal_4_bicremental_continuous_types()
  132. {
  133. typedef typename icl::interval<T>::type IntervalT;
  134. T v3 = make<T>(3);
  135. T v7 = make<T>(7);
  136. BOOST_CHECK_EQUAL(IntervalT(), IntervalT(v7,v3));
  137. //I: (I)nside = closed bound
  138. //O: (O)utside = open bound
  139. IntervalT I3_7I = icl::interval<T>::closed(v3,v7);
  140. IntervalT I3_7D = icl::interval<T>::right_open(v3,v7);
  141. IntervalT C3_7I = icl::interval<T>::left_open(v3,v7);
  142. IntervalT C3_7D = icl::interval<T>::open(v3,v7);
  143. BOOST_CHECK_EQUAL( I3_7I , I3_7I );
  144. BOOST_CHECK_EQUAL( I3_7I == I3_7D, false );
  145. BOOST_CHECK_EQUAL( I3_7I == C3_7D, false );
  146. BOOST_CHECK_EQUAL( I3_7I == C3_7D, false );
  147. BOOST_CHECK_EQUAL( I3_7I != I3_7D, true );
  148. BOOST_CHECK_EQUAL( I3_7I != C3_7D, true );
  149. BOOST_CHECK_EQUAL( I3_7I != C3_7D, true );
  150. BOOST_CHECK_EQUAL( I3_7D , I3_7D );
  151. BOOST_CHECK_EQUAL( I3_7D == C3_7I, false );
  152. BOOST_CHECK_EQUAL( I3_7D == C3_7D, false );
  153. BOOST_CHECK_EQUAL( I3_7D != C3_7I, true );
  154. BOOST_CHECK_EQUAL( I3_7D != C3_7D, true );
  155. BOOST_CHECK_EQUAL( C3_7I , C3_7I );
  156. BOOST_CHECK_EQUAL( C3_7I == C3_7D, false );
  157. BOOST_CHECK_EQUAL( C3_7I != C3_7D, true );
  158. BOOST_CHECK_EQUAL( C3_7D, C3_7D );
  159. }
  160. template <class T>
  161. void interval_touches_4_bicremental_types()
  162. {
  163. typedef typename icl::interval<T>::type IntervalT;
  164. T v3 = make<T>(3);
  165. T v7 = make<T>(7);
  166. T v9 = make<T>(9);
  167. IntervalT I3_7D = icl::interval<T>::right_open(v3,v7);
  168. IntervalT I7_9I = icl::interval<T>::closed(v7,v9);
  169. BOOST_CHECK_EQUAL( icl::touches(I3_7D, I7_9I), true );
  170. IntervalT I3_7I = icl::interval<T>::closed(v3,v7);
  171. IntervalT C7_9I = icl::interval<T>::left_open(v7,v9);
  172. BOOST_CHECK_EQUAL( icl::touches(I3_7I, C7_9I), true );
  173. BOOST_CHECK_EQUAL( icl::touches(I3_7D, C7_9I), false );
  174. BOOST_CHECK_EQUAL( icl::touches(I3_7I, I7_9I), false );
  175. }
  176. template <class T>
  177. void interval_touches_4_integral_types()
  178. {
  179. typedef typename icl::interval<T>::type IntervalT;
  180. T v3 = make<T>(3);
  181. T v6 = make<T>(6);
  182. T v7 = make<T>(7);
  183. T v9 = make<T>(9);
  184. IntervalT I3_6I = icl::interval<T>::closed(v3,v6);
  185. IntervalT I7_9I = icl::interval<T>::closed(v7,v9);
  186. BOOST_CHECK_EQUAL( icl::touches(I3_6I, I7_9I), true );
  187. IntervalT I3_7D = icl::interval<T>::right_open(v3,v7);
  188. IntervalT C6_9I = icl::interval<T>::left_open(v6,v9);
  189. BOOST_CHECK_EQUAL( icl::touches(I3_7D, C6_9I), true );
  190. }
  191. template <class T>
  192. void interval_infix_intersect_4_bicremental_types()
  193. {
  194. typedef typename icl::interval<T>::type IntervalT;
  195. IntervalT section;
  196. IntervalT I3_7D = I_D(3,7);
  197. IntervalT I0_3D = I_D(0,3);
  198. section = I3_7D & I0_3D;
  199. BOOST_CHECK_EQUAL( icl::disjoint(I0_3D, I3_7D), true );
  200. BOOST_CHECK_EQUAL( icl::is_empty(section), true );
  201. BOOST_CHECK_EQUAL( section, IntervalT() );
  202. IntervalT I0_5D = I_D(0,5);
  203. section = I3_7D & I0_5D;
  204. BOOST_CHECK_EQUAL( section, I_D(3,5) );
  205. IntervalT I0_9D = I_D(0,9);
  206. section = I3_7D & I0_9D;
  207. BOOST_CHECK_EQUAL( section, I3_7D );
  208. IntervalT I4_5I = I_I(4,5);
  209. section = I3_7D & I4_5I;
  210. BOOST_CHECK_EQUAL( section, I4_5I );
  211. IntervalT C4_6D = C_D(4,6);
  212. section = I3_7D & C4_6D;
  213. BOOST_CHECK_EQUAL( section, C4_6D );
  214. IntervalT C4_9I = C_I(4,9);
  215. section = I3_7D & C4_9I;
  216. BOOST_CHECK_EQUAL( section, C_D(4,7) );
  217. IntervalT I7_9I = I_I(7,9);
  218. section = I3_7D & I7_9I;
  219. BOOST_CHECK_EQUAL( icl::exclusive_less(I3_7D, I7_9I), true );
  220. BOOST_CHECK_EQUAL( icl::disjoint(I3_7D, I7_9I), true );
  221. BOOST_CHECK_EQUAL( icl::is_empty(section), true );
  222. }
  223. template <class T>
  224. void interval_subtract_4_bicremental_types()
  225. {
  226. typedef typename icl::interval<T>::type IntervalT;
  227. IntervalT diff_1, diff_2;
  228. IntervalT I0_3D = I_D(0,3);
  229. IntervalT I2_6D = I_D(2,6);
  230. IntervalT I4_7D = I_D(4,7);
  231. IntervalT I6_7D = I_D(6,7);
  232. IntervalT I2_4D = I_D(2,4);
  233. diff_1 = right_subtract(I2_6D, I4_7D);
  234. BOOST_CHECK_EQUAL( diff_1, I2_4D );
  235. diff_1 = right_subtract(I0_3D, I4_7D);
  236. BOOST_CHECK_EQUAL( diff_1, I0_3D );
  237. // ---------------------------------
  238. diff_1 = left_subtract(I4_7D, I2_6D);
  239. BOOST_CHECK_EQUAL( diff_1, I6_7D );
  240. diff_1 = left_subtract(I4_7D, I0_3D);
  241. BOOST_CHECK_EQUAL( diff_1, I4_7D );
  242. }
  243. #endif // LIBS_ICL_TEST_TEST_ICL_interval_shared_hpp_JOFA_100306__