mismatch.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. // Boost.Range library
  2. //
  3. // Copyright Neil Groves 2009. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. //
  9. // For more information, see http://www.boost.org/libs/range/
  10. //
  11. #include <boost/range/algorithm/mismatch.hpp>
  12. #include <boost/test/test_tools.hpp>
  13. #include <boost/test/unit_test.hpp>
  14. #include <boost/assign.hpp>
  15. #include <algorithm>
  16. #include <list>
  17. #include <set>
  18. #include <vector>
  19. namespace boost
  20. {
  21. namespace
  22. {
  23. template< class Container1, class Container2 >
  24. void eval_mismatch(Container1& cont1,
  25. Container2& cont2,
  26. BOOST_DEDUCED_TYPENAME range_iterator<Container1>::type ref_it1,
  27. BOOST_DEDUCED_TYPENAME range_iterator<Container2>::type ref_it2
  28. )
  29. {
  30. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container1>::type iter1_t;
  31. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container2>::type iter2_t;
  32. typedef std::pair<iter1_t, iter2_t> result_pair_t;
  33. result_pair_t result = boost::mismatch(cont1, cont2);
  34. BOOST_CHECK( result.first == ref_it1 );
  35. BOOST_CHECK( result.second == ref_it2 );
  36. result = boost::mismatch(boost::make_iterator_range(cont1),
  37. cont2);
  38. BOOST_CHECK( result.first == ref_it1 );
  39. BOOST_CHECK( result.second == ref_it2 );
  40. result = boost::mismatch(cont1,
  41. boost::make_iterator_range(cont2));
  42. BOOST_CHECK( result.first == ref_it1 );
  43. BOOST_CHECK( result.second == ref_it2 );
  44. result = boost::mismatch(boost::make_iterator_range(cont1),
  45. boost::make_iterator_range(cont2));
  46. BOOST_CHECK( result.first == ref_it1 );
  47. BOOST_CHECK( result.second == ref_it2 );
  48. }
  49. template< class Container1, class Container2, class Pred >
  50. void eval_mismatch(Container1& cont1,
  51. Container2& cont2,
  52. Pred pred,
  53. BOOST_DEDUCED_TYPENAME range_iterator<Container1>::type ref_it1,
  54. BOOST_DEDUCED_TYPENAME range_iterator<Container2>::type ref_it2
  55. )
  56. {
  57. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container1>::type iter1_t;
  58. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container2>::type iter2_t;
  59. typedef std::pair<iter1_t, iter2_t> result_pair_t;
  60. result_pair_t result = boost::mismatch(cont1, cont2, pred);
  61. BOOST_CHECK( result.first == ref_it1 );
  62. BOOST_CHECK( result.second == ref_it2 );
  63. result = boost::mismatch(boost::make_iterator_range(cont1),
  64. cont2, pred);
  65. BOOST_CHECK( result.first == ref_it1 );
  66. BOOST_CHECK( result.second == ref_it2 );
  67. result = boost::mismatch(cont1,
  68. boost::make_iterator_range(cont2), pred);
  69. BOOST_CHECK( result.first == ref_it1 );
  70. BOOST_CHECK( result.second == ref_it2 );
  71. result = boost::mismatch(boost::make_iterator_range(cont1),
  72. boost::make_iterator_range(cont2),
  73. pred);
  74. BOOST_CHECK( result.first == ref_it1 );
  75. BOOST_CHECK( result.second == ref_it2 );
  76. }
  77. template< class Container1, class Container2 >
  78. void eval_mismatch(Container1& cont1,
  79. Container2& cont2,
  80. const int ref1,
  81. const int ref2)
  82. {
  83. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container1>::type iter1_t;
  84. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container2>::type iter2_t;
  85. typedef std::pair<iter1_t, iter2_t> result_pair_t;
  86. result_pair_t result = boost::mismatch(cont1, cont2);
  87. BOOST_CHECK_EQUAL( ref1, *result.first );
  88. BOOST_CHECK_EQUAL( ref2, *result.second );
  89. result = boost::mismatch(boost::make_iterator_range(cont1), cont2);
  90. BOOST_CHECK_EQUAL( ref1, *result.first );
  91. BOOST_CHECK_EQUAL( ref2, *result.second );
  92. result = boost::mismatch(cont1, boost::make_iterator_range(cont2));
  93. BOOST_CHECK_EQUAL( ref1, *result.first );
  94. BOOST_CHECK_EQUAL( ref2, *result.second );
  95. result = boost::mismatch(boost::make_iterator_range(cont1),
  96. boost::make_iterator_range(cont2));
  97. BOOST_CHECK_EQUAL( ref1, *result.first );
  98. BOOST_CHECK_EQUAL( ref2, *result.second );
  99. }
  100. template< class Container1, class Container2, class Pred >
  101. void eval_mismatch(Container1& cont1,
  102. Container2& cont2,
  103. Pred pred,
  104. const int ref1,
  105. const int ref2)
  106. {
  107. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container1>::type iter1_t;
  108. typedef BOOST_DEDUCED_TYPENAME range_iterator<Container2>::type iter2_t;
  109. typedef std::pair<iter1_t, iter2_t> result_pair_t;
  110. result_pair_t result = boost::mismatch(cont1, cont2, pred);
  111. BOOST_CHECK_EQUAL( ref1, *result.first );
  112. BOOST_CHECK_EQUAL( ref2, *result.second );
  113. result = boost::mismatch(boost::make_iterator_range(cont1),
  114. cont2, pred);
  115. BOOST_CHECK_EQUAL( ref1, *result.first );
  116. BOOST_CHECK_EQUAL( ref2, *result.second );
  117. result = boost::mismatch(cont1, boost::make_iterator_range(cont2),
  118. pred);
  119. BOOST_CHECK_EQUAL( ref1, *result.first );
  120. BOOST_CHECK_EQUAL( ref2, *result.second );
  121. result = boost::mismatch(boost::make_iterator_range(cont1),
  122. boost::make_iterator_range(cont2),
  123. pred);
  124. BOOST_CHECK_EQUAL( ref1, *result.first );
  125. BOOST_CHECK_EQUAL( ref2, *result.second );
  126. }
  127. template< class Container1, class Container2 >
  128. void test_mismatch_impl()
  129. {
  130. using namespace boost::assign;
  131. typedef BOOST_DEDUCED_TYPENAME boost::remove_const<Container1>::type MutableContainer1;
  132. typedef BOOST_DEDUCED_TYPENAME boost::remove_const<Container2>::type MutableContainer2;
  133. MutableContainer1 cont1;
  134. const Container1& cref_cont1 = cont1;
  135. MutableContainer2 cont2;
  136. const Container2& cref_cont2 = cont2;
  137. typedef BOOST_DEDUCED_TYPENAME Container1::iterator
  138. iterator1_t BOOST_RANGE_UNUSED;
  139. typedef BOOST_DEDUCED_TYPENAME Container1::const_iterator
  140. const_iterator1_t BOOST_RANGE_UNUSED;
  141. typedef BOOST_DEDUCED_TYPENAME Container2::iterator
  142. iterator2_t BOOST_RANGE_UNUSED;
  143. typedef BOOST_DEDUCED_TYPENAME Container2::const_iterator
  144. const_iterator2_t BOOST_RANGE_UNUSED;
  145. eval_mismatch(cont1, cont2, cont1.end(), cont2.end());
  146. eval_mismatch(cont1, cont2, std::equal_to<int>(), cont1.end(), cont2.end());
  147. eval_mismatch(cref_cont1, cont2, cref_cont1.end(), cont2.end());
  148. eval_mismatch(cref_cont1, cont2, std::equal_to<int>(), cref_cont1.end(), cont2.end());
  149. eval_mismatch(cont1, cref_cont2, cont1.end(), cref_cont2.end());
  150. eval_mismatch(cont1, cref_cont2, std::equal_to<int>(), cont1.end(), cref_cont2.end());
  151. eval_mismatch(cref_cont1, cref_cont2, cref_cont1.end(), cref_cont2.end());
  152. eval_mismatch(cref_cont1, cref_cont2, std::equal_to<int>(), cref_cont1.end(), cref_cont2.end());
  153. cont1 += 1,2,3,4;
  154. cont2 += 1,2,3,4;
  155. eval_mismatch(cont1, cont2, cont1.end(), cont2.end());
  156. eval_mismatch(cont1, cont2, std::equal_to<int>(), cont1.end(), cont2.end());
  157. eval_mismatch(cref_cont1, cont2, cref_cont1.end(), cont2.end());
  158. eval_mismatch(cref_cont1, cont2, std::equal_to<int>(), cref_cont1.end(), cont2.end());
  159. eval_mismatch(cont1, cref_cont2, cont1.end(), cref_cont2.end());
  160. eval_mismatch(cont1, cref_cont2, std::equal_to<int>(), cont1.end(), cref_cont2.end());
  161. eval_mismatch(cref_cont1, cref_cont2, cref_cont1.end(), cref_cont2.end());
  162. eval_mismatch(cref_cont1, cref_cont2, std::equal_to<int>(), cref_cont1.end(), cref_cont2.end());
  163. cont1.clear();
  164. cont2.clear();
  165. cont1 += 1,2,3,4;
  166. cont2 += 1,2,5,4;
  167. eval_mismatch(cont1, cont2, 3, 5);
  168. eval_mismatch(cont1, cont2, std::equal_to<int>(), 3, 5);
  169. eval_mismatch(cont1, cont2, std::not_equal_to<int>(), cont1.begin(), cont2.begin());
  170. eval_mismatch(cref_cont1, cont2, 3, 5);
  171. eval_mismatch(cref_cont1, cont2, std::equal_to<int>(), 3, 5);
  172. eval_mismatch(cref_cont1, cont2, std::not_equal_to<int>(), cref_cont1.begin(), cont2.begin());
  173. eval_mismatch(cont1, cref_cont2, 3, 5);
  174. eval_mismatch(cont1, cref_cont2, std::equal_to<int>(), 3, 5);
  175. eval_mismatch(cont1, cref_cont2, std::not_equal_to<int>(), cont1.begin(), cref_cont2.begin());
  176. eval_mismatch(cref_cont1, cref_cont2, 3, 5);
  177. eval_mismatch(cref_cont1, cref_cont2, std::equal_to<int>(), 3, 5);
  178. eval_mismatch(cref_cont1, cref_cont2, std::not_equal_to<int>(), cref_cont1.begin(), cref_cont2.begin());
  179. }
  180. void test_mismatch()
  181. {
  182. test_mismatch_impl< std::list<int>, std::list<int> >();
  183. test_mismatch_impl< const std::list<int>, std::list<int> >();
  184. test_mismatch_impl< std::list<int>, const std::list<int> >();
  185. test_mismatch_impl< const std::list<int>, const std::list<int> >();
  186. test_mismatch_impl< std::vector<int>, std::list<int> >();
  187. test_mismatch_impl< const std::vector<int>, std::list<int> >();
  188. test_mismatch_impl< std::vector<int>, const std::list<int> >();
  189. test_mismatch_impl< const std::vector<int>, const std::list<int> >();
  190. test_mismatch_impl< std::list<int>, std::vector<int> >();
  191. test_mismatch_impl< const std::list<int>, std::vector<int> >();
  192. test_mismatch_impl< std::list<int>, const std::vector<int> >();
  193. test_mismatch_impl< const std::list<int>, const std::vector<int> >();
  194. }
  195. }
  196. }
  197. boost::unit_test::test_suite*
  198. init_unit_test_suite(int argc, char* argv[])
  199. {
  200. boost::unit_test::test_suite* test
  201. = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.mismatch" );
  202. test->add( BOOST_TEST_CASE( &boost::test_mismatch ) );
  203. return test;
  204. }