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 Iter1, ForwardIterator Iter2>
13eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//   requires HasEqualTo<Iter1::value_type, Iter2::value_type>
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   Iter1
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   search(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2083e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct count_equal
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static unsigned count;
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class T>
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool operator()(const T& x, const T& y)
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {++count; return x == y;}
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantunsigned count_equal::count = 0;
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter1, class Iter2>
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest()
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ia[] = {0, 1, 2, 3, 4, 5};
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia), count_equal()) == Iter1(ia));
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= 0);
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia+1), count_equal()) == Iter1(ia));
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa);
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+1), Iter2(ia+2), count_equal()) == Iter1(ia+1));
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+2), Iter2(ia+2), count_equal()) == Iter1(ia));
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= 0);
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+2), Iter2(ia+3), count_equal()) == Iter1(ia+2));
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa);
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+2), Iter2(ia+3), count_equal()) == Iter1(ia+2));
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia), Iter2(ia+2), Iter2(ia+3), count_equal()) == Iter1(ia));
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= 0);
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+sa-1), Iter2(ia+sa), count_equal()) == Iter1(ia+sa-1));
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+sa-3), Iter2(ia+sa), count_equal()) == Iter1(ia+sa-3));
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa*3);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia+sa), count_equal()) == Iter1(ia));
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa*sa);
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa-1), Iter2(ia), Iter2(ia+sa), count_equal()) == Iter1(ia+sa-1));
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= (sa-1)*sa);
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+1), Iter2(ia), Iter2(ia+sa), count_equal()) == Iter1(ia+1));
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sa);
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ib[] = {0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4};
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sb = sizeof(ib)/sizeof(ib[0]);
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ic[] = {1};
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(ic), Iter2(ic+1), count_equal()) == Iter1(ib+1));
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sb);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int id[] = {1, 2};
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(id), Iter2(id+2), count_equal()) == Iter1(ib+1));
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sb*2);
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ie[] = {1, 2, 3};
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(ie), Iter2(ie+3), count_equal()) == Iter1(ib+4));
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sb*3);
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ig[] = {1, 2, 3, 4};
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(ig), Iter2(ig+4), count_equal()) == Iter1(ib+8));
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sb*4);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    count_equal::count = 0;
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ih[] = {0, 1, 1, 1, 1, 2, 3, 0, 1, 2, 3, 4};
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sh = sizeof(ih)/sizeof(ih[0]);
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ii[] = {1, 1, 2};
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ih), Iter1(ih+sh), Iter2(ii), Iter2(ii+3), count_equal()) == Iter1(ih+3));
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(count_equal::count <= sh*3);
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, forward_iterator<const int*> >();
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, bidirectional_iterator<const int*> >();
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, random_access_iterator<const int*> >();
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, forward_iterator<const int*> >();
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*> >();
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, random_access_iterator<const int*> >();
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, forward_iterator<const int*> >();
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, bidirectional_iterator<const int*> >();
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, random_access_iterator<const int*> >();
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
112