unique.pass.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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<ForwardIterator Iter>
  11. // requires OutputIterator<Iter, Iter::reference>
  12. // && EqualityComparable<Iter::value_type>
  13. // Iter
  14. // unique(Iter first, Iter last);
  15. #include <algorithm>
  16. #include <cassert>
  17. #include <memory>
  18. #include "test_macros.h"
  19. #include "test_iterators.h"
  20. template <class Iter>
  21. void
  22. test()
  23. {
  24. int ia[] = {0};
  25. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  26. Iter r = std::unique(Iter(ia), Iter(ia+sa));
  27. assert(base(r) == ia + sa);
  28. assert(ia[0] == 0);
  29. int ib[] = {0, 1};
  30. const unsigned sb = sizeof(ib)/sizeof(ib[0]);
  31. r = std::unique(Iter(ib), Iter(ib+sb));
  32. assert(base(r) == ib + sb);
  33. assert(ib[0] == 0);
  34. assert(ib[1] == 1);
  35. int ic[] = {0, 0};
  36. const unsigned sc = sizeof(ic)/sizeof(ic[0]);
  37. r = std::unique(Iter(ic), Iter(ic+sc));
  38. assert(base(r) == ic + 1);
  39. assert(ic[0] == 0);
  40. int id[] = {0, 0, 1};
  41. const unsigned sd = sizeof(id)/sizeof(id[0]);
  42. r = std::unique(Iter(id), Iter(id+sd));
  43. assert(base(r) == id + 2);
  44. assert(id[0] == 0);
  45. assert(id[1] == 1);
  46. int ie[] = {0, 0, 1, 0};
  47. const unsigned se = sizeof(ie)/sizeof(ie[0]);
  48. r = std::unique(Iter(ie), Iter(ie+se));
  49. assert(base(r) == ie + 3);
  50. assert(ie[0] == 0);
  51. assert(ie[1] == 1);
  52. assert(ie[2] == 0);
  53. int ig[] = {0, 0, 1, 1};
  54. const unsigned sg = sizeof(ig)/sizeof(ig[0]);
  55. r = std::unique(Iter(ig), Iter(ig+sg));
  56. assert(base(r) == ig + 2);
  57. assert(ig[0] == 0);
  58. assert(ig[1] == 1);
  59. int ih[] = {0, 1, 1};
  60. const unsigned sh = sizeof(ih)/sizeof(ih[0]);
  61. r = std::unique(Iter(ih), Iter(ih+sh));
  62. assert(base(r) == ih + 2);
  63. assert(ih[0] == 0);
  64. assert(ih[1] == 1);
  65. int ii[] = {0, 1, 1, 1, 2, 2, 2};
  66. const unsigned si = sizeof(ii)/sizeof(ii[0]);
  67. r = std::unique(Iter(ii), Iter(ii+si));
  68. assert(base(r) == ii + 3);
  69. assert(ii[0] == 0);
  70. assert(ii[1] == 1);
  71. assert(ii[2] == 2);
  72. }
  73. #if TEST_STD_VER >= 11
  74. struct do_nothing
  75. {
  76. void operator()(void*) const {}
  77. };
  78. typedef std::unique_ptr<int, do_nothing> Ptr;
  79. template <class Iter>
  80. void
  81. test1()
  82. {
  83. int one = 1;
  84. int two = 2;
  85. Ptr ia[1];
  86. const unsigned sa = sizeof(ia)/sizeof(ia[0]);
  87. Iter r = std::unique(Iter(ia), Iter(ia+sa));
  88. assert(base(r) == ia + sa);
  89. assert(ia[0] == 0);
  90. Ptr ib[2];
  91. ib[1].reset(&one);
  92. const unsigned sb = sizeof(ib)/sizeof(ib[0]);
  93. r = std::unique(Iter(ib), Iter(ib+sb));
  94. assert(base(r) == ib + sb);
  95. assert(ib[0] == 0);
  96. assert(*ib[1] == 1);
  97. Ptr ic[2];
  98. const unsigned sc = sizeof(ic)/sizeof(ic[0]);
  99. r = std::unique(Iter(ic), Iter(ic+sc));
  100. assert(base(r) == ic + 1);
  101. assert(ic[0] == 0);
  102. Ptr id[3];
  103. id[2].reset(&one);
  104. const unsigned sd = sizeof(id)/sizeof(id[0]);
  105. r = std::unique(Iter(id), Iter(id+sd));
  106. assert(base(r) == id + 2);
  107. assert(id[0] == 0);
  108. assert(*id[1] == 1);
  109. Ptr ie[4];
  110. ie[2].reset(&one);
  111. const unsigned se = sizeof(ie)/sizeof(ie[0]);
  112. r = std::unique(Iter(ie), Iter(ie+se));
  113. assert(base(r) == ie + 3);
  114. assert(ie[0] == 0);
  115. assert(*ie[1] == 1);
  116. assert(ie[2] == 0);
  117. Ptr ig[4];
  118. ig[2].reset(&one);
  119. ig[3].reset(&one);
  120. const unsigned sg = sizeof(ig)/sizeof(ig[0]);
  121. r = std::unique(Iter(ig), Iter(ig+sg));
  122. assert(base(r) == ig + 2);
  123. assert(ig[0] == 0);
  124. assert(*ig[1] == 1);
  125. Ptr ih[3];
  126. ih[1].reset(&one);
  127. ih[2].reset(&one);
  128. const unsigned sh = sizeof(ih)/sizeof(ih[0]);
  129. r = std::unique(Iter(ih), Iter(ih+sh));
  130. assert(base(r) == ih + 2);
  131. assert(ih[0] == 0);
  132. assert(*ih[1] == 1);
  133. Ptr ii[7];
  134. ii[1].reset(&one);
  135. ii[2].reset(&one);
  136. ii[3].reset(&one);
  137. ii[4].reset(&two);
  138. ii[5].reset(&two);
  139. ii[6].reset(&two);
  140. const unsigned si = sizeof(ii)/sizeof(ii[0]);
  141. r = std::unique(Iter(ii), Iter(ii+si));
  142. assert(base(r) == ii + 3);
  143. assert(ii[0] == 0);
  144. assert(*ii[1] == 1);
  145. assert(*ii[2] == 2);
  146. }
  147. #endif // TEST_STD_VER >= 11
  148. int main()
  149. {
  150. test<forward_iterator<int*> >();
  151. test<bidirectional_iterator<int*> >();
  152. test<random_access_iterator<int*> >();
  153. test<int*>();
  154. #if TEST_STD_VER >= 11
  155. test1<forward_iterator<Ptr*> >();
  156. test1<bidirectional_iterator<Ptr*> >();
  157. test1<random_access_iterator<Ptr*> >();
  158. test1<Ptr*>();
  159. #endif
  160. }