1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
11 // template<ForwardIterator Iter, EquivalenceRelation<auto, Iter::value_type> Pred>
12 // requires OutputIterator<Iter, RvalueOf<Iter::reference>::type>
13 // && CopyConstructible<Pred>
14 // constexpr Iter // constexpr after C++17
15 // unique(Iter first, Iter last, Pred pred);
21 #include "test_macros.h"
22 #include "test_iterators.h"
25 TEST_CONSTEXPR
bool test_constexpr() {
26 int ia
[] = {0, 1, 1, 3, 4};
27 const int expected
[] = {0, 1, 3, 4};
28 const std::size_t N
= 4;
30 auto it
= std::unique(std::begin(ia
), std::end(ia
), [](int a
, int b
) {return a
== b
; });
31 return it
== (std::begin(ia
) + N
)
32 && std::equal(std::begin(ia
), it
, std::begin(expected
), std::end(expected
))
39 static unsigned count
;
41 bool operator()(const T
& x
, const T
& y
)
42 {++count
; return x
== y
;}
45 unsigned count_equal::count
= 0;
52 const unsigned sa
= sizeof(ia
)/sizeof(ia
[0]);
53 count_equal::count
= 0;
54 Iter r
= std::unique(Iter(ia
), Iter(ia
+sa
), count_equal());
55 assert(base(r
) == ia
+ sa
);
57 assert(count_equal::count
== sa
-1);
60 const unsigned sb
= sizeof(ib
)/sizeof(ib
[0]);
61 count_equal::count
= 0;
62 r
= std::unique(Iter(ib
), Iter(ib
+sb
), count_equal());
63 assert(base(r
) == ib
+ sb
);
66 assert(count_equal::count
== sb
-1);
69 const unsigned sc
= sizeof(ic
)/sizeof(ic
[0]);
70 count_equal::count
= 0;
71 r
= std::unique(Iter(ic
), Iter(ic
+sc
), count_equal());
72 assert(base(r
) == ic
+ 1);
74 assert(count_equal::count
== sc
-1);
77 const unsigned sd
= sizeof(id
)/sizeof(id
[0]);
78 count_equal::count
= 0;
79 r
= std::unique(Iter(id
), Iter(id
+sd
), count_equal());
80 assert(base(r
) == id
+ 2);
83 assert(count_equal::count
== sd
-1);
85 int ie
[] = {0, 0, 1, 0};
86 const unsigned se
= sizeof(ie
)/sizeof(ie
[0]);
87 count_equal::count
= 0;
88 r
= std::unique(Iter(ie
), Iter(ie
+se
), count_equal());
89 assert(base(r
) == ie
+ 3);
93 assert(count_equal::count
== se
-1);
95 int ig
[] = {0, 0, 1, 1};
96 const unsigned sg
= sizeof(ig
)/sizeof(ig
[0]);
97 count_equal::count
= 0;
98 r
= std::unique(Iter(ig
), Iter(ig
+sg
), count_equal());
99 assert(base(r
) == ig
+ 2);
102 assert(count_equal::count
== sg
-1);
104 int ih
[] = {0, 1, 1};
105 const unsigned sh
= sizeof(ih
)/sizeof(ih
[0]);
106 count_equal::count
= 0;
107 r
= std::unique(Iter(ih
), Iter(ih
+sh
), count_equal());
108 assert(base(r
) == ih
+ 2);
111 assert(count_equal::count
== sh
-1);
113 int ii
[] = {0, 1, 1, 1, 2, 2, 2};
114 const unsigned si
= sizeof(ii
)/sizeof(ii
[0]);
115 count_equal::count
= 0;
116 r
= std::unique(Iter(ii
), Iter(ii
+si
), count_equal());
117 assert(base(r
) == ii
+ 3);
121 assert(count_equal::count
== si
-1);
124 #if TEST_STD_VER >= 11
128 void operator()(void*) const {}
131 typedef std::unique_ptr
<int, do_nothing
> Ptr
;
133 template <class Iter
>
140 const unsigned sa
= sizeof(ia
)/sizeof(ia
[0]);
141 count_equal::count
= 0;
142 Iter r
= std::unique(Iter(ia
), Iter(ia
+sa
), count_equal());
143 assert(base(r
) == ia
+ sa
);
145 assert(count_equal::count
== sa
-1);
149 const unsigned sb
= sizeof(ib
)/sizeof(ib
[0]);
150 count_equal::count
= 0;
151 r
= std::unique(Iter(ib
), Iter(ib
+sb
), count_equal());
152 assert(base(r
) == ib
+ sb
);
155 assert(count_equal::count
== sb
-1);
158 const unsigned sc
= sizeof(ic
)/sizeof(ic
[0]);
159 count_equal::count
= 0;
160 r
= std::unique(Iter(ic
), Iter(ic
+sc
), count_equal());
161 assert(base(r
) == ic
+ 1);
163 assert(count_equal::count
== sc
-1);
167 const unsigned sd
= sizeof(id
)/sizeof(id
[0]);
168 count_equal::count
= 0;
169 r
= std::unique(Iter(id
), Iter(id
+sd
), count_equal());
170 assert(base(r
) == id
+ 2);
173 assert(count_equal::count
== sd
-1);
177 const unsigned se
= sizeof(ie
)/sizeof(ie
[0]);
178 count_equal::count
= 0;
179 r
= std::unique(Iter(ie
), Iter(ie
+se
), count_equal());
180 assert(base(r
) == ie
+ 3);
184 assert(count_equal::count
== se
-1);
189 const unsigned sg
= sizeof(ig
)/sizeof(ig
[0]);
190 count_equal::count
= 0;
191 r
= std::unique(Iter(ig
), Iter(ig
+sg
), count_equal());
192 assert(base(r
) == ig
+ 2);
195 assert(count_equal::count
== sg
-1);
200 const unsigned sh
= sizeof(ih
)/sizeof(ih
[0]);
201 count_equal::count
= 0;
202 r
= std::unique(Iter(ih
), Iter(ih
+sh
), count_equal());
203 assert(base(r
) == ih
+ 2);
206 assert(count_equal::count
== sh
-1);
215 const unsigned si
= sizeof(ii
)/sizeof(ii
[0]);
216 count_equal::count
= 0;
217 r
= std::unique(Iter(ii
), Iter(ii
+si
), count_equal());
218 assert(base(r
) == ii
+ 3);
222 assert(count_equal::count
== si
-1);
224 #endif // TEST_STD_VER >= 11
226 int main(int, char**)
228 test
<forward_iterator
<int*> >();
229 test
<bidirectional_iterator
<int*> >();
230 test
<random_access_iterator
<int*> >();
233 #if TEST_STD_VER >= 11
234 test1
<forward_iterator
<Ptr
*> >();
235 test1
<bidirectional_iterator
<Ptr
*> >();
236 test1
<random_access_iterator
<Ptr
*> >();
240 #if TEST_STD_VER > 17
241 static_assert(test_constexpr());