search_n_pred.pass.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <algorithm>
  9. // template<class ForwardIterator, class Size, class T, class BinaryPredicate>
  10. // constexpr ForwardIterator // constexpr after C++17
  11. // search_n(ForwardIterator first, ForwardIterator last, Size count,
  12. // const T& value, BinaryPredicate pred);
  13. #include <algorithm>
  14. #include <cassert>
  15. #include "test_macros.h"
  16. #include "test_iterators.h"
  17. #include "user_defined_integral.h"
  18. #if TEST_STD_VER > 17
  19. TEST_CONSTEXPR bool eq(int a, int b) { return a == b; }
  20. TEST_CONSTEXPR bool test_constexpr() {
  21. int ia[] = {0, 0, 1, 1, 2, 2};
  22. return (std::search_n(std::begin(ia), std::end(ia), 1, 0, eq) == ia)
  23. && (std::search_n(std::begin(ia), std::end(ia), 2, 1, eq) == ia+2)
  24. && (std::search_n(std::begin(ia), std::end(ia), 1, 3, eq) == std::end(ia))
  25. ;
  26. }
  27. #endif
  28. struct count_equal
  29. {
  30. static unsigned count;
  31. template <class T>
  32. bool operator()(const T& x, const T& y)
  33. {++count; return x == y;}
  34. };
  35. unsigned count_equal::count = 0;
  36. template <class Iter>
  37. void
  38. test()
  39. {
  40. int ia[] = {0, 1, 2, 3, 4, 5};
  41. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  42. count_equal::count = 0;
  43. assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 0, count_equal()) == Iter(ia));
  44. assert(count_equal::count <= sa);
  45. count_equal::count = 0;
  46. assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 0, count_equal()) == Iter(ia+0));
  47. assert(count_equal::count <= sa);
  48. count_equal::count = 0;
  49. assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 0, count_equal()) == Iter(ia+sa));
  50. assert(count_equal::count <= sa);
  51. count_equal::count = 0;
  52. assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 0, count_equal()) == Iter(ia+sa));
  53. assert(count_equal::count <= sa);
  54. count_equal::count = 0;
  55. assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 3, count_equal()) == Iter(ia));
  56. assert(count_equal::count <= sa);
  57. count_equal::count = 0;
  58. assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 3, count_equal()) == Iter(ia+3));
  59. assert(count_equal::count <= sa);
  60. count_equal::count = 0;
  61. assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 3, count_equal()) == Iter(ia+sa));
  62. assert(count_equal::count <= sa);
  63. count_equal::count = 0;
  64. assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 3, count_equal()) == Iter(ia+sa));
  65. assert(count_equal::count <= sa);
  66. count_equal::count = 0;
  67. assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 5, count_equal()) == Iter(ia));
  68. assert(count_equal::count <= sa);
  69. count_equal::count = 0;
  70. assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 5, count_equal()) == Iter(ia+5));
  71. assert(count_equal::count <= sa);
  72. count_equal::count = 0;
  73. assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 5, count_equal()) == Iter(ia+sa));
  74. assert(count_equal::count <= sa);
  75. count_equal::count = 0;
  76. assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 5, count_equal()) == Iter(ia+sa));
  77. assert(count_equal::count <= sa);
  78. count_equal::count = 0;
  79. int ib[] = {0, 0, 1, 1, 2, 2};
  80. const unsigned sb = sizeof(ib)/sizeof(ib[0]);
  81. assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 0, count_equal()) == Iter(ib));
  82. assert(count_equal::count <= sb);
  83. count_equal::count = 0;
  84. assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 0, count_equal()) == Iter(ib+0));
  85. assert(count_equal::count <= sb);
  86. count_equal::count = 0;
  87. assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 0, count_equal()) == Iter(ib+0));
  88. assert(count_equal::count <= sb);
  89. count_equal::count = 0;
  90. assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 0, count_equal()) == Iter(ib+sb));
  91. assert(count_equal::count <= sb);
  92. count_equal::count = 0;
  93. assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 0, count_equal()) == Iter(ib+sb));
  94. assert(count_equal::count <= sb);
  95. count_equal::count = 0;
  96. assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 1, count_equal()) == Iter(ib));
  97. assert(count_equal::count <= sb);
  98. count_equal::count = 0;
  99. assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 1, count_equal()) == Iter(ib+2));
  100. assert(count_equal::count <= sb);
  101. count_equal::count = 0;
  102. assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 1, count_equal()) == Iter(ib+2));
  103. assert(count_equal::count <= sb);
  104. count_equal::count = 0;
  105. assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 1, count_equal()) == Iter(ib+sb));
  106. assert(count_equal::count <= sb);
  107. count_equal::count = 0;
  108. assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 1, count_equal()) == Iter(ib+sb));
  109. assert(count_equal::count <= sb);
  110. count_equal::count = 0;
  111. assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 2, count_equal()) == Iter(ib));
  112. assert(count_equal::count <= sb);
  113. count_equal::count = 0;
  114. assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 2, count_equal()) == Iter(ib+4));
  115. assert(count_equal::count <= sb);
  116. count_equal::count = 0;
  117. assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 2, count_equal()) == Iter(ib+4));
  118. assert(count_equal::count <= sb);
  119. count_equal::count = 0;
  120. assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 2, count_equal()) == Iter(ib+sb));
  121. assert(count_equal::count <= sb);
  122. count_equal::count = 0;
  123. assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 2, count_equal()) == Iter(ib+sb));
  124. assert(count_equal::count <= sb);
  125. count_equal::count = 0;
  126. int ic[] = {0, 0, 0};
  127. const unsigned sc = sizeof(ic)/sizeof(ic[0]);
  128. assert(std::search_n(Iter(ic), Iter(ic+sc), 0, 0, count_equal()) == Iter(ic));
  129. assert(count_equal::count <= sc);
  130. count_equal::count = 0;
  131. assert(std::search_n(Iter(ic), Iter(ic+sc), 1, 0, count_equal()) == Iter(ic));
  132. assert(count_equal::count <= sc);
  133. count_equal::count = 0;
  134. assert(std::search_n(Iter(ic), Iter(ic+sc), 2, 0, count_equal()) == Iter(ic));
  135. assert(count_equal::count <= sc);
  136. count_equal::count = 0;
  137. assert(std::search_n(Iter(ic), Iter(ic+sc), 3, 0, count_equal()) == Iter(ic));
  138. assert(count_equal::count <= sc);
  139. count_equal::count = 0;
  140. assert(std::search_n(Iter(ic), Iter(ic+sc), 4, 0, count_equal()) == Iter(ic+sc));
  141. assert(count_equal::count <= sc);
  142. count_equal::count = 0;
  143. // Check that we properly convert the size argument to an integral.
  144. TEST_IGNORE_NODISCARD std::search_n(Iter(ic), Iter(ic+sc), UserDefinedIntegral<unsigned>(4), 0, count_equal());
  145. count_equal::count = 0;
  146. }
  147. int main(int, char**)
  148. {
  149. test<forward_iterator<const int*> >();
  150. test<bidirectional_iterator<const int*> >();
  151. test<random_access_iterator<const int*> >();
  152. #if TEST_STD_VER > 17
  153. static_assert(test_constexpr());
  154. #endif
  155. return 0;
  156. }