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>
12 // requires OutputIterator<Iter, Iter::reference>
13 // && EqualityComparable<Iter::value_type>
14 // constexpr Iter // constexpr after C++17
15 // unique(Iter first, Iter last);
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
));
31 return it
== (std::begin(ia
) + N
)
32 && std::equal(std::begin(ia
), it
, std::begin(expected
), std::end(expected
))
42 const unsigned sa
= sizeof(ia
)/sizeof(ia
[0]);
43 Iter r
= std::unique(Iter(ia
), Iter(ia
+sa
));
44 assert(base(r
) == ia
+ sa
);
48 const unsigned sb
= sizeof(ib
)/sizeof(ib
[0]);
49 r
= std::unique(Iter(ib
), Iter(ib
+sb
));
50 assert(base(r
) == ib
+ sb
);
55 const unsigned sc
= sizeof(ic
)/sizeof(ic
[0]);
56 r
= std::unique(Iter(ic
), Iter(ic
+sc
));
57 assert(base(r
) == ic
+ 1);
61 const unsigned sd
= sizeof(id
)/sizeof(id
[0]);
62 r
= std::unique(Iter(id
), Iter(id
+sd
));
63 assert(base(r
) == id
+ 2);
67 int ie
[] = {0, 0, 1, 0};
68 const unsigned se
= sizeof(ie
)/sizeof(ie
[0]);
69 r
= std::unique(Iter(ie
), Iter(ie
+se
));
70 assert(base(r
) == ie
+ 3);
75 int ig
[] = {0, 0, 1, 1};
76 const unsigned sg
= sizeof(ig
)/sizeof(ig
[0]);
77 r
= std::unique(Iter(ig
), Iter(ig
+sg
));
78 assert(base(r
) == ig
+ 2);
83 const unsigned sh
= sizeof(ih
)/sizeof(ih
[0]);
84 r
= std::unique(Iter(ih
), Iter(ih
+sh
));
85 assert(base(r
) == ih
+ 2);
89 int ii
[] = {0, 1, 1, 1, 2, 2, 2};
90 const unsigned si
= sizeof(ii
)/sizeof(ii
[0]);
91 r
= std::unique(Iter(ii
), Iter(ii
+si
));
92 assert(base(r
) == ii
+ 3);
98 #if TEST_STD_VER >= 11
102 void operator()(void*) const {}
105 typedef std::unique_ptr
<int, do_nothing
> Ptr
;
107 template <class Iter
>
114 const unsigned sa
= sizeof(ia
)/sizeof(ia
[0]);
115 Iter r
= std::unique(Iter(ia
), Iter(ia
+sa
));
116 assert(base(r
) == ia
+ sa
);
121 const unsigned sb
= sizeof(ib
)/sizeof(ib
[0]);
122 r
= std::unique(Iter(ib
), Iter(ib
+sb
));
123 assert(base(r
) == ib
+ sb
);
128 const unsigned sc
= sizeof(ic
)/sizeof(ic
[0]);
129 r
= std::unique(Iter(ic
), Iter(ic
+sc
));
130 assert(base(r
) == ic
+ 1);
135 const unsigned sd
= sizeof(id
)/sizeof(id
[0]);
136 r
= std::unique(Iter(id
), Iter(id
+sd
));
137 assert(base(r
) == id
+ 2);
143 const unsigned se
= sizeof(ie
)/sizeof(ie
[0]);
144 r
= std::unique(Iter(ie
), Iter(ie
+se
));
145 assert(base(r
) == ie
+ 3);
153 const unsigned sg
= sizeof(ig
)/sizeof(ig
[0]);
154 r
= std::unique(Iter(ig
), Iter(ig
+sg
));
155 assert(base(r
) == ig
+ 2);
162 const unsigned sh
= sizeof(ih
)/sizeof(ih
[0]);
163 r
= std::unique(Iter(ih
), Iter(ih
+sh
));
164 assert(base(r
) == ih
+ 2);
175 const unsigned si
= sizeof(ii
)/sizeof(ii
[0]);
176 r
= std::unique(Iter(ii
), Iter(ii
+si
));
177 assert(base(r
) == ii
+ 3);
182 #endif // TEST_STD_VER >= 11
184 int main(int, char**)
186 test
<forward_iterator
<int*> >();
187 test
<bidirectional_iterator
<int*> >();
188 test
<random_access_iterator
<int*> >();
191 #if TEST_STD_VER >= 11
192 test1
<forward_iterator
<Ptr
*> >();
193 test1
<bidirectional_iterator
<Ptr
*> >();
194 test1
<random_access_iterator
<Ptr
*> >();
198 #if TEST_STD_VER > 17
199 static_assert(test_constexpr());