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 Hinnanttemplate <class Iter1, class Iter2>
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest()
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ia[] = {0, 1, 2, 3, 4, 5};
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia)) == Iter1(ia));
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia+1)) == Iter1(ia));
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+1), Iter2(ia+2)) == Iter1(ia+1));
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+2), Iter2(ia+2)) == Iter1(ia));
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+2), Iter2(ia+3)) == Iter1(ia+2));
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+2), Iter2(ia+3)) == Iter1(ia+2));
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia), Iter2(ia+2), Iter2(ia+3)) == Iter1(ia));
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+sa-1), Iter2(ia+sa)) == Iter1(ia+sa-1));
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia+sa-3), Iter2(ia+sa)) == Iter1(ia+sa-3));
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia+sa)) == Iter1(ia));
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+sa-1), Iter2(ia), Iter2(ia+sa)) == Iter1(ia+sa-1));
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ia), Iter1(ia+1), Iter2(ia), Iter2(ia+sa)) == Iter1(ia+1));
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ib[] = {0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4};
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sb = sizeof(ib)/sizeof(ib[0]);
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ic[] = {1};
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(ic), Iter2(ic+1)) == Iter1(ib+1));
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int id[] = {1, 2};
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(id), Iter2(id+2)) == Iter1(ib+1));
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ie[] = {1, 2, 3};
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(ie), Iter2(ie+3)) == Iter1(ib+4));
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ig[] = {1, 2, 3, 4};
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ib), Iter1(ib+sb), Iter2(ig), Iter2(ig+4)) == Iter1(ib+8));
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ih[] = {0, 1, 1, 1, 1, 2, 3, 0, 1, 2, 3, 4};
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sh = sizeof(ih)/sizeof(ih[0]);
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ii[] = {1, 1, 2};
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ih), Iter1(ih+sh), Iter2(ii), Iter2(ii+3)) == Iter1(ih+3));
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ij[] = {0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sj = sizeof(ij)/sizeof(ij[0]);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ik[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned sk = sizeof(ik)/sizeof(ik[0]);
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(std::search(Iter1(ij), Iter1(ij+sj), Iter2(ik), Iter2(ik+sk)) == Iter1(ij+6));
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, forward_iterator<const int*> >();
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, bidirectional_iterator<const int*> >();
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<forward_iterator<const int*>, random_access_iterator<const int*> >();
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, forward_iterator<const int*> >();
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*> >();
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<bidirectional_iterator<const int*>, random_access_iterator<const int*> >();
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, forward_iterator<const int*> >();
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, bidirectional_iterator<const int*> >();
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test<random_access_iterator<const int*>, random_access_iterator<const int*> >();
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
73