search_n_pred.pass.cpp 6.0 KB

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