search_n_pred.pass.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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<class ForwardIterator, class Size, class T, class BinaryPredicate>
  11. // ForwardIterator
  12. // search_n(ForwardIterator first, ForwardIterator last, Size count,
  13. // const T& value, BinaryPredicate pred);
  14. #include <algorithm>
  15. #include <cassert>
  16. #include "test_iterators.h"
  17. #include "user_defined_integral.hpp"
  18. struct count_equal
  19. {
  20. static unsigned count;
  21. template <class T>
  22. bool operator()(const T& x, const T& y)
  23. {++count; return x == y;}
  24. };
  25. unsigned count_equal::count = 0;
  26. template <class Iter>
  27. void
  28. test()
  29. {
  30. int ia[] = {0, 1, 2, 3, 4, 5};
  31. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  32. count_equal::count = 0;
  33. assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 0, count_equal()) == Iter(ia));
  34. assert(count_equal::count <= sa);
  35. count_equal::count = 0;
  36. assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 0, count_equal()) == Iter(ia+0));
  37. assert(count_equal::count <= sa);
  38. count_equal::count = 0;
  39. assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 0, count_equal()) == Iter(ia+sa));
  40. assert(count_equal::count <= sa);
  41. count_equal::count = 0;
  42. assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 0, count_equal()) == Iter(ia+sa));
  43. assert(count_equal::count <= sa);
  44. count_equal::count = 0;
  45. assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 3, count_equal()) == Iter(ia));
  46. assert(count_equal::count <= sa);
  47. count_equal::count = 0;
  48. assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 3, count_equal()) == Iter(ia+3));
  49. assert(count_equal::count <= sa);
  50. count_equal::count = 0;
  51. assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 3, count_equal()) == Iter(ia+sa));
  52. assert(count_equal::count <= sa);
  53. count_equal::count = 0;
  54. assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 3, count_equal()) == Iter(ia+sa));
  55. assert(count_equal::count <= sa);
  56. count_equal::count = 0;
  57. assert(std::search_n(Iter(ia), Iter(ia+sa), 0, 5, count_equal()) == Iter(ia));
  58. assert(count_equal::count <= sa);
  59. count_equal::count = 0;
  60. assert(std::search_n(Iter(ia), Iter(ia+sa), 1, 5, count_equal()) == Iter(ia+5));
  61. assert(count_equal::count <= sa);
  62. count_equal::count = 0;
  63. assert(std::search_n(Iter(ia), Iter(ia+sa), 2, 5, count_equal()) == Iter(ia+sa));
  64. assert(count_equal::count <= sa);
  65. count_equal::count = 0;
  66. assert(std::search_n(Iter(ia), Iter(ia+sa), sa, 5, count_equal()) == Iter(ia+sa));
  67. assert(count_equal::count <= sa);
  68. count_equal::count = 0;
  69. int ib[] = {0, 0, 1, 1, 2, 2};
  70. const unsigned sb = sizeof(ib)/sizeof(ib[0]);
  71. assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 0, count_equal()) == Iter(ib));
  72. assert(count_equal::count <= sb);
  73. count_equal::count = 0;
  74. assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 0, count_equal()) == Iter(ib+0));
  75. assert(count_equal::count <= sb);
  76. count_equal::count = 0;
  77. assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 0, count_equal()) == Iter(ib+0));
  78. assert(count_equal::count <= sb);
  79. count_equal::count = 0;
  80. assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 0, count_equal()) == Iter(ib+sb));
  81. assert(count_equal::count <= sb);
  82. count_equal::count = 0;
  83. assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 0, count_equal()) == Iter(ib+sb));
  84. assert(count_equal::count <= sb);
  85. count_equal::count = 0;
  86. assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 1, count_equal()) == Iter(ib));
  87. assert(count_equal::count <= sb);
  88. count_equal::count = 0;
  89. assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 1, count_equal()) == Iter(ib+2));
  90. assert(count_equal::count <= sb);
  91. count_equal::count = 0;
  92. assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 1, count_equal()) == Iter(ib+2));
  93. assert(count_equal::count <= sb);
  94. count_equal::count = 0;
  95. assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 1, count_equal()) == Iter(ib+sb));
  96. assert(count_equal::count <= sb);
  97. count_equal::count = 0;
  98. assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 1, count_equal()) == Iter(ib+sb));
  99. assert(count_equal::count <= sb);
  100. count_equal::count = 0;
  101. assert(std::search_n(Iter(ib), Iter(ib+sb), 0, 2, count_equal()) == Iter(ib));
  102. assert(count_equal::count <= sb);
  103. count_equal::count = 0;
  104. assert(std::search_n(Iter(ib), Iter(ib+sb), 1, 2, count_equal()) == Iter(ib+4));
  105. assert(count_equal::count <= sb);
  106. count_equal::count = 0;
  107. assert(std::search_n(Iter(ib), Iter(ib+sb), 2, 2, count_equal()) == Iter(ib+4));
  108. assert(count_equal::count <= sb);
  109. count_equal::count = 0;
  110. assert(std::search_n(Iter(ib), Iter(ib+sb), 3, 2, count_equal()) == Iter(ib+sb));
  111. assert(count_equal::count <= sb);
  112. count_equal::count = 0;
  113. assert(std::search_n(Iter(ib), Iter(ib+sb), sb, 2, count_equal()) == Iter(ib+sb));
  114. assert(count_equal::count <= sb);
  115. count_equal::count = 0;
  116. int ic[] = {0, 0, 0};
  117. const unsigned sc = sizeof(ic)/sizeof(ic[0]);
  118. assert(std::search_n(Iter(ic), Iter(ic+sc), 0, 0, count_equal()) == Iter(ic));
  119. assert(count_equal::count <= sc);
  120. count_equal::count = 0;
  121. assert(std::search_n(Iter(ic), Iter(ic+sc), 1, 0, count_equal()) == Iter(ic));
  122. assert(count_equal::count <= sc);
  123. count_equal::count = 0;
  124. assert(std::search_n(Iter(ic), Iter(ic+sc), 2, 0, count_equal()) == Iter(ic));
  125. assert(count_equal::count <= sc);
  126. count_equal::count = 0;
  127. assert(std::search_n(Iter(ic), Iter(ic+sc), 3, 0, count_equal()) == Iter(ic));
  128. assert(count_equal::count <= sc);
  129. count_equal::count = 0;
  130. assert(std::search_n(Iter(ic), Iter(ic+sc), 4, 0, count_equal()) == Iter(ic+sc));
  131. assert(count_equal::count <= sc);
  132. count_equal::count = 0;
  133. // Check that we properly convert the size argument to an integral.
  134. TEST_IGNORE_NODISCARD std::search_n(Iter(ic), Iter(ic+sc), UserDefinedIntegral<unsigned>(4), 0, count_equal());
  135. count_equal::count = 0;
  136. }
  137. int main()
  138. {
  139. test<forward_iterator<const int*> >();
  140. test<bidirectional_iterator<const int*> >();
  141. test<random_access_iterator<const int*> >();
  142. }