equal_pred.pass.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // <algorithm>
  10. // template<InputIterator Iter1, InputIterator Iter2,
  11. // Predicate<auto, Iter1::value_type, Iter2::value_type> Pred>
  12. // requires CopyConstructible<Pred>
  13. // bool
  14. // equal(Iter1 first1, Iter1 last1, Iter2 first2, Pred pred);
  15. #include <algorithm>
  16. #include <functional>
  17. #include <cassert>
  18. #include "test_iterators.h"
  19. #if _LIBCPP_STD_VER > 11
  20. #define HAS_FOUR_ITERATOR_VERSION
  21. #endif
  22. int comparison_count = 0;
  23. template <typename T>
  24. bool counting_equals ( const T &a, const T &b ) {
  25. ++comparison_count;
  26. return a == b;
  27. }
  28. int main()
  29. {
  30. int ia[] = {0, 1, 2, 3, 4, 5};
  31. const unsigned s = sizeof(ia)/sizeof(ia[0]);
  32. int ib[s] = {0, 1, 2, 5, 4, 5};
  33. assert(std::equal(input_iterator<const int*>(ia),
  34. input_iterator<const int*>(ia+s),
  35. input_iterator<const int*>(ia),
  36. std::equal_to<int>()));
  37. #ifdef HAS_FOUR_ITERATOR_VERSION
  38. assert(std::equal(input_iterator<const int*>(ia),
  39. input_iterator<const int*>(ia+s),
  40. input_iterator<const int*>(ia),
  41. input_iterator<const int*>(ia+s),
  42. std::equal_to<int>()));
  43. assert(std::equal(random_access_iterator<const int*>(ia),
  44. random_access_iterator<const int*>(ia+s),
  45. random_access_iterator<const int*>(ia),
  46. random_access_iterator<const int*>(ia+s),
  47. std::equal_to<int>()));
  48. comparison_count = 0;
  49. assert(!std::equal(input_iterator<const int*>(ia),
  50. input_iterator<const int*>(ia+s),
  51. input_iterator<const int*>(ia),
  52. input_iterator<const int*>(ia+s-1),
  53. counting_equals<int>));
  54. assert(comparison_count > 0);
  55. comparison_count = 0;
  56. assert(!std::equal(random_access_iterator<const int*>(ia),
  57. random_access_iterator<const int*>(ia+s),
  58. random_access_iterator<const int*>(ia),
  59. random_access_iterator<const int*>(ia+s-1),
  60. counting_equals<int>));
  61. assert(comparison_count == 0);
  62. #endif
  63. assert(!std::equal(input_iterator<const int*>(ia),
  64. input_iterator<const int*>(ia+s),
  65. input_iterator<const int*>(ib),
  66. std::equal_to<int>()));
  67. #ifdef HAS_FOUR_ITERATOR_VERSION
  68. assert(!std::equal(input_iterator<const int*>(ia),
  69. input_iterator<const int*>(ia+s),
  70. input_iterator<const int*>(ib),
  71. input_iterator<const int*>(ib+s),
  72. std::equal_to<int>()));
  73. assert(!std::equal(random_access_iterator<const int*>(ia),
  74. random_access_iterator<const int*>(ia+s),
  75. random_access_iterator<const int*>(ib),
  76. random_access_iterator<const int*>(ib+s),
  77. std::equal_to<int>()));
  78. #endif
  79. }