1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <algorithm>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant// template<ForwardIterator Iter, EquivalenceRelation<auto, Iter::value_type> Pred>
13eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//   requires OutputIterator<Iter, RvalueOf<Iter::reference>::type>
14eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//         && CopyConstructible<Pred>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   Iter
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   unique(Iter first, Iter last, Pred pred);
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
2073d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <memory>
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2483e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct count_equal
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static unsigned count;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class T>
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool operator()(const T& x, const T& y)
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {++count; return x == y;}
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantunsigned count_equal::count = 0;
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter>
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest()
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ia[] = {0};
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Iter r = std::unique(Iter(ia), Iter(ia+sa), count_equal());
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ia + sa);
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ia[0] == 0);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sa-1);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ib[] = {0, 1};
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sb = sizeof(ib)/sizeof(ib[0]);
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ib), Iter(ib+sb), count_equal());
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ib + sb);
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ib[0] == 0);
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ib[1] == 1);
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sb-1);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ic[] = {0, 0};
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sc = sizeof(ic)/sizeof(ic[0]);
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ic), Iter(ic+sc), count_equal());
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ic + 1);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ic[0] == 0);
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sc-1);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int id[] = {0, 0, 1};
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sd = sizeof(id)/sizeof(id[0]);
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(id), Iter(id+sd), count_equal());
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == id + 2);
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(id[0] == 0);
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(id[1] == 1);
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sd-1);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ie[] = {0, 0, 1, 0};
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned se = sizeof(ie)/sizeof(ie[0]);
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ie), Iter(ie+se), count_equal());
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ie + 3);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ie[0] == 0);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ie[1] == 1);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ie[2] == 0);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == se-1);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ig[] = {0, 0, 1, 1};
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sg = sizeof(ig)/sizeof(ig[0]);
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ig), Iter(ig+sg), count_equal());
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ig + 2);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ig[0] == 0);
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ig[1] == 1);
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sg-1);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ih[] = {0, 1, 1};
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sh = sizeof(ih)/sizeof(ih[0]);
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ih), Iter(ih+sh), count_equal());
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ih + 2);
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ih[0] == 0);
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ih[1] == 1);
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sh-1);
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ii[] = {0, 1, 1, 1, 2, 2, 2};
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned si = sizeof(ii)/sizeof(ii[0]);
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ii), Iter(ii+si), count_equal());
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ii + 3);
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ii[0] == 0);
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ii[1] == 1);
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ii[2] == 2);
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == si-1);
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct do_nothing
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator()(void*) const {}
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypedef std::unique_ptr<int, do_nothing> Ptr;
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter>
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest1()
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int one = 1;
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int two = 2;
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ia[1];
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Iter r = std::unique(Iter(ia), Iter(ia+sa), count_equal());
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ia + sa);
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ia[0] == 0);
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sa-1);
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ib[2];
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ib[1].reset(&one);
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sb = sizeof(ib)/sizeof(ib[0]);
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ib), Iter(ib+sb), count_equal());
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ib + sb);
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ib[0] == 0);
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*ib[1] == 1);
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sb-1);
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ic[2];
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sc = sizeof(ic)/sizeof(ic[0]);
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ic), Iter(ic+sc), count_equal());
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ic + 1);
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ic[0] == 0);
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sc-1);
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr id[3];
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    id[2].reset(&one);
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sd = sizeof(id)/sizeof(id[0]);
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(id), Iter(id+sd), count_equal());
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == id + 2);
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(id[0] == 0);
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*id[1] == 1);
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sd-1);
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ie[4];
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ie[2].reset(&one);
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned se = sizeof(ie)/sizeof(ie[0]);
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ie), Iter(ie+se), count_equal());
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ie + 3);
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ie[0] == 0);
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*ie[1] == 1);
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ie[2] == 0);
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == se-1);
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ig[4];
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ig[2].reset(&one);
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ig[3].reset(&one);
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sg = sizeof(ig)/sizeof(ig[0]);
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ig), Iter(ig+sg), count_equal());
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ig + 2);
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ig[0] == 0);
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*ig[1] == 1);
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sg-1);
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ih[3];
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ih[1].reset(&one);
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ih[2].reset(&one);
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sh = sizeof(ih)/sizeof(ih[0]);
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ih), Iter(ih+sh), count_equal());
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ih + 2);
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ih[0] == 0);
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*ih[1] == 1);
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == sh-1);
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    Ptr ii[7];
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ii[1].reset(&one);
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ii[2].reset(&one);
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ii[3].reset(&one);
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ii[4].reset(&two);
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ii[5].reset(&two);
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ii[6].reset(&two);
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned si = sizeof(ii)/sizeof(ii[0]);
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique(Iter(ii), Iter(ii+si), count_equal());
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ii + 3);
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ii[0] == 0);
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*ii[1] == 1);
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(*ii[2] == 2);
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count == si-1);
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
21473d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<int*> >();
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<int*> >();
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<int*> >();
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<int*>();
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test1<forward_iterator<Ptr*> >();
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test1<bidirectional_iterator<Ptr*> >();
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test1<random_access_iterator<Ptr*> >();
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test1<Ptr*>();
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23073d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
232