xref: /llvm-project/libcxx/test/std/strings/string.view/string.view.find/rfind_pointer_size_size.pass.cpp (revision a40bada91aeda276a772acfbcae6e8de26755a11)
1 //===----------------------------------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14)
10 
11 // <string_view>
12 // constexpr size_type rfind(const charT* s, size_type pos, size_type n) const;
13 
14 #include <string_view>
15 #include <cassert>
16 
17 #include "test_macros.h"
18 #include "constexpr_char_traits.h"
19 
20 template <class S>
test(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type n,typename S::size_type x)21 void test(const S& s,
22           const typename S::value_type* str,
23           typename S::size_type pos,
24           typename S::size_type n,
25           typename S::size_type x) {
26   LIBCPP_ASSERT_NOEXCEPT(s.rfind(str, pos, n));
27   assert(s.rfind(str, pos, n) == x);
28   if (x != S::npos)
29     assert(x <= pos && x + n <= s.size());
30 }
31 
32 template <class S>
test0()33 void test0() {
34   test(S(""), "", 0, 0, 0);
35   test(S(""), "abcde", 0, 0, 0);
36   test(S(""), "abcde", 0, 1, S::npos);
37   test(S(""), "abcde", 0, 2, S::npos);
38   test(S(""), "abcde", 0, 4, S::npos);
39   test(S(""), "abcde", 0, 5, S::npos);
40   test(S(""), "abcdeabcde", 0, 0, 0);
41   test(S(""), "abcdeabcde", 0, 1, S::npos);
42   test(S(""), "abcdeabcde", 0, 5, S::npos);
43   test(S(""), "abcdeabcde", 0, 9, S::npos);
44   test(S(""), "abcdeabcde", 0, 10, S::npos);
45   test(S(""), "abcdeabcdeabcdeabcde", 0, 0, 0);
46   test(S(""), "abcdeabcdeabcdeabcde", 0, 1, S::npos);
47   test(S(""), "abcdeabcdeabcdeabcde", 0, 10, S::npos);
48   test(S(""), "abcdeabcdeabcdeabcde", 0, 19, S::npos);
49   test(S(""), "abcdeabcdeabcdeabcde", 0, 20, S::npos);
50   test(S(""), "", 1, 0, 0);
51   test(S(""), "abcde", 1, 0, 0);
52   test(S(""), "abcde", 1, 1, S::npos);
53   test(S(""), "abcde", 1, 2, S::npos);
54   test(S(""), "abcde", 1, 4, S::npos);
55   test(S(""), "abcde", 1, 5, S::npos);
56   test(S(""), "abcdeabcde", 1, 0, 0);
57   test(S(""), "abcdeabcde", 1, 1, S::npos);
58   test(S(""), "abcdeabcde", 1, 5, S::npos);
59   test(S(""), "abcdeabcde", 1, 9, S::npos);
60   test(S(""), "abcdeabcde", 1, 10, S::npos);
61   test(S(""), "abcdeabcdeabcdeabcde", 1, 0, 0);
62   test(S(""), "abcdeabcdeabcdeabcde", 1, 1, S::npos);
63   test(S(""), "abcdeabcdeabcdeabcde", 1, 10, S::npos);
64   test(S(""), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
65   test(S(""), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
66   test(S("abcde"), "", 0, 0, 0);
67   test(S("abcde"), "abcde", 0, 0, 0);
68   test(S("abcde"), "abcde", 0, 1, 0);
69   test(S("abcde"), "abcde", 0, 2, 0);
70   test(S("abcde"), "abcde", 0, 4, 0);
71   test(S("abcde"), "abcde", 0, 5, 0);
72   test(S("abcde"), "abcdeabcde", 0, 0, 0);
73   test(S("abcde"), "abcdeabcde", 0, 1, 0);
74   test(S("abcde"), "abcdeabcde", 0, 5, 0);
75   test(S("abcde"), "abcdeabcde", 0, 9, S::npos);
76   test(S("abcde"), "abcdeabcde", 0, 10, S::npos);
77   test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 0, 0);
78   test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 1, 0);
79   test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 10, S::npos);
80   test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos);
81   test(S("abcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos);
82   test(S("abcde"), "", 1, 0, 1);
83   test(S("abcde"), "abcde", 1, 0, 1);
84   test(S("abcde"), "abcde", 1, 1, 0);
85   test(S("abcde"), "abcde", 1, 2, 0);
86   test(S("abcde"), "abcde", 1, 4, 0);
87   test(S("abcde"), "abcde", 1, 5, 0);
88   test(S("abcde"), "abcdeabcde", 1, 0, 1);
89   test(S("abcde"), "abcdeabcde", 1, 1, 0);
90   test(S("abcde"), "abcdeabcde", 1, 5, 0);
91   test(S("abcde"), "abcdeabcde", 1, 9, S::npos);
92   test(S("abcde"), "abcdeabcde", 1, 10, S::npos);
93   test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 0, 1);
94   test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 1, 0);
95   test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 10, S::npos);
96   test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
97   test(S("abcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
98   test(S("abcde"), "", 2, 0, 2);
99   test(S("abcde"), "abcde", 2, 0, 2);
100   test(S("abcde"), "abcde", 2, 1, 0);
101   test(S("abcde"), "abcde", 2, 2, 0);
102   test(S("abcde"), "abcde", 2, 4, 0);
103   test(S("abcde"), "abcde", 2, 5, 0);
104   test(S("abcde"), "abcdeabcde", 2, 0, 2);
105   test(S("abcde"), "abcdeabcde", 2, 1, 0);
106   test(S("abcde"), "abcdeabcde", 2, 5, 0);
107   test(S("abcde"), "abcdeabcde", 2, 9, S::npos);
108   test(S("abcde"), "abcdeabcde", 2, 10, S::npos);
109   test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 0, 2);
110   test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 1, 0);
111   test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 10, S::npos);
112   test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 19, S::npos);
113   test(S("abcde"), "abcdeabcdeabcdeabcde", 2, 20, S::npos);
114   test(S("abcde"), "", 4, 0, 4);
115   test(S("abcde"), "abcde", 4, 0, 4);
116   test(S("abcde"), "abcde", 4, 1, 0);
117   test(S("abcde"), "abcde", 4, 2, 0);
118   test(S("abcde"), "abcde", 4, 4, 0);
119   test(S("abcde"), "abcde", 4, 5, 0);
120   test(S("abcde"), "abcdeabcde", 4, 0, 4);
121   test(S("abcde"), "abcdeabcde", 4, 1, 0);
122   test(S("abcde"), "abcdeabcde", 4, 5, 0);
123   test(S("abcde"), "abcdeabcde", 4, 9, S::npos);
124   test(S("abcde"), "abcdeabcde", 4, 10, S::npos);
125   test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 0, 4);
126   test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 1, 0);
127   test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 10, S::npos);
128   test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 19, S::npos);
129   test(S("abcde"), "abcdeabcdeabcdeabcde", 4, 20, S::npos);
130   test(S("abcde"), "", 5, 0, 5);
131   test(S("abcde"), "abcde", 5, 0, 5);
132   test(S("abcde"), "abcde", 5, 1, 0);
133   test(S("abcde"), "abcde", 5, 2, 0);
134 }
135 
136 template <class S>
test1()137 void test1() {
138   test(S("abcde"), "abcde", 5, 4, 0);
139   test(S("abcde"), "abcde", 5, 5, 0);
140   test(S("abcde"), "abcdeabcde", 5, 0, 5);
141   test(S("abcde"), "abcdeabcde", 5, 1, 0);
142   test(S("abcde"), "abcdeabcde", 5, 5, 0);
143   test(S("abcde"), "abcdeabcde", 5, 9, S::npos);
144   test(S("abcde"), "abcdeabcde", 5, 10, S::npos);
145   test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 0, 5);
146   test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 1, 0);
147   test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 10, S::npos);
148   test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos);
149   test(S("abcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos);
150   test(S("abcde"), "", 6, 0, 5);
151   test(S("abcde"), "abcde", 6, 0, 5);
152   test(S("abcde"), "abcde", 6, 1, 0);
153   test(S("abcde"), "abcde", 6, 2, 0);
154   test(S("abcde"), "abcde", 6, 4, 0);
155   test(S("abcde"), "abcde", 6, 5, 0);
156   test(S("abcde"), "abcdeabcde", 6, 0, 5);
157   test(S("abcde"), "abcdeabcde", 6, 1, 0);
158   test(S("abcde"), "abcdeabcde", 6, 5, 0);
159   test(S("abcde"), "abcdeabcde", 6, 9, S::npos);
160   test(S("abcde"), "abcdeabcde", 6, 10, S::npos);
161   test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 0, 5);
162   test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 1, 0);
163   test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 10, S::npos);
164   test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 19, S::npos);
165   test(S("abcde"), "abcdeabcdeabcdeabcde", 6, 20, S::npos);
166   test(S("abcdeabcde"), "", 0, 0, 0);
167   test(S("abcdeabcde"), "abcde", 0, 0, 0);
168   test(S("abcdeabcde"), "abcde", 0, 1, 0);
169   test(S("abcdeabcde"), "abcde", 0, 2, 0);
170   test(S("abcdeabcde"), "abcde", 0, 4, 0);
171   test(S("abcdeabcde"), "abcde", 0, 5, 0);
172   test(S("abcdeabcde"), "abcdeabcde", 0, 0, 0);
173   test(S("abcdeabcde"), "abcdeabcde", 0, 1, 0);
174   test(S("abcdeabcde"), "abcdeabcde", 0, 5, 0);
175   test(S("abcdeabcde"), "abcdeabcde", 0, 9, 0);
176   test(S("abcdeabcde"), "abcdeabcde", 0, 10, 0);
177   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0);
178   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0);
179   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0);
180   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, S::npos);
181   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, S::npos);
182   test(S("abcdeabcde"), "", 1, 0, 1);
183   test(S("abcdeabcde"), "abcde", 1, 0, 1);
184   test(S("abcdeabcde"), "abcde", 1, 1, 0);
185   test(S("abcdeabcde"), "abcde", 1, 2, 0);
186   test(S("abcdeabcde"), "abcde", 1, 4, 0);
187   test(S("abcdeabcde"), "abcde", 1, 5, 0);
188   test(S("abcdeabcde"), "abcdeabcde", 1, 0, 1);
189   test(S("abcdeabcde"), "abcdeabcde", 1, 1, 0);
190   test(S("abcdeabcde"), "abcdeabcde", 1, 5, 0);
191   test(S("abcdeabcde"), "abcdeabcde", 1, 9, 0);
192   test(S("abcdeabcde"), "abcdeabcde", 1, 10, 0);
193   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1);
194   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 0);
195   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, 0);
196   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, S::npos);
197   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, S::npos);
198   test(S("abcdeabcde"), "", 5, 0, 5);
199   test(S("abcdeabcde"), "abcde", 5, 0, 5);
200   test(S("abcdeabcde"), "abcde", 5, 1, 5);
201   test(S("abcdeabcde"), "abcde", 5, 2, 5);
202   test(S("abcdeabcde"), "abcde", 5, 4, 5);
203   test(S("abcdeabcde"), "abcde", 5, 5, 5);
204   test(S("abcdeabcde"), "abcdeabcde", 5, 0, 5);
205   test(S("abcdeabcde"), "abcdeabcde", 5, 1, 5);
206   test(S("abcdeabcde"), "abcdeabcde", 5, 5, 5);
207   test(S("abcdeabcde"), "abcdeabcde", 5, 9, 0);
208   test(S("abcdeabcde"), "abcdeabcde", 5, 10, 0);
209   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 0, 5);
210   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 1, 5);
211   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 10, 0);
212   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 19, S::npos);
213   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, 20, S::npos);
214   test(S("abcdeabcde"), "", 9, 0, 9);
215   test(S("abcdeabcde"), "abcde", 9, 0, 9);
216   test(S("abcdeabcde"), "abcde", 9, 1, 5);
217   test(S("abcdeabcde"), "abcde", 9, 2, 5);
218   test(S("abcdeabcde"), "abcde", 9, 4, 5);
219   test(S("abcdeabcde"), "abcde", 9, 5, 5);
220   test(S("abcdeabcde"), "abcdeabcde", 9, 0, 9);
221   test(S("abcdeabcde"), "abcdeabcde", 9, 1, 5);
222   test(S("abcdeabcde"), "abcdeabcde", 9, 5, 5);
223   test(S("abcdeabcde"), "abcdeabcde", 9, 9, 0);
224   test(S("abcdeabcde"), "abcdeabcde", 9, 10, 0);
225   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 0, 9);
226   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 1, 5);
227   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 10, 0);
228   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 19, S::npos);
229   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, 20, S::npos);
230   test(S("abcdeabcde"), "", 10, 0, 10);
231   test(S("abcdeabcde"), "abcde", 10, 0, 10);
232   test(S("abcdeabcde"), "abcde", 10, 1, 5);
233   test(S("abcdeabcde"), "abcde", 10, 2, 5);
234   test(S("abcdeabcde"), "abcde", 10, 4, 5);
235   test(S("abcdeabcde"), "abcde", 10, 5, 5);
236   test(S("abcdeabcde"), "abcdeabcde", 10, 0, 10);
237   test(S("abcdeabcde"), "abcdeabcde", 10, 1, 5);
238 }
239 
240 template <class S>
test2()241 void test2() {
242   test(S("abcdeabcde"), "abcdeabcde", 10, 5, 5);
243   test(S("abcdeabcde"), "abcdeabcde", 10, 9, 0);
244   test(S("abcdeabcde"), "abcdeabcde", 10, 10, 0);
245   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10);
246   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, 5);
247   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, 0);
248   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, S::npos);
249   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, S::npos);
250   test(S("abcdeabcde"), "", 11, 0, 10);
251   test(S("abcdeabcde"), "abcde", 11, 0, 10);
252   test(S("abcdeabcde"), "abcde", 11, 1, 5);
253   test(S("abcdeabcde"), "abcde", 11, 2, 5);
254   test(S("abcdeabcde"), "abcde", 11, 4, 5);
255   test(S("abcdeabcde"), "abcde", 11, 5, 5);
256   test(S("abcdeabcde"), "abcdeabcde", 11, 0, 10);
257   test(S("abcdeabcde"), "abcdeabcde", 11, 1, 5);
258   test(S("abcdeabcde"), "abcdeabcde", 11, 5, 5);
259   test(S("abcdeabcde"), "abcdeabcde", 11, 9, 0);
260   test(S("abcdeabcde"), "abcdeabcde", 11, 10, 0);
261   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 0, 10);
262   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 1, 5);
263   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 10, 0);
264   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 19, S::npos);
265   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, 20, S::npos);
266   test(S("abcdeabcdeabcdeabcde"), "", 0, 0, 0);
267   test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 0, 0);
268   test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 1, 0);
269   test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 2, 0);
270   test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 4, 0);
271   test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 5, 0);
272   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 0, 0);
273   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 1, 0);
274   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 5, 0);
275   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 9, 0);
276   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 10, 0);
277   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0, 0);
278   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 1, 0);
279   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 10, 0);
280   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 19, 0);
281   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 20, 0);
282   test(S("abcdeabcdeabcdeabcde"), "", 1, 0, 1);
283   test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 0, 1);
284   test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 1, 0);
285   test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 2, 0);
286   test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 4, 0);
287   test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 5, 0);
288   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 0, 1);
289   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 1, 0);
290   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 5, 0);
291   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 9, 0);
292   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 10, 0);
293   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 0, 1);
294   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 1, 0);
295   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 10, 0);
296   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 19, 0);
297   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, 20, 0);
298   test(S("abcdeabcdeabcdeabcde"), "", 10, 0, 10);
299   test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 0, 10);
300   test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 1, 10);
301   test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 2, 10);
302   test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 4, 10);
303   test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 5, 10);
304   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 0, 10);
305   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 1, 10);
306   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 5, 10);
307   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 9, 10);
308   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 10, 10);
309   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 0, 10);
310   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 1, 10);
311   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 10, 10);
312   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 19, 0);
313   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, 20, 0);
314   test(S("abcdeabcdeabcdeabcde"), "", 19, 0, 19);
315   test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 0, 19);
316   test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 1, 15);
317   test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 2, 15);
318   test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 4, 15);
319   test(S("abcdeabcdeabcdeabcde"), "abcde", 19, 5, 15);
320   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 0, 19);
321   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 1, 15);
322   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 5, 15);
323   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 9, 10);
324   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, 10, 10);
325   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 0, 19);
326   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 1, 15);
327   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 10, 10);
328   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 19, 0);
329   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, 20, 0);
330   test(S("abcdeabcdeabcdeabcde"), "", 20, 0, 20);
331   test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 0, 20);
332   test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 1, 15);
333   test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 2, 15);
334   test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 4, 15);
335   test(S("abcdeabcdeabcdeabcde"), "abcde", 20, 5, 15);
336   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 0, 20);
337   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 1, 15);
338   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 5, 15);
339   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 9, 10);
340   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, 10, 10);
341   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 0, 20);
342 }
343 
344 template <class S>
test3()345 void test3() {
346   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 1, 15);
347   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 10, 10);
348   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 19, 0);
349   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, 20, 0);
350   test(S("abcdeabcdeabcdeabcde"), "", 21, 0, 20);
351   test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 0, 20);
352   test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 1, 15);
353   test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 2, 15);
354   test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 4, 15);
355   test(S("abcdeabcdeabcdeabcde"), "abcde", 21, 5, 15);
356   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 0, 20);
357   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 1, 15);
358   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 5, 15);
359   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 9, 10);
360   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, 10, 10);
361   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 0, 20);
362   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 1, 15);
363   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 10, 10);
364   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 19, 0);
365   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, 20, 0);
366 }
367 
main(int,char **)368 int main(int, char**) {
369   {
370     typedef std::string_view S;
371     test0<S>();
372     test1<S>();
373     test2<S>();
374     test3<S>();
375   }
376 
377 #if TEST_STD_VER > 11
378   {
379     typedef std::basic_string_view<char, constexpr_char_traits<char>> SV;
380     constexpr SV sv1;
381     constexpr SV sv2{"abcde", 5};
382 
383     static_assert(sv1.rfind("", 0, 0) == 0, "");
384     static_assert(sv1.rfind("abcde", 0, 0) == 0, "");
385     static_assert(sv1.rfind("abcde", 0, 1) == SV::npos, "");
386     static_assert(sv2.rfind("", 0, 0) == 0, "");
387     static_assert(sv2.rfind("abcde", 0, 0) == 0, "");
388     static_assert(sv2.rfind("abcde", 0, 1) == 0, "");
389   }
390 #endif
391 
392   return 0;
393 }
394