unique.pass.cpp 4.6 KB

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