equal_test.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. Copyright (c) Marshall Clow 2013.
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. For more information, see http://www.boost.org
  6. */
  7. #include <boost/config.hpp>
  8. #include <boost/algorithm/cxx14/equal.hpp>
  9. #include "iterator_test.hpp"
  10. #define BOOST_TEST_MAIN
  11. #include <boost/test/unit_test.hpp>
  12. template <typename T>
  13. BOOST_CXX14_CONSTEXPR bool eq ( const T& a, const T& b ) { return a == b; }
  14. template <typename T>
  15. bool never_eq ( const T&, const T& ) { return false; }
  16. int comparison_count = 0;
  17. template <typename T>
  18. bool counting_equals ( const T &a, const T &b ) {
  19. ++comparison_count;
  20. return a == b;
  21. }
  22. namespace ba = boost::algorithm;
  23. void test_equal ()
  24. {
  25. // Note: The literal values here are tested against directly, careful if you change them:
  26. int num[] = { 1, 1, 2, 3, 5 };
  27. const int sz = sizeof (num)/sizeof(num[0]);
  28. // Empty sequences are equal to each other, but not to non-empty sequences
  29. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
  30. input_iterator<int *>(num), input_iterator<int *>(num)));
  31. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
  32. input_iterator<int *>(num), input_iterator<int *>(num),
  33. never_eq<int> ));
  34. BOOST_CHECK ( ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num),
  35. random_access_iterator<int *>(num), random_access_iterator<int *>(num),
  36. never_eq<int> ));
  37. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
  38. input_iterator<int *>(num), input_iterator<int *>(num + 1)));
  39. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + 2),
  40. input_iterator<int *>(num), input_iterator<int *>(num)));
  41. BOOST_CHECK (!ba::equal ( random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + 2),
  42. random_access_iterator<int *>(num), random_access_iterator<int *>(num)));
  43. // Single element sequences are equal if they contain the same value
  44. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
  45. input_iterator<int *>(num), input_iterator<int *>(num + 1)));
  46. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
  47. input_iterator<int *>(num), input_iterator<int *>(num + 1),
  48. eq<int> ));
  49. BOOST_CHECK ( ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
  50. random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
  51. eq<int> ));
  52. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
  53. input_iterator<int *>(num), input_iterator<int *>(num + 1),
  54. never_eq<int> ));
  55. BOOST_CHECK (!ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
  56. random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
  57. never_eq<int> ));
  58. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
  59. input_iterator<int *>(num + 1), input_iterator<int *>(num + 2)));
  60. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
  61. input_iterator<int *>(num + 1), input_iterator<int *>(num + 2),
  62. eq<int> ));
  63. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 2), input_iterator<int *>(num + 3),
  64. input_iterator<int *>(num), input_iterator<int *>(num + 1)));
  65. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 2), input_iterator<int *>(num + 3),
  66. input_iterator<int *>(num), input_iterator<int *>(num + 1),
  67. eq<int> ));
  68. // Identical long sequences are equal.
  69. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  70. input_iterator<int *>(num), input_iterator<int *>(num + sz)));
  71. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  72. input_iterator<int *>(num), input_iterator<int *>(num + sz),
  73. eq<int> ));
  74. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  75. input_iterator<int *>(num), input_iterator<int *>(num + sz),
  76. never_eq<int> ));
  77. BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  78. random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
  79. eq<int> ));
  80. // different sequences are different
  81. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
  82. input_iterator<int *>(num), input_iterator<int *>(num + sz)));
  83. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
  84. input_iterator<int *>(num), input_iterator<int *>(num + sz),
  85. eq<int> ));
  86. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  87. input_iterator<int *>(num), input_iterator<int *>(num + sz - 1)));
  88. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  89. input_iterator<int *>(num), input_iterator<int *>(num + sz - 1),
  90. eq<int> ));
  91. // When there's a cheap check, bail early
  92. comparison_count = 0;
  93. BOOST_CHECK (!ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
  94. random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz - 1),
  95. counting_equals<int> ));
  96. BOOST_CHECK ( comparison_count == 0 );
  97. // And when there's not, we can't
  98. comparison_count = 0;
  99. BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  100. input_iterator<int *>(num), input_iterator<int *>(num + sz - 1),
  101. counting_equals<int> ));
  102. BOOST_CHECK ( comparison_count > 0 );
  103. }
  104. BOOST_CXX14_CONSTEXPR bool test_constexpr_equal() {
  105. int num[] = { 1, 1, 2, 3, 5};
  106. const int sz = sizeof (num)/sizeof(num[0]);
  107. bool res = true;
  108. // Empty sequences are equal to each other
  109. res = ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
  110. input_iterator<int *>(num), input_iterator<int *>(num))
  111. // Identical long sequences are equal
  112. && ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
  113. input_iterator<int *>(num), input_iterator<int *>(num + sz),
  114. eq<int> )
  115. // Different sequences are different
  116. && !ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
  117. input_iterator<int *>(num), input_iterator<int *>(num + sz))
  118. );
  119. #ifdef __cpp_lib_array_constexpr // or cpp17 compiler
  120. // Turn on tests for random_access_iterator, because std functions used in equal are marked constexpr_res
  121. res = ( res
  122. // Empty sequences are equal to each other
  123. && ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num),
  124. random_access_iterator<int *>(num), random_access_iterator<int *>(num))
  125. // Identical long sequences are equal
  126. && ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
  127. random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
  128. eq<int> )
  129. // Different sequences are different
  130. && !ba::equal ( random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + sz),
  131. random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz))
  132. );
  133. #endif
  134. return res;
  135. }
  136. BOOST_AUTO_TEST_CASE( test_main )
  137. {
  138. test_equal ();
  139. BOOST_CXX14_CONSTEXPR bool constexpr_res = test_constexpr_equal ();
  140. BOOST_CHECK (constexpr_res);
  141. }