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 Iter1, ForwardIterator Iter2>
12 // requires HasEqualTo<Iter1::value_type, Iter2::value_type>
13 // constexpr Iter1 // constexpr after C++17
14 // search(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2);
16 // template<class ForwardIterator, class Searcher>
17 // ForwardIterator search(ForwardIterator first, ForwardIterator last,
18 // const Searcher& searcher); // C++17
23 #include "test_macros.h"
24 #include "test_iterators.h"
27 template <typename Iterator
>
28 std::pair
<Iterator
, Iterator
>
29 TEST_CONSTEXPR
operator() (Iterator b
, Iterator e
) const
31 return std::make_pair(b
, e
);
36 TEST_CONSTEXPR
bool test_constexpr() {
37 int ia
[] = {0, 1, 2, 3};
38 int ib
[] = {0, 1, 5, 3};
39 int ic
[] = {0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4};
40 return (std::search(std::begin(ic
), std::end(ic
), std::begin(ia
), std::end(ia
)) == ic
+3)
41 && (std::search(std::begin(ic
), std::end(ic
), std::begin(ib
), std::end(ib
)) == std::end(ic
))
42 && (std::search(std::begin(ic
), std::end(ic
), MySearcherC()) == std::begin(ic
))
47 int searcher_called
= 0;
50 template <typename Iterator
>
51 std::pair
<Iterator
, Iterator
>
52 operator() (Iterator b
, Iterator e
) const
55 return std::make_pair(b
, e
);
64 bool operator==(S lhs
, S rhs
)
66 return lhs
.x_
== rhs
.x_
;
68 template <class T
, class U
>
69 void make_pair(T
&&, U
&&) = delete;
72 template <class Iter1
, class Iter2
>
76 int ia
[] = {0, 1, 2, 3, 4, 5};
77 const unsigned sa
= sizeof(ia
)/sizeof(ia
[0]);
78 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
), Iter2(ia
)) == Iter1(ia
));
79 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
), Iter2(ia
+1)) == Iter1(ia
));
80 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
+1), Iter2(ia
+2)) == Iter1(ia
+1));
81 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
+2), Iter2(ia
+2)) == Iter1(ia
));
82 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
+2), Iter2(ia
+3)) == Iter1(ia
+2));
83 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
+2), Iter2(ia
+3)) == Iter1(ia
+2));
84 assert(std::search(Iter1(ia
), Iter1(ia
), Iter2(ia
+2), Iter2(ia
+3)) == Iter1(ia
));
85 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
+sa
-1), Iter2(ia
+sa
)) == Iter1(ia
+sa
-1));
86 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
+sa
-3), Iter2(ia
+sa
)) == Iter1(ia
+sa
-3));
87 assert(std::search(Iter1(ia
), Iter1(ia
+sa
), Iter2(ia
), Iter2(ia
+sa
)) == Iter1(ia
));
88 assert(std::search(Iter1(ia
), Iter1(ia
+sa
-1), Iter2(ia
), Iter2(ia
+sa
)) == Iter1(ia
+sa
-1));
89 assert(std::search(Iter1(ia
), Iter1(ia
+1), Iter2(ia
), Iter2(ia
+sa
)) == Iter1(ia
+1));
90 int ib
[] = {0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4};
91 const unsigned sb
= sizeof(ib
)/sizeof(ib
[0]);
93 assert(std::search(Iter1(ib
), Iter1(ib
+sb
), Iter2(ic
), Iter2(ic
+1)) == Iter1(ib
+1));
95 assert(std::search(Iter1(ib
), Iter1(ib
+sb
), Iter2(id
), Iter2(id
+2)) == Iter1(ib
+1));
97 assert(std::search(Iter1(ib
), Iter1(ib
+sb
), Iter2(ie
), Iter2(ie
+3)) == Iter1(ib
+4));
98 int ig
[] = {1, 2, 3, 4};
99 assert(std::search(Iter1(ib
), Iter1(ib
+sb
), Iter2(ig
), Iter2(ig
+4)) == Iter1(ib
+8));
100 int ih
[] = {0, 1, 1, 1, 1, 2, 3, 0, 1, 2, 3, 4};
101 const unsigned sh
= sizeof(ih
)/sizeof(ih
[0]);
102 int ii
[] = {1, 1, 2};
103 assert(std::search(Iter1(ih
), Iter1(ih
+sh
), Iter2(ii
), Iter2(ii
+3)) == Iter1(ih
+3));
104 int ij
[] = {0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
105 const unsigned sj
= sizeof(ij
)/sizeof(ij
[0]);
106 int ik
[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
107 const unsigned sk
= sizeof(ik
)/sizeof(ik
[0]);
108 assert(std::search(Iter1(ij
), Iter1(ij
+sj
), Iter2(ik
), Iter2(ik
+sk
)) == Iter1(ij
+6));
111 template <class Iter
>
116 assert(std::search(Iter(ua
), Iter(ua
), Iter(ua
), Iter(ua
)) == Iter(ua
));
119 int main(int, char**)
121 test
<forward_iterator
<const int*>, forward_iterator
<const int*> >();
122 test
<forward_iterator
<const int*>, bidirectional_iterator
<const int*> >();
123 test
<forward_iterator
<const int*>, random_access_iterator
<const int*> >();
124 test
<bidirectional_iterator
<const int*>, forward_iterator
<const int*> >();
125 test
<bidirectional_iterator
<const int*>, bidirectional_iterator
<const int*> >();
126 test
<bidirectional_iterator
<const int*>, random_access_iterator
<const int*> >();
127 test
<random_access_iterator
<const int*>, forward_iterator
<const int*> >();
128 test
<random_access_iterator
<const int*>, bidirectional_iterator
<const int*> >();
129 test
<random_access_iterator
<const int*>, random_access_iterator
<const int*> >();
131 adl_test
<forward_iterator
<User::S
*> >();
132 adl_test
<random_access_iterator
<User::S
*> >();
134 #if TEST_STD_VER > 14
137 static_assert((std::is_same
<RI
, decltype(std::search(RI(), RI(), MySearcher()))>::value
), "" );
140 assert(it
== std::search(it
, it
, MySearcher()));
141 assert(searcher_called
== 1);
145 #if TEST_STD_VER > 17
146 static_assert(test_constexpr());