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<InputIterator InIter, class OutIter>
13eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//   requires OutputIterator<OutIter, RvalueOf<InIter::value_type>::type>
14eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//         && EqualityComparable<InIter::value_type>
15eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//         && HasAssign<InIter::value_type, InIter::reference>
16eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//         && Constructible<InIter::value_type, InIter::reference>
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   OutIter
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   unique_copy(InIter first, InIter last, OutIter result);
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm>
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2383e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class InIter, class OutIter>
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest()
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ia[] = {0};
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ja[sa] = {-1};
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    OutIter r = std::unique_copy(InIter(ia), InIter(ia+sa), OutIter(ja));
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ja + sa);
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ja[0] == 0);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ib[] = {0, 1};
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sb = sizeof(ib)/sizeof(ib[0]);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int jb[sb] = {-1};
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(ib), InIter(ib+sb), OutIter(jb));
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == jb + sb);
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jb[0] == 0);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jb[1] == 1);
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ic[] = {0, 0};
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sc = sizeof(ic)/sizeof(ic[0]);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int jc[sc] = {-1};
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(ic), InIter(ic+sc), OutIter(jc));
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == jc + 1);
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jc[0] == 0);
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int id[] = {0, 0, 1};
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sd = sizeof(id)/sizeof(id[0]);
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int jd[sd] = {-1};
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(id), InIter(id+sd), OutIter(jd));
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == jd + 2);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jd[0] == 0);
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jd[1] == 1);
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ie[] = {0, 0, 1, 0};
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned se = sizeof(ie)/sizeof(ie[0]);
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int je[se] = {-1};
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(ie), InIter(ie+se), OutIter(je));
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == je + 3);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(je[0] == 0);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(je[1] == 1);
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(je[2] == 0);
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ig[] = {0, 0, 1, 1};
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sg = sizeof(ig)/sizeof(ig[0]);
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int jg[sg] = {-1};
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(ig), InIter(ig+sg), OutIter(jg));
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == jg + 2);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jg[0] == 0);
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jg[1] == 1);
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ih[] = {0, 1, 1};
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sh = sizeof(ih)/sizeof(ih[0]);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int jh[sh] = {-1};
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(ih), InIter(ih+sh), OutIter(jh));
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == jh + 2);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jh[0] == 0);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(jh[1] == 1);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const int ii[] = {0, 1, 1, 1, 2, 2, 2};
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned si = sizeof(ii)/sizeof(ii[0]);
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ji[si] = {-1};
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    r = std::unique_copy(InIter(ii), InIter(ii+si), OutIter(ji));
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(base(r) == ji + 3);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ji[0] == 0);
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ji[1] == 1);
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ji[2] == 2);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<input_iterator<const int*>, output_iterator<int*> >();
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<input_iterator<const int*>, forward_iterator<int*> >();
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<input_iterator<const int*>, bidirectional_iterator<int*> >();
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<input_iterator<const int*>, random_access_iterator<int*> >();
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<input_iterator<const int*>, int*>();
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, output_iterator<int*> >();
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, forward_iterator<int*> >();
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, bidirectional_iterator<int*> >();
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, random_access_iterator<int*> >();
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, int*>();
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, output_iterator<int*> >();
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, int*>();
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, output_iterator<int*> >();
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, forward_iterator<int*> >();
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, random_access_iterator<int*> >();
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, int*>();
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<const int*, output_iterator<int*> >();
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<const int*, forward_iterator<int*> >();
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<const int*, bidirectional_iterator<int*> >();
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<const int*, random_access_iterator<int*> >();
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<const int*, int*>();
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
126