xref: /aosp_15_r20/external/pytorch/c10/test/util/string_view_test.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1 #include <c10/util/string_view.h>
2 
3 #include <gmock/gmock.h>
4 
5 // NOLINTBEGIN(modernize*, readability*, bugprone-string-constructor)
6 using c10::string_view;
7 
8 namespace {
9 namespace testutils {
string_equal(const char * lhs,const char * rhs,size_t size)10 constexpr bool string_equal(const char* lhs, const char* rhs, size_t size) {
11   return (size == 0)   ? true
12       : (*lhs != *rhs) ? false
13                        : string_equal(lhs + 1, rhs + 1, size - 1);
14 }
15 static_assert(string_equal("hi", "hi", 2), "");
16 static_assert(string_equal("", "", 0), "");
17 static_assert(string_equal("hi", "hi2", 2), "");
18 static_assert(string_equal("hi2", "hi", 2), "");
19 static_assert(!string_equal("hi", "hi2", 3), "");
20 static_assert(!string_equal("hi2", "hi", 3), "");
21 static_assert(!string_equal("hi", "ha", 2), "");
22 
23 template <class Exception, class Functor>
expectThrows(Functor && functor,const char * expectMessageContains)24 inline void expectThrows(Functor&& functor, const char* expectMessageContains) {
25   try {
26     std::forward<Functor>(functor)();
27   } catch (const Exception& e) {
28     EXPECT_THAT(e.what(), testing::HasSubstr(expectMessageContains));
29     return;
30   }
31   ADD_FAILURE() << "Expected to throw exception containing \""
32                 << expectMessageContains << "\" but didn't throw";
33 }
34 } // namespace testutils
35 
36 using testutils::expectThrows;
37 using testutils::string_equal;
38 
39 namespace test_typedefs {
40 static_assert(std::is_same<char, string_view::value_type>::value, "");
41 static_assert(std::is_same<char*, string_view::pointer>::value, "");
42 static_assert(std::is_same<const char*, string_view::const_pointer>::value, "");
43 static_assert(std::is_same<char&, string_view::reference>::value, "");
44 static_assert(
45     std::is_same<const char&, string_view::const_reference>::value,
46     "");
47 static_assert(std::is_same<std::size_t, string_view::size_type>::value, "");
48 static_assert(
49     std::is_same<std::ptrdiff_t, string_view::difference_type>::value,
50     "");
51 } // namespace test_typedefs
52 
53 namespace test_default_constructor {
54 static_assert(string_view().empty());
55 static_assert(string_view().data() == nullptr, "");
56 static_assert(string_view() == string_view(""));
57 } // namespace test_default_constructor
58 
59 namespace test_constchar_constructor {
60 static_assert(string_view("").size() == 0, "");
61 constexpr string_view hello = "hello";
62 static_assert(5 == hello.size(), "");
63 static_assert(string_equal("hello", hello.data(), hello.size()), "");
64 } // namespace test_constchar_constructor
65 
66 namespace test_sized_constructor {
67 static_assert(string_view("", 0).size() == 0, "");
68 constexpr string_view hell("hello", 4);
69 static_assert(4 == hell.size(), "");
70 static_assert(string_equal("hell", hell.data(), hell.size()), "");
71 } // namespace test_sized_constructor
72 
73 namespace test_string_constructor {
test_conversion_is_implicit(string_view a)74 void test_conversion_is_implicit(string_view a) {}
TEST(StringViewTest,testStringConstructor)75 TEST(StringViewTest, testStringConstructor) {
76   std::string empty;
77   EXPECT_EQ(0, string_view(empty).size());
78   std::string hello_str = "hello";
79   string_view hello_sv = hello_str;
80   EXPECT_EQ(5, hello_sv.size());
81   EXPECT_TRUE(string_equal("hello", hello_sv.data(), hello_sv.size()));
82 
83   test_conversion_is_implicit(hello_str);
84 }
85 } // namespace test_string_constructor
86 
87 namespace test_conversion_to_string {
TEST(StringViewTest,testConversionToString)88 TEST(StringViewTest, testConversionToString) {
89   string_view empty;
90   EXPECT_EQ(0, std::string(empty).size());
91   string_view hello_sv = "hello";
92   std::string hello_str(hello_sv);
93   EXPECT_EQ(5, hello_str.size());
94   EXPECT_EQ(std::string("hello"), hello_str);
95 }
96 } // namespace test_conversion_to_string
97 
98 namespace test_copy_constructor {
99 constexpr string_view hello = "hello";
100 constexpr string_view copy = hello;
101 static_assert(5 == copy.size(), "");
102 static_assert(string_equal("hello", copy.data(), copy.size()), "");
103 } // namespace test_copy_constructor
104 
105 namespace test_copy_assignment {
assign(string_view value)106 constexpr string_view assign(string_view value) {
107   string_view result = "temporary_content";
108   result = value; // this is the assignment we're testing
109   return result;
110 }
TEST(StringViewTest,testCopyAssignment)111 TEST(StringViewTest, testCopyAssignment) {
112 #if defined(__cpp_constexpr) && __cpp_constexpr >= 201304
113   {
114     constexpr string_view hello = assign("hello");
115     static_assert(5 == hello.size(), "");
116     static_assert(string_equal("hello", hello.data(), hello.size()), "");
117 
118     static_assert(5 == (string_view() = "hello").size(), "");
119     static_assert(
120         string_equal("hello", (string_view() = "hello").data(), 5), "");
121   }
122 #endif
123   const string_view hello = assign("hello");
124   EXPECT_EQ(5, hello.size());
125   EXPECT_EQ("hello", hello);
126   EXPECT_EQ(5, (string_view() = "hello").size());
127   EXPECT_EQ("hello", (string_view() = "hello"));
128 }
129 
130 } // namespace test_copy_assignment
131 
132 namespace test_iterators {
133 static_assert('h' == *string_view("hello").begin(), "");
134 static_assert('h' == *string_view("hello").cbegin(), "");
135 static_assert('h' == *begin(string_view("hello")), "");
136 static_assert('o' == *(string_view("hello").end() - 1), "");
137 static_assert('o' == *(string_view("hello").cend() - 1), "");
138 static_assert('o' == *(end(string_view("hello")) - 1), "");
139 static_assert('o' == *string_view("hello").rbegin(), "");
140 static_assert('o' == *string_view("hello").crbegin(), "");
141 static_assert('h' == *(string_view("hello").rend() - 1), "");
142 static_assert('h' == *(string_view("hello").crend() - 1), "");
143 } // namespace test_iterators
144 
145 namespace test_forward_iteration {
146 constexpr string_view hello = "hello";
147 static_assert('h' == *(hello.begin() + 0), "");
148 static_assert('e' == *(hello.begin() + 1), "");
149 static_assert('l' == *(hello.begin() + 2), "");
150 static_assert('l' == *(hello.begin() + 3), "");
151 static_assert('o' == *(hello.begin() + 4), "");
152 static_assert(hello.end() == hello.begin() + 5, "");
153 } // namespace test_forward_iteration
154 
155 namespace test_reverse_iteration {
156 constexpr string_view hello = "hello";
157 static_assert('o' == *(hello.rbegin() + 0), "");
158 static_assert('l' == *(hello.rbegin() + 1), "");
159 static_assert('l' == *(hello.rbegin() + 2), "");
160 static_assert('e' == *(hello.rbegin() + 3), "");
161 static_assert('h' == *(hello.rbegin() + 4), "");
162 static_assert(hello.rend() == hello.rbegin() + 5, "");
163 } // namespace test_reverse_iteration
164 
165 namespace test_random_access {
166 constexpr string_view hello = "hello";
167 static_assert('h' == hello[0], "");
168 static_assert('e' == hello[1], "");
169 static_assert('l' == hello[2], "");
170 static_assert('l' == hello[3], "");
171 static_assert('o' == hello[4], "");
172 
173 static_assert('h' == hello.at(0), "");
174 static_assert('e' == hello.at(1), "");
175 static_assert('l' == hello.at(2), "");
176 static_assert('l' == hello.at(3), "");
177 static_assert('o' == hello.at(4), "");
178 
TEST(StringViewTest,whenCallingAccessOperatorOutOfRange_thenThrows)179 TEST(StringViewTest, whenCallingAccessOperatorOutOfRange_thenThrows) {
180   expectThrows<std::out_of_range>(
181       [] { string_view("").at(1); },
182       "string_view::operator[] or string_view::at() out of range. Index: 1, size: 0");
183 
184   expectThrows<std::out_of_range>(
185       [] { string_view("hello").at(5); },
186       "string_view::operator[] or string_view::at() out of range. Index: 5, size: 5");
187 
188   expectThrows<std::out_of_range>(
189       [] { string_view("hello").at(100); },
190       "string_view::operator[] or string_view::at() out of range. Index: 100, size: 5");
191 
192   expectThrows<std::out_of_range>(
193       [] { string_view("hello").at(string_view::npos); },
194       "string_view::operator[] or string_view::at() out of range. Index: 18446744073709551615, size: 5");
195 }
196 } // namespace test_random_access
197 
198 namespace test_front_back {
199 static_assert('h' == string_view("hello").front(), "");
200 static_assert('o' == string_view("hello").back(), "");
201 } // namespace test_front_back
202 
203 namespace test_data {
204 static_assert(string_equal("hello", string_view("hello").data(), 5), "");
205 } // namespace test_data
206 
207 namespace test_size_length {
208 static_assert(0 == string_view("").size(), "");
209 static_assert(5 == string_view("hello").size(), "");
210 
211 static_assert(0 == string_view("").length(), "");
212 static_assert(5 == string_view("hello").length(), "");
213 } // namespace test_size_length
214 
215 namespace test_empty {
216 static_assert(string_view().empty(), "");
217 static_assert(string_view("").empty(), "");
218 static_assert(!string_view("hello").empty(), "");
219 } // namespace test_empty
220 
221 namespace test_remove_prefix {
remove_prefix(string_view input,size_t len)222 constexpr string_view remove_prefix(string_view input, size_t len) {
223   input.remove_prefix(len);
224   return input;
225 }
226 
TEST(StringViewTest,whenRemovingValidPrefix_thenWorks)227 TEST(StringViewTest, whenRemovingValidPrefix_thenWorks) {
228   static_assert(
229       remove_prefix(string_view("hello"), 0) == string_view("hello"), "");
230   static_assert(
231       remove_prefix(string_view("hello"), 1) == string_view("ello"), "");
232   static_assert(remove_prefix(string_view("hello"), 5) == string_view(""), "");
233 
234   EXPECT_EQ(remove_prefix(string_view("hello"), 0), string_view("hello"));
235   EXPECT_EQ(remove_prefix(string_view("hello"), 1), string_view("ello"));
236   EXPECT_EQ(remove_prefix(string_view("hello"), 5), string_view(""));
237 }
238 
TEST(StringViewTest,whenRemovingTooLargePrefix_thenThrows)239 TEST(StringViewTest, whenRemovingTooLargePrefix_thenThrows) {
240   expectThrows<std::out_of_range>(
241       [] { remove_prefix(string_view("hello"), 6); },
242       "basic_string_view::remove_prefix: out of range. PrefixLength: 6, size: 5");
243 }
244 } // namespace test_remove_prefix
245 
246 namespace test_remove_suffix {
remove_suffix(string_view input,size_t len)247 constexpr string_view remove_suffix(string_view input, size_t len) {
248   input.remove_suffix(len);
249   return input;
250 }
251 
TEST(StringViewTest,whenRemovingValidSuffix_thenWorks)252 TEST(StringViewTest, whenRemovingValidSuffix_thenWorks) {
253   static_assert(
254       remove_suffix(string_view("hello"), 0) == string_view("hello"), "");
255   static_assert(
256       remove_suffix(string_view("hello"), 1) == string_view("hell"), "");
257   static_assert(remove_suffix(string_view("hello"), 5) == string_view(""), "");
258 
259   EXPECT_EQ(remove_suffix(string_view("hello"), 0), string_view("hello"));
260   EXPECT_EQ(remove_suffix(string_view("hello"), 1), string_view("hell"));
261   EXPECT_EQ(remove_suffix(string_view("hello"), 5), string_view(""));
262 }
263 
TEST(StringViewTest,whenRemovingTooLargeSuffix_thenThrows)264 TEST(StringViewTest, whenRemovingTooLargeSuffix_thenThrows) {
265   expectThrows<std::out_of_range>(
266       [] { remove_suffix(string_view("hello"), 6); },
267       "basic_string_view::remove_suffix: out of range. SuffixLength: 6, size: 5");
268 }
269 } // namespace test_remove_suffix
270 
271 namespace test_swap_function {
get()272 constexpr std::pair<string_view, string_view> get() {
273   string_view first = "first";
274   string_view second = "second";
275   swap(first, second);
276   return std::make_pair(first, second);
277 }
TEST(StringViewTest,testSwapFunction)278 TEST(StringViewTest, testSwapFunction) {
279   static_assert(string_view("second") == get().first, "");
280   static_assert(string_view("first") == get().second, "");
281 
282   EXPECT_EQ(string_view("second"), get().first);
283   EXPECT_EQ(string_view("first"), get().second);
284 }
285 } // namespace test_swap_function
286 
287 namespace test_swap_method {
get()288 constexpr std::pair<string_view, string_view> get() {
289   string_view first = "first";
290   string_view second = "second";
291   first.swap(second);
292   return std::make_pair(first, second);
293 }
TEST(StringViewTest,testSwapMethod)294 TEST(StringViewTest, testSwapMethod) {
295   static_assert(string_view("second") == get().first, "");
296   static_assert(string_view("first") == get().second, "");
297 
298   EXPECT_EQ(string_view("second"), get().first);
299   EXPECT_EQ(string_view("first"), get().second);
300 }
301 } // namespace test_swap_method
302 
303 namespace test_copy {
TEST(StringViewTest,whenCopyingFullStringView_thenDestinationHasCorrectData)304 TEST(StringViewTest, whenCopyingFullStringView_thenDestinationHasCorrectData) {
305   string_view data = "hello";
306   // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,cppcoreguidelines-avoid-magic-numbers,modernize-avoid-c-arrays)
307   char result[5];
308   size_t num_copied = data.copy(result, 5);
309   EXPECT_EQ(5, num_copied);
310   EXPECT_TRUE(string_equal("hello", result, 5));
311 }
312 
TEST(StringViewTest,whenCopyingSubstr_thenDestinationHasCorrectData)313 TEST(StringViewTest, whenCopyingSubstr_thenDestinationHasCorrectData) {
314   string_view data = "hello";
315   // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
316   char result[2];
317   size_t num_copied = data.copy(result, 2, 2);
318   EXPECT_EQ(2, num_copied);
319   EXPECT_TRUE(string_equal("ll", result, 2));
320 }
321 
TEST(StringViewTest,whenCopyingTooMuch_thenJustCopiesLess)322 TEST(StringViewTest, whenCopyingTooMuch_thenJustCopiesLess) {
323   string_view data = "hello";
324   // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,cppcoreguidelines-avoid-magic-numbers,modernize-avoid-c-arrays)
325   char result[100];
326   size_t num_copied = data.copy(result, 100, 2);
327   EXPECT_EQ(3, num_copied);
328   EXPECT_TRUE(string_equal("llo", result, 3));
329 }
330 
TEST(StringViewTest,whenCopyingJustAtRange_thenDoesntCrash)331 TEST(StringViewTest, whenCopyingJustAtRange_thenDoesntCrash) {
332   string_view data = "hello";
333   // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
334   char result[1];
335   size_t num_copied = data.copy(result, 2, 5);
336   EXPECT_EQ(0, num_copied);
337 }
338 
TEST(StringViewTest,whenCopyingOutOfRange_thenThrows)339 TEST(StringViewTest, whenCopyingOutOfRange_thenThrows) {
340   string_view data = "hello";
341   // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
342   char result[2];
343   expectThrows<std::out_of_range>(
344       // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,cppcoreguidelines-avoid-magic-numbers,modernize-avoid-c-arrays)
345       [&] { data.copy(result, 2, 6); },
346       "basic_string_view::copy: out of range. Index: 6, size: 5");
347 }
348 } // namespace test_copy
349 
350 namespace test_substr {
351 static_assert(string_view("").substr() == string_view(""), "");
352 static_assert(string_view("").substr(0) == string_view(""), "");
353 static_assert(string_view("").substr(0, 0) == string_view(""), "");
354 
355 static_assert(string_view("hello").substr() == string_view("hello"), "");
356 static_assert(string_view("hello").substr(0) == string_view("hello"), "");
357 static_assert(string_view("hello").substr(1) == string_view("ello"), "");
358 static_assert(string_view("hello").substr(5) == string_view(""), "");
359 
360 static_assert(string_view("hello").substr(0, 0) == string_view(""), "");
361 static_assert(string_view("hello").substr(0, 2) == string_view("he"), "");
362 static_assert(string_view("hello").substr(1, 2) == string_view("el"), "");
363 static_assert(string_view("hello").substr(4, 1) == string_view("o"), "");
364 
365 static_assert(string_view("hello").substr(0, 100) == string_view("hello"), "");
366 static_assert(string_view("hello").substr(1, 100) == string_view("ello"), "");
367 static_assert(string_view("hello").substr(5, 100) == string_view(""), "");
368 
TEST(StringViewTest,whenCallingSubstrWithPosOutOfRange_thenThrows)369 TEST(StringViewTest, whenCallingSubstrWithPosOutOfRange_thenThrows) {
370   expectThrows<std::out_of_range>(
371       [] { string_view("hello").substr(6); },
372       "basic_string_view::substr parameter out of bounds. Index: 6, size: 5");
373 
374   expectThrows<std::out_of_range>(
375       [] { string_view("hello").substr(6, 0); },
376       "basic_string_view::substr parameter out of bounds. Index: 6, size: 5");
377 }
378 } // namespace test_substr
379 
380 namespace test_compare_overload1 {
381 static_assert(0 == string_view("").compare(string_view("")), "");
382 static_assert(0 == string_view("a").compare(string_view("a")), "");
383 static_assert(0 == string_view("hello").compare(string_view("hello")), "");
384 static_assert(0 < string_view("hello").compare(string_view("")), "");
385 static_assert(0 < string_view("hello").compare(string_view("aello")), "");
386 static_assert(0 < string_view("hello").compare(string_view("a")), "");
387 static_assert(
388     0 < string_view("hello").compare(string_view("abcdefghijklmno")),
389     "");
390 static_assert(0 < string_view("hello").compare(string_view("hela")), "");
391 static_assert(0 < string_view("hello").compare(string_view("helao")), "");
392 static_assert(
393     0 < string_view("hello").compare(string_view("helaobcdefgh")),
394     "");
395 static_assert(0 < string_view("hello").compare(string_view("hell")), "");
396 static_assert(0 > string_view("").compare(string_view("hello")), "");
397 static_assert(0 > string_view("hello").compare(string_view("zello")), "");
398 static_assert(0 > string_view("hello").compare(string_view("z")), "");
399 static_assert(
400     0 > string_view("hello").compare(string_view("zabcdefghijklmno")),
401     "");
402 static_assert(0 > string_view("hello").compare(string_view("helz")), "");
403 static_assert(0 > string_view("hello").compare(string_view("helzo")), "");
404 static_assert(
405     0 > string_view("hello").compare(string_view("helzobcdefgh")),
406     "");
407 static_assert(0 > string_view("hello").compare(string_view("helloa")), "");
408 } // namespace test_compare_overload1
409 
410 namespace test_compare_overload2 {
411 static_assert(0 == string_view("").compare(0, 0, string_view("")), "");
412 static_assert(0 == string_view("hello").compare(2, 2, string_view("ll")), "");
413 static_assert(0 < string_view("hello").compare(2, 2, string_view("l")), "");
414 static_assert(0 > string_view("hello").compare(2, 2, string_view("lll")), "");
415 static_assert(0 < string_view("hello").compare(2, 2, string_view("la")), "");
416 static_assert(0 > string_view("hello").compare(2, 2, string_view("lz")), "");
417 } // namespace test_compare_overload2
418 
419 namespace test_compare_overload3 {
420 static_assert(0 == string_view("").compare(0, 0, string_view(""), 0, 0), "");
421 static_assert(
422     0 == string_view("hello").compare(2, 2, string_view("hello"), 2, 2),
423     "");
424 static_assert(
425     0 < string_view("hello").compare(2, 2, string_view("hello"), 2, 1),
426     "");
427 static_assert(
428     0 > string_view("hello").compare(2, 2, string_view("hello"), 2, 3),
429     "");
430 static_assert(
431     0 < string_view("hello").compare(2, 2, string_view("hellola"), 5, 2),
432     "");
433 static_assert(
434     0 > string_view("hello").compare(2, 2, string_view("hellolz"), 5, 2),
435     "");
436 } // namespace test_compare_overload3
437 
438 namespace test_compare_overload4 {
439 static_assert(0 == string_view("").compare(""), "");
440 static_assert(0 == string_view("a").compare("a"), "");
441 static_assert(0 == string_view("hello").compare("hello"), "");
442 static_assert(0 < string_view("hello").compare(""), "");
443 static_assert(0 < string_view("hello").compare("aello"), "");
444 static_assert(0 < string_view("hello").compare("a"), "");
445 static_assert(0 < string_view("hello").compare("abcdefghijklmno"), "");
446 static_assert(0 < string_view("hello").compare("hela"), "");
447 static_assert(0 < string_view("hello").compare("helao"), "");
448 static_assert(0 < string_view("hello").compare("helaobcdefgh"), "");
449 static_assert(0 < string_view("hello").compare("hell"), "");
450 static_assert(0 > string_view("").compare("hello"), "");
451 static_assert(0 > string_view("hello").compare("zello"), "");
452 static_assert(0 > string_view("hello").compare("z"), "");
453 static_assert(0 > string_view("hello").compare("zabcdefghijklmno"), "");
454 static_assert(0 > string_view("hello").compare("helz"), "");
455 static_assert(0 > string_view("hello").compare("helzo"), "");
456 static_assert(0 > string_view("hello").compare("helzobcdefgh"), "");
457 static_assert(0 > string_view("hello").compare("helloa"), "");
458 } // namespace test_compare_overload4
459 
460 namespace test_compare_overload5 {
461 static_assert(0 == string_view("").compare(0, 0, ""), "");
462 static_assert(0 == string_view("hello").compare(2, 2, "ll"), "");
463 static_assert(0 < string_view("hello").compare(2, 2, "l"), "");
464 static_assert(0 > string_view("hello").compare(2, 2, "lll"), "");
465 static_assert(0 < string_view("hello").compare(2, 2, "la"), "");
466 static_assert(0 > string_view("hello").compare(2, 2, "lz"), "");
467 } // namespace test_compare_overload5
468 
469 namespace test_compare_overload6 {
470 static_assert(0 == string_view("").compare(0, 0, "", 0, 0), "");
471 static_assert(0 == string_view("hello").compare(2, 2, "hello", 2, 2), "");
472 static_assert(0 < string_view("hello").compare(2, 2, "hello", 2, 1), "");
473 static_assert(0 > string_view("hello").compare(2, 2, "hello", 2, 3), "");
474 static_assert(0 < string_view("hello").compare(2, 2, "hellola", 5, 2), "");
475 static_assert(0 > string_view("hello").compare(2, 2, "hellolz", 5, 2), "");
476 } // namespace test_compare_overload6
477 
478 namespace test_equality_comparison {
479 static_assert(string_view("hi") == string_view("hi"), "");
480 static_assert(!(string_view("hi") != string_view("hi")), "");
481 
482 static_assert(string_view("") == string_view(""), "");
483 static_assert(!(string_view("") != string_view("")), "");
484 
485 static_assert(string_view("hi") != string_view("hi2"), "");
486 static_assert(!(string_view("hi") == string_view("hi2")), "");
487 
488 static_assert(string_view("hi2") != string_view("hi"), "");
489 static_assert(!(string_view("hi2") == string_view("hi")), "");
490 
491 static_assert(string_view("hi") != string_view("ha"), "");
492 static_assert(!(string_view("hi") == string_view("ha")), "");
493 
494 static_assert(string_view("ha") != string_view("hi"), "");
495 static_assert(!(string_view("ha") == string_view("hi")), "");
496 } // namespace test_equality_comparison
497 
498 namespace test_less_than {
499 static_assert(!(string_view("") < string_view("")), "");
500 static_assert(!(string_view("a") < string_view("a")), "");
501 static_assert(!(string_view("hello") < string_view("hello")), "");
502 static_assert(!(string_view("hello") < string_view("")), "");
503 static_assert(!(string_view("hello") < string_view("aello")), "");
504 static_assert(!(string_view("hello") < string_view("a")), "");
505 static_assert(!(string_view("hello") < string_view("abcdefghijklmno")), "");
506 static_assert(!(string_view("hello") < string_view("hela")), "");
507 static_assert(!(string_view("hello") < string_view("helao")), "");
508 static_assert(!(string_view("hello") < string_view("helaobcdefgh")), "");
509 static_assert(!(string_view("hello") < string_view("hell")), "");
510 static_assert(string_view("") < string_view("hello"), "");
511 static_assert(string_view("hello") < string_view("zello"), "");
512 static_assert(string_view("hello") < string_view("z"), "");
513 static_assert(string_view("hello") < string_view("zabcdefghijklmno"), "");
514 static_assert(string_view("hello") < string_view("helz"), "");
515 static_assert(string_view("hello") < string_view("helzo"), "");
516 static_assert(string_view("hello") < string_view("helzobcdefgh"), "");
517 static_assert(string_view("hello") < string_view("helloa"), "");
518 } // namespace test_less_than
519 
520 namespace test_less_or_equal_than {
521 static_assert(string_view("") <= string_view(""), "");
522 static_assert(string_view("a") <= string_view("a"), "");
523 static_assert(string_view("hello") <= string_view("hello"), "");
524 static_assert(!(string_view("hello") <= string_view("")), "");
525 static_assert(!(string_view("hello") <= string_view("aello")), "");
526 static_assert(!(string_view("hello") <= string_view("a")), "");
527 static_assert(!(string_view("hello") <= string_view("abcdefghijklmno")), "");
528 static_assert(!(string_view("hello") <= string_view("hela")), "");
529 static_assert(!(string_view("hello") <= string_view("helao")), "");
530 static_assert(!(string_view("hello") <= string_view("helaobcdefgh")), "");
531 static_assert(!(string_view("hello") <= string_view("hell")), "");
532 static_assert(string_view("") <= string_view("hello"), "");
533 static_assert(string_view("hello") <= string_view("zello"), "");
534 static_assert(string_view("hello") <= string_view("z"), "");
535 static_assert(string_view("hello") <= string_view("zabcdefghijklmno"), "");
536 static_assert(string_view("hello") <= string_view("helz"), "");
537 static_assert(string_view("hello") <= string_view("helzo"), "");
538 static_assert(string_view("hello") <= string_view("helzobcdefgh"), "");
539 static_assert(string_view("hello") <= string_view("helloa"), "");
540 } // namespace test_less_or_equal_than
541 
542 namespace test_greater_than {
543 static_assert(!(string_view("") > string_view("")), "");
544 static_assert(!(string_view("a") > string_view("a")), "");
545 static_assert(!(string_view("hello") > string_view("hello")), "");
546 static_assert(string_view("hello") > string_view(""), "");
547 static_assert(string_view("hello") > string_view("aello"), "");
548 static_assert(string_view("hello") > string_view("a"), "");
549 static_assert(string_view("hello") > string_view("abcdefghijklmno"), "");
550 static_assert(string_view("hello") > string_view("hela"), "");
551 static_assert(string_view("hello") > string_view("helao"), "");
552 static_assert(string_view("hello") > string_view("helaobcdefgh"), "");
553 static_assert(string_view("hello") > string_view("hell"), "");
554 static_assert(!(string_view("") > string_view("hello")), "");
555 static_assert(!(string_view("hello") > string_view("zello")), "");
556 static_assert(!(string_view("hello") > string_view("z")), "");
557 static_assert(!(string_view("hello") > string_view("zabcdefghijklmno")), "");
558 static_assert(!(string_view("hello") > string_view("helz")), "");
559 static_assert(!(string_view("hello") > string_view("helzo")), "");
560 static_assert(!(string_view("hello") > string_view("helzobcdefgh")), "");
561 static_assert(!(string_view("hello") > string_view("helloa")), "");
562 } // namespace test_greater_than
563 
564 namespace test_greater_or_equals_than {
565 static_assert(string_view("") >= string_view(""), "");
566 static_assert(string_view("a") >= string_view("a"), "");
567 static_assert(string_view("hello") >= string_view("hello"), "");
568 static_assert(string_view("hello") >= string_view(""), "");
569 static_assert(string_view("hello") >= string_view("aello"), "");
570 static_assert(string_view("hello") >= string_view("a"), "");
571 static_assert(string_view("hello") >= string_view("abcdefghijklmno"), "");
572 static_assert(string_view("hello") >= string_view("hela"), "");
573 static_assert(string_view("hello") >= string_view("helao"), "");
574 static_assert(string_view("hello") >= string_view("helaobcdefgh"), "");
575 static_assert(string_view("hello") >= string_view("hell"), "");
576 static_assert(!(string_view("") >= string_view("hello")), "");
577 static_assert(!(string_view("hello") >= string_view("zello")), "");
578 static_assert(!(string_view("hello") >= string_view("z")), "");
579 static_assert(!(string_view("hello") >= string_view("zabcdefghijklmno")), "");
580 static_assert(!(string_view("hello") >= string_view("helz")), "");
581 static_assert(!(string_view("hello") >= string_view("helzo")), "");
582 static_assert(!(string_view("hello") >= string_view("helzobcdefgh")), "");
583 static_assert(!(string_view("hello") >= string_view("helloa")), "");
584 } // namespace test_greater_or_equals_than
585 
586 namespace test_starts_with {
587 static_assert(string_view("hi").starts_with(string_view("hi")), "");
588 static_assert(string_view("").starts_with(string_view("")), "");
589 static_assert(string_view("hi2").starts_with(string_view("")), "");
590 static_assert(!string_view("").starts_with(string_view("hi")), "");
591 static_assert(string_view("hi2").starts_with(string_view("hi")), "");
592 static_assert(!string_view("hi").starts_with(string_view("hi2")), "");
593 static_assert(!string_view("hi").starts_with(string_view("ha")), "");
594 
595 static_assert(string_view("hi").starts_with("hi"), "");
596 static_assert(string_view("").starts_with(""), "");
597 static_assert(string_view("hi2").starts_with(""), "");
598 static_assert(!string_view("").starts_with("hi"), "");
599 static_assert(string_view("hi2").starts_with("hi"), "");
600 static_assert(!string_view("hi").starts_with("hi2"), "");
601 static_assert(!string_view("hi").starts_with("ha"), "");
602 
603 static_assert(!string_view("").starts_with('a'), "");
604 static_assert(!string_view("").starts_with('\0'), "");
605 static_assert(!string_view("hello").starts_with('a'), "");
606 static_assert(string_view("hello").starts_with('h'), "");
607 } // namespace test_starts_with
608 
609 namespace test_ends_with {
610 static_assert(string_view("hi").ends_with(string_view("hi")), "");
611 static_assert(string_view("").ends_with(string_view("")), "");
612 static_assert(string_view("hi2").ends_with(string_view("")), "");
613 static_assert(!string_view("").ends_with(string_view("hi")), "");
614 static_assert(string_view("hi2").ends_with(string_view("i2")), "");
615 static_assert(!string_view("i2").ends_with(string_view("hi2")), "");
616 static_assert(!string_view("hi").ends_with(string_view("ha")), "");
617 
618 static_assert(string_view("hi").ends_with("hi"), "");
619 static_assert(string_view("").ends_with(""), "");
620 static_assert(string_view("hi2").ends_with(""), "");
621 static_assert(!string_view("").ends_with("hi"), "");
622 static_assert(string_view("hi2").ends_with("i2"), "");
623 static_assert(!string_view("i2").ends_with("hi2"), "");
624 static_assert(!string_view("hi").ends_with("ha"), "");
625 
626 static_assert(!string_view("").ends_with('a'), "");
627 static_assert(!string_view("").ends_with('\0'), "");
628 static_assert(!string_view("hello").ends_with('a'), "");
629 static_assert(string_view("hello").ends_with('o'), "");
630 } // namespace test_ends_with
631 
632 namespace test_find_overload1 {
633 static_assert(0 == string_view("").find(string_view("")), "");
634 static_assert(string_view::npos == string_view("").find(string_view("a")), "");
635 static_assert(
636     string_view::npos == string_view("").find(string_view(""), 1),
637     "");
638 static_assert(0 == string_view("abc").find(string_view("")), "");
639 static_assert(2 == string_view("abc").find(string_view(""), 2), "");
640 static_assert(0 == string_view("abc").find(string_view("a")), "");
641 static_assert(0 == string_view("abc").find(string_view("ab")), "");
642 static_assert(0 == string_view("abc").find(string_view("abc")), "");
643 static_assert(1 == string_view("abc").find(string_view("bc")), "");
644 static_assert(1 == string_view("abc").find(string_view("b")), "");
645 static_assert(2 == string_view("abc").find(string_view("c")), "");
646 static_assert(0 == string_view("abc").find(string_view("a")), "");
647 static_assert(0 == string_view("abc").find(string_view("ab")), "");
648 static_assert(0 == string_view("abc").find(string_view("abc")), "");
649 static_assert(1 == string_view("ababa").find(string_view("ba")), "");
650 static_assert(3 == string_view("ababa").find(string_view("ba"), 2), "");
651 static_assert(3 == string_view("ababa").find(string_view("ba"), 3), "");
652 static_assert(
653     string_view::npos == string_view("ababa").find(string_view("ba"), 4),
654     "");
655 static_assert(
656     string_view::npos == string_view("abc").find(string_view("abcd")),
657     "");
658 } // namespace test_find_overload1
659 
660 namespace test_find_overload2 {
661 static_assert(string_view::npos == string_view("").find('a'), "");
662 static_assert(0 == string_view("a").find('a'), "");
663 static_assert(0 == string_view("abc").find('a'), "");
664 static_assert(string_view::npos == string_view("a").find('a', 1), "");
665 static_assert(1 == string_view("abc").find('b'), "");
666 static_assert(1 == string_view("abc").find('b', 1), "");
667 static_assert(string_view::npos == string_view("abc").find('b', 2), "");
668 static_assert(2 == string_view("abc").find('c'), "");
669 static_assert(2 == string_view("abc").find('c', 1), "");
670 static_assert(2 == string_view("abc").find('c', 2), "");
671 static_assert(string_view::npos == string_view("abc").find('c', 3), "");
672 static_assert(string_view::npos == string_view("abc").find('a', 100), "");
673 static_assert(string_view::npos == string_view("abc").find('z'), "");
674 static_assert(0 == string_view("ababa").find('a'), "");
675 static_assert(0 == string_view("ababa").find('a', 0), "");
676 static_assert(2 == string_view("ababa").find('a', 1), "");
677 static_assert(2 == string_view("ababa").find('a', 2), "");
678 static_assert(4 == string_view("ababa").find('a', 3), "");
679 static_assert(4 == string_view("ababa").find('a', 4), "");
680 static_assert(string_view::npos == string_view("ababa").find('a', 5), "");
681 } // namespace test_find_overload2
682 
683 namespace test_find_overload3 {
684 static_assert(0 == string_view("").find("", 0, 0), "");
685 static_assert(string_view::npos == string_view("").find("a", 0, 1), "");
686 static_assert(string_view::npos == string_view("").find("", 1, 0), "");
687 static_assert(0 == string_view("abc").find("", 0, 0), "");
688 static_assert(2 == string_view("abc").find("", 2, 0), "");
689 static_assert(0 == string_view("abc").find("a", 0, 1), "");
690 static_assert(0 == string_view("abc").find("ab", 0, 2), "");
691 static_assert(0 == string_view("abc").find("abc", 0, 3), "");
692 static_assert(1 == string_view("abc").find("bc", 0, 2), "");
693 static_assert(1 == string_view("abc").find("b", 0, 1), "");
694 static_assert(2 == string_view("abc").find("c", 0, 1), "");
695 static_assert(0 == string_view("abc").find("a", 0, 1), "");
696 static_assert(0 == string_view("abc").find("ab", 0, 2), "");
697 static_assert(0 == string_view("abc").find("abc", 0, 3), "");
698 static_assert(1 == string_view("ababa").find("ba", 0, 2), "");
699 static_assert(3 == string_view("ababa").find("ba", 2, 2), "");
700 static_assert(3 == string_view("ababa").find("ba", 3, 2), "");
701 static_assert(string_view::npos == string_view("ababa").find("ba", 4, 2), "");
702 static_assert(string_view::npos == string_view("abc").find("abcd", 0, 4), "");
703 } // namespace test_find_overload3
704 
705 namespace test_find_overload4 {
706 static_assert(0 == string_view("").find(""), "");
707 static_assert(string_view::npos == string_view("").find("a"), "");
708 static_assert(string_view::npos == string_view("").find("", 1), "");
709 static_assert(0 == string_view("abc").find(""), "");
710 static_assert(2 == string_view("abc").find("", 2), "");
711 static_assert(0 == string_view("abc").find("a"), "");
712 static_assert(0 == string_view("abc").find("ab"), "");
713 static_assert(0 == string_view("abc").find("abc"), "");
714 static_assert(1 == string_view("abc").find("bc"), "");
715 static_assert(1 == string_view("abc").find("b"), "");
716 static_assert(2 == string_view("abc").find("c"), "");
717 static_assert(0 == string_view("abc").find("a"), "");
718 static_assert(0 == string_view("abc").find("ab"), "");
719 static_assert(0 == string_view("abc").find("abc"), "");
720 static_assert(1 == string_view("ababa").find("ba"), "");
721 static_assert(3 == string_view("ababa").find("ba", 2), "");
722 static_assert(3 == string_view("ababa").find("ba", 3), "");
723 static_assert(string_view::npos == string_view("ababa").find("ba", 4), "");
724 static_assert(string_view::npos == string_view("abc").find("abcd"), "");
725 } // namespace test_find_overload4
726 
727 namespace test_rfind_overload1 {
728 static_assert(0 == string_view("").rfind(string_view("")), "");
729 static_assert(string_view::npos == string_view("").rfind(string_view("a")), "");
730 static_assert(0 == string_view("").rfind(string_view(""), 1), "");
731 static_assert(3 == string_view("abc").rfind(string_view("")), "");
732 static_assert(0 == string_view("abc").rfind(string_view(""), 0), "");
733 static_assert(0 == string_view("abc").rfind(string_view("a")), "");
734 static_assert(0 == string_view("abc").rfind(string_view("ab")), "");
735 static_assert(0 == string_view("abc").rfind(string_view("abc")), "");
736 static_assert(1 == string_view("abc").rfind(string_view("bc")), "");
737 static_assert(1 == string_view("abc").rfind(string_view("b")), "");
738 static_assert(2 == string_view("abc").rfind(string_view("c")), "");
739 static_assert(0 == string_view("abc").rfind(string_view("a")), "");
740 static_assert(0 == string_view("abc").rfind(string_view("ab")), "");
741 static_assert(0 == string_view("abc").rfind(string_view("abc")), "");
742 static_assert(3 == string_view("ababa").rfind(string_view("ba")), "");
743 static_assert(1 == string_view("ababa").rfind(string_view("ba"), 2), "");
744 static_assert(1 == string_view("ababa").rfind(string_view("ba"), 1), "");
745 static_assert(
746     string_view::npos == string_view("ababa").rfind(string_view("ba"), 0),
747     "");
748 static_assert(
749     string_view::npos == string_view("abc").rfind(string_view("abcd")),
750     "");
751 } // namespace test_rfind_overload1
752 
753 namespace test_rfind_overload2 {
754 static_assert(string_view::npos == string_view("").rfind('a'), "");
755 static_assert(0 == string_view("a").rfind('a'), "");
756 static_assert(0 == string_view("abc").rfind('a'), "");
757 static_assert(0 == string_view("a").rfind('a', 0), "");
758 static_assert(1 == string_view("abc").rfind('b'), "");
759 static_assert(string_view::npos == string_view("abc").rfind('b', 0), "");
760 static_assert(1 == string_view("abc").rfind('b', 1), "");
761 static_assert(2 == string_view("abc").rfind('c'), "");
762 static_assert(string_view::npos == string_view("abc").rfind('c', 0), "");
763 static_assert(string_view::npos == string_view("abc").rfind('c', 1), "");
764 static_assert(2 == string_view("abc").rfind('c', 2), "");
765 static_assert(2 == string_view("abc").rfind('c', 3), "");
766 static_assert(0 == string_view("abc").rfind('a', 100), "");
767 static_assert(string_view::npos == string_view("abc").rfind('z'), "");
768 static_assert(4 == string_view("ababa").rfind('a'), "");
769 static_assert(0 == string_view("ababa").rfind('a', 0), "");
770 static_assert(0 == string_view("ababa").rfind('a', 1), "");
771 static_assert(2 == string_view("ababa").rfind('a', 2), "");
772 static_assert(2 == string_view("ababa").rfind('a', 3), "");
773 static_assert(4 == string_view("ababa").rfind('a', 4), "");
774 static_assert(4 == string_view("ababa").rfind('a', 5), "");
775 } // namespace test_rfind_overload2
776 
777 namespace test_rfind_overload3 {
778 static_assert(0 == string_view("").rfind("", string_view::npos, 0), "");
779 static_assert(
780     string_view::npos == string_view("").rfind("a", string_view::npos, 1),
781     "");
782 static_assert(0 == string_view("").rfind("", 1, 0), "");
783 static_assert(3 == string_view("abc").rfind("", string_view::npos, 0), "");
784 static_assert(0 == string_view("abc").rfind("", 0, 0), "");
785 static_assert(0 == string_view("abc").rfind("a", string_view::npos, 1), "");
786 static_assert(0 == string_view("abc").rfind("ab", string_view::npos, 2), "");
787 static_assert(0 == string_view("abc").rfind("abc", string_view::npos, 3), "");
788 static_assert(1 == string_view("abc").rfind("bc", string_view::npos, 2), "");
789 static_assert(1 == string_view("abc").rfind("b", string_view::npos, 1), "");
790 static_assert(2 == string_view("abc").rfind("c", string_view::npos, 1), "");
791 static_assert(0 == string_view("abc").rfind("a", string_view::npos, 1), "");
792 static_assert(0 == string_view("abc").rfind("ab", string_view::npos, 2), "");
793 static_assert(0 == string_view("abc").rfind("abc", string_view::npos, 3), "");
794 static_assert(3 == string_view("ababa").rfind("ba", string_view::npos, 2), "");
795 static_assert(1 == string_view("ababa").rfind("ba", 2, 2), "");
796 static_assert(1 == string_view("ababa").rfind("ba", 1, 2), "");
797 static_assert(string_view::npos == string_view("ababa").rfind("ba", 0, 2), "");
798 static_assert(
799     string_view::npos == string_view("abc").rfind("abcd", string_view::npos, 4),
800     "");
801 } // namespace test_rfind_overload3
802 
803 namespace test_rfind_overload4 {
804 static_assert(0 == string_view("").rfind(""), "");
805 static_assert(string_view::npos == string_view("").rfind("a"), "");
806 static_assert(0 == string_view("").rfind("", 1), "");
807 static_assert(3 == string_view("abc").rfind(""), "");
808 static_assert(0 == string_view("abc").rfind("", 0), "");
809 static_assert(0 == string_view("abc").rfind("a"), "");
810 static_assert(0 == string_view("abc").rfind("ab"), "");
811 static_assert(0 == string_view("abc").rfind("abc"), "");
812 static_assert(1 == string_view("abc").rfind("bc"), "");
813 static_assert(1 == string_view("abc").rfind("b"), "");
814 static_assert(2 == string_view("abc").rfind("c"), "");
815 static_assert(0 == string_view("abc").rfind("a"), "");
816 static_assert(0 == string_view("abc").rfind("ab"), "");
817 static_assert(0 == string_view("abc").rfind("abc"), "");
818 static_assert(3 == string_view("ababa").rfind("ba"), "");
819 static_assert(1 == string_view("ababa").rfind("ba", 2), "");
820 static_assert(1 == string_view("ababa").rfind("ba", 1), "");
821 static_assert(string_view::npos == string_view("ababa").rfind("ba", 0), "");
822 static_assert(string_view::npos == string_view("abc").rfind("abcd"), "");
823 } // namespace test_rfind_overload4
824 
825 namespace test_find_first_of_overload1 {
826 static_assert(
827     string_view::npos == string_view("").find_first_of(string_view("")),
828     "");
829 static_assert(
830     string_view::npos == string_view("").find_first_of(string_view("a")),
831     "");
832 static_assert(
833     string_view::npos == string_view("").find_first_of(string_view("abc")),
834     "");
835 static_assert(
836     string_view::npos == string_view("abc").find_first_of(string_view("")),
837     "");
838 static_assert(
839     string_view::npos == string_view("abc").find_first_of(string_view("d")),
840     "");
841 static_assert(
842     string_view::npos == string_view("abc").find_first_of(string_view("def")),
843     "");
844 
845 static_assert(0 == string_view("abcabc").find_first_of(string_view("a")), "");
846 static_assert(1 == string_view("abcabc").find_first_of(string_view("b")), "");
847 static_assert(2 == string_view("abcabc").find_first_of(string_view("c")), "");
848 static_assert(1 == string_view("abcabc").find_first_of(string_view("bc")), "");
849 static_assert(1 == string_view("abcabc").find_first_of(string_view("cbd")), "");
850 
851 static_assert(
852     string_view::npos == string_view("").find_first_of(string_view(""), 1),
853     "");
854 static_assert(
855     string_view::npos == string_view("").find_first_of(string_view("a"), 1),
856     "");
857 static_assert(
858     string_view::npos == string_view("").find_first_of(string_view("abc"), 100),
859     "");
860 static_assert(
861     string_view::npos == string_view("abc").find_first_of(string_view(""), 1),
862     "");
863 static_assert(
864     string_view::npos == string_view("abc").find_first_of(string_view("d"), 3),
865     "");
866 static_assert(
867     string_view::npos ==
868         string_view("abc").find_first_of(string_view("def"), 2),
869     "");
870 
871 static_assert(
872     3 == string_view("abcabc").find_first_of(string_view("a"), 1),
873     "");
874 static_assert(
875     4 == string_view("abcabc").find_first_of(string_view("b"), 3),
876     "");
877 static_assert(
878     5 == string_view("abcabc").find_first_of(string_view("c"), 5),
879     "");
880 static_assert(
881     4 == string_view("abcabc").find_first_of(string_view("bc"), 3),
882     "");
883 static_assert(
884     4 == string_view("abcabc").find_first_of(string_view("cbd"), 4),
885     "");
886 } // namespace test_find_first_of_overload1
887 
888 namespace test_find_first_of_overload2 {
889 static_assert(string_view::npos == string_view("").find_first_of('a'), "");
890 static_assert(0 == string_view("a").find_first_of('a'), "");
891 static_assert(0 == string_view("abc").find_first_of('a'), "");
892 static_assert(string_view::npos == string_view("a").find_first_of('a', 1), "");
893 static_assert(1 == string_view("abc").find_first_of('b'), "");
894 static_assert(1 == string_view("abc").find_first_of('b', 1), "");
895 static_assert(
896     string_view::npos == string_view("abc").find_first_of('b', 2),
897     "");
898 static_assert(2 == string_view("abc").find_first_of('c'), "");
899 static_assert(2 == string_view("abc").find_first_of('c', 1), "");
900 static_assert(2 == string_view("abc").find_first_of('c', 2), "");
901 static_assert(
902     string_view::npos == string_view("abc").find_first_of('c', 3),
903     "");
904 static_assert(
905     string_view::npos == string_view("abc").find_first_of('a', 100),
906     "");
907 static_assert(string_view::npos == string_view("abc").find_first_of('z'), "");
908 static_assert(0 == string_view("ababa").find_first_of('a'), "");
909 static_assert(0 == string_view("ababa").find_first_of('a', 0), "");
910 static_assert(2 == string_view("ababa").find_first_of('a', 1), "");
911 static_assert(2 == string_view("ababa").find_first_of('a', 2), "");
912 static_assert(4 == string_view("ababa").find_first_of('a', 3), "");
913 static_assert(4 == string_view("ababa").find_first_of('a', 4), "");
914 static_assert(
915     string_view::npos == string_view("ababa").find_first_of('a', 5),
916     "");
917 } // namespace test_find_first_of_overload2
918 
919 namespace test_find_first_of_overload3 {
920 static_assert(
921     string_view::npos == string_view("").find_first_of("ab", 0, 0),
922     "");
923 static_assert(
924     string_view::npos == string_view("").find_first_of("abc", 0, 1),
925     "");
926 static_assert(
927     string_view::npos == string_view("").find_first_of("abcdef", 0, 3),
928     "");
929 static_assert(
930     string_view::npos == string_view("abc").find_first_of("abcdef", 0, 0),
931     "");
932 static_assert(
933     string_view::npos == string_view("abc").find_first_of("defa", 0, 1),
934     "");
935 static_assert(
936     string_view::npos == string_view("abc").find_first_of("defabc", 0, 3),
937     "");
938 
939 static_assert(0 == string_view("abcabc").find_first_of("abc", 0, 1), "");
940 static_assert(1 == string_view("abcabc").find_first_of("bac", 0, 1), "");
941 static_assert(2 == string_view("abcabc").find_first_of("cab", 0, 1), "");
942 static_assert(1 == string_view("abcabc").find_first_of("bccda", 0, 2), "");
943 static_assert(1 == string_view("abcabc").find_first_of("cbdab", 0, 3), "");
944 
945 static_assert(
946     string_view::npos == string_view("").find_first_of("ab", 1, 0),
947     "");
948 static_assert(
949     string_view::npos == string_view("").find_first_of("abc", 1, 1),
950     "");
951 static_assert(
952     string_view::npos == string_view("").find_first_of("abcdef", 100, 3),
953     "");
954 static_assert(
955     string_view::npos == string_view("abc").find_first_of("abcdef", 1, 0),
956     "");
957 static_assert(
958     string_view::npos == string_view("abc").find_first_of("defa", 3, 1),
959     "");
960 static_assert(
961     string_view::npos == string_view("abc").find_first_of("defabc", 2, 3),
962     "");
963 
964 static_assert(3 == string_view("abcabc").find_first_of("abc", 1, 1), "");
965 static_assert(4 == string_view("abcabc").find_first_of("bac", 3, 1), "");
966 static_assert(5 == string_view("abcabc").find_first_of("cab", 5, 1), "");
967 static_assert(4 == string_view("abcabc").find_first_of("bccda", 3, 2), "");
968 static_assert(4 == string_view("abcabc").find_first_of("cbdab", 4, 3), "");
969 } // namespace test_find_first_of_overload3
970 
971 namespace test_find_first_of_overload4 {
972 static_assert(string_view::npos == string_view("").find_first_of(""), "");
973 static_assert(string_view::npos == string_view("").find_first_of("a"), "");
974 static_assert(string_view::npos == string_view("").find_first_of("abc"), "");
975 static_assert(string_view::npos == string_view("abc").find_first_of(""), "");
976 static_assert(string_view::npos == string_view("abc").find_first_of("d"), "");
977 static_assert(string_view::npos == string_view("abc").find_first_of("def"), "");
978 
979 static_assert(0 == string_view("abcabc").find_first_of("a"), "");
980 static_assert(1 == string_view("abcabc").find_first_of("b"), "");
981 static_assert(2 == string_view("abcabc").find_first_of("c"), "");
982 static_assert(1 == string_view("abcabc").find_first_of("bc"), "");
983 static_assert(1 == string_view("abcabc").find_first_of("cbd"), "");
984 
985 static_assert(string_view::npos == string_view("").find_first_of("", 1), "");
986 static_assert(string_view::npos == string_view("").find_first_of("a", 1), "");
987 static_assert(
988     string_view::npos == string_view("").find_first_of("abc", 100),
989     "");
990 static_assert(string_view::npos == string_view("abc").find_first_of("", 1), "");
991 static_assert(
992     string_view::npos == string_view("abc").find_first_of("d", 3),
993     "");
994 static_assert(
995     string_view::npos == string_view("abc").find_first_of("def", 2),
996     "");
997 
998 static_assert(3 == string_view("abcabc").find_first_of("a", 1), "");
999 static_assert(4 == string_view("abcabc").find_first_of("b", 3), "");
1000 static_assert(5 == string_view("abcabc").find_first_of("c", 5), "");
1001 static_assert(4 == string_view("abcabc").find_first_of("bc", 3), "");
1002 static_assert(4 == string_view("abcabc").find_first_of("cbd", 4), "");
1003 } // namespace test_find_first_of_overload4
1004 
1005 namespace test_find_last_of_overload1 {
1006 static_assert(
1007     string_view::npos == string_view("").find_last_of(string_view("")),
1008     "");
1009 static_assert(
1010     string_view::npos == string_view("").find_last_of(string_view("a")),
1011     "");
1012 static_assert(
1013     string_view::npos == string_view("").find_last_of(string_view("abc")),
1014     "");
1015 static_assert(
1016     string_view::npos == string_view("abc").find_last_of(string_view("")),
1017     "");
1018 static_assert(
1019     string_view::npos == string_view("abc").find_last_of(string_view("d")),
1020     "");
1021 static_assert(
1022     string_view::npos == string_view("abc").find_last_of(string_view("def")),
1023     "");
1024 
1025 static_assert(3 == string_view("abcabc").find_last_of(string_view("a")), "");
1026 static_assert(4 == string_view("abcabc").find_last_of(string_view("b")), "");
1027 static_assert(5 == string_view("abcabc").find_last_of(string_view("c")), "");
1028 static_assert(5 == string_view("abcabc").find_last_of(string_view("bc")), "");
1029 static_assert(5 == string_view("abcabc").find_last_of(string_view("cbd")), "");
1030 
1031 static_assert(
1032     string_view::npos == string_view("").find_last_of(string_view(""), 1),
1033     "");
1034 static_assert(
1035     string_view::npos == string_view("").find_last_of(string_view("a"), 0),
1036     "");
1037 static_assert(
1038     string_view::npos == string_view("").find_last_of(string_view("abc"), 100),
1039     "");
1040 static_assert(
1041     string_view::npos == string_view("abc").find_last_of(string_view(""), 1),
1042     "");
1043 static_assert(
1044     string_view::npos == string_view("abc").find_last_of(string_view("d"), 3),
1045     "");
1046 static_assert(
1047     string_view::npos == string_view("abc").find_last_of(string_view("def"), 2),
1048     "");
1049 
1050 static_assert(0 == string_view("abcabc").find_last_of(string_view("a"), 2), "");
1051 static_assert(1 == string_view("abcabc").find_last_of(string_view("b"), 3), "");
1052 static_assert(2 == string_view("abcabc").find_last_of(string_view("c"), 2), "");
1053 static_assert(
1054     2 == string_view("abcabc").find_last_of(string_view("bc"), 3),
1055     "");
1056 static_assert(
1057     2 == string_view("abcabc").find_last_of(string_view("cbd"), 2),
1058     "");
1059 } // namespace test_find_last_of_overload1
1060 
1061 namespace test_find_last_of_overload2 {
1062 static_assert(string_view::npos == string_view("").find_last_of('a'), "");
1063 static_assert(0 == string_view("a").find_last_of('a'), "");
1064 static_assert(0 == string_view("abc").find_last_of('a'), "");
1065 static_assert(0 == string_view("a").find_last_of('a', 0), "");
1066 static_assert(1 == string_view("abc").find_last_of('b'), "");
1067 static_assert(string_view::npos == string_view("abc").find_last_of('b', 0), "");
1068 static_assert(1 == string_view("abc").find_last_of('b', 1), "");
1069 static_assert(2 == string_view("abc").find_last_of('c'), "");
1070 static_assert(string_view::npos == string_view("abc").find_last_of('c', 0), "");
1071 static_assert(string_view::npos == string_view("abc").find_last_of('c', 1), "");
1072 static_assert(2 == string_view("abc").find_last_of('c', 2), "");
1073 static_assert(2 == string_view("abc").find_last_of('c', 3), "");
1074 static_assert(0 == string_view("abc").find_last_of('a', 100), "");
1075 static_assert(string_view::npos == string_view("abc").find_last_of('z'), "");
1076 static_assert(4 == string_view("ababa").find_last_of('a'), "");
1077 static_assert(0 == string_view("ababa").find_last_of('a', 0), "");
1078 static_assert(0 == string_view("ababa").find_last_of('a', 1), "");
1079 static_assert(2 == string_view("ababa").find_last_of('a', 2), "");
1080 static_assert(2 == string_view("ababa").find_last_of('a', 3), "");
1081 static_assert(4 == string_view("ababa").find_last_of('a', 4), "");
1082 static_assert(4 == string_view("ababa").find_last_of('a', 5), "");
1083 } // namespace test_find_last_of_overload2
1084 
1085 namespace test_find_last_of_overload3 {
1086 static_assert(
1087     string_view::npos ==
1088         string_view("").find_last_of("ab", string_view::npos, 0),
1089     "");
1090 static_assert(
1091     string_view::npos ==
1092         string_view("").find_last_of("abc", string_view::npos, 1),
1093     "");
1094 static_assert(
1095     string_view::npos ==
1096         string_view("").find_last_of("abcdef", string_view::npos, 3),
1097     "");
1098 static_assert(
1099     string_view::npos ==
1100         string_view("abc").find_last_of("abcdef", string_view::npos, 0),
1101     "");
1102 static_assert(
1103     string_view::npos ==
1104         string_view("abc").find_last_of("defa", string_view::npos, 1),
1105     "");
1106 static_assert(
1107     string_view::npos ==
1108         string_view("abc").find_last_of("defcba", string_view::npos, 3),
1109     "");
1110 
1111 static_assert(
1112     3 == string_view("abcabc").find_last_of("abc", string_view::npos, 1),
1113     "");
1114 static_assert(
1115     4 == string_view("abcabc").find_last_of("bca", string_view::npos, 1),
1116     "");
1117 static_assert(
1118     5 == string_view("abcabc").find_last_of("cab", string_view::npos, 1),
1119     "");
1120 static_assert(
1121     5 == string_view("abcabc").find_last_of("bcab", string_view::npos, 2),
1122     "");
1123 static_assert(
1124     5 == string_view("abcabc").find_last_of("cbdac", string_view::npos, 3),
1125     "");
1126 
1127 static_assert(
1128     string_view::npos == string_view("").find_last_of("ab", 1, 0),
1129     "");
1130 static_assert(
1131     string_view::npos == string_view("").find_last_of("abc", 0, 1),
1132     "");
1133 static_assert(
1134     string_view::npos == string_view("").find_last_of("abcdef", 100, 3),
1135     "");
1136 static_assert(
1137     string_view::npos == string_view("abc").find_last_of("abcdef", 1, 0),
1138     "");
1139 static_assert(
1140     string_view::npos == string_view("abc").find_last_of("defa", 3, 1),
1141     "");
1142 static_assert(
1143     string_view::npos == string_view("abc").find_last_of("defcba", 2, 3),
1144     "");
1145 
1146 static_assert(0 == string_view("abcabc").find_last_of("abc", 2, 1), "");
1147 static_assert(1 == string_view("abcabc").find_last_of("bca", 3, 1), "");
1148 static_assert(2 == string_view("abcabc").find_last_of("cab", 2, 1), "");
1149 static_assert(2 == string_view("abcabc").find_last_of("bcab", 3, 2), "");
1150 static_assert(2 == string_view("abcabc").find_last_of("cbdac", 2, 2), "");
1151 } // namespace test_find_last_of_overload3
1152 
1153 namespace test_find_last_of_overload4 {
1154 static_assert(string_view::npos == string_view("").find_last_of(""), "");
1155 static_assert(string_view::npos == string_view("").find_last_of("a"), "");
1156 static_assert(string_view::npos == string_view("").find_last_of("abc"), "");
1157 static_assert(string_view::npos == string_view("abc").find_last_of(""), "");
1158 static_assert(string_view::npos == string_view("abc").find_last_of("d"), "");
1159 static_assert(string_view::npos == string_view("abc").find_last_of("def"), "");
1160 
1161 static_assert(3 == string_view("abcabc").find_last_of("a"), "");
1162 static_assert(4 == string_view("abcabc").find_last_of("b"), "");
1163 static_assert(5 == string_view("abcabc").find_last_of("c"), "");
1164 static_assert(5 == string_view("abcabc").find_last_of("bc"), "");
1165 static_assert(5 == string_view("abcabc").find_last_of("cbd"), "");
1166 
1167 static_assert(string_view::npos == string_view("").find_last_of("", 1), "");
1168 static_assert(string_view::npos == string_view("").find_last_of("a", 0), "");
1169 static_assert(
1170     string_view::npos == string_view("").find_last_of("abc", 100),
1171     "");
1172 static_assert(string_view::npos == string_view("abc").find_last_of("", 1), "");
1173 static_assert(string_view::npos == string_view("abc").find_last_of("d", 3), "");
1174 static_assert(
1175     string_view::npos == string_view("abc").find_last_of("def", 2),
1176     "");
1177 
1178 static_assert(0 == string_view("abcabc").find_last_of("a", 2), "");
1179 static_assert(1 == string_view("abcabc").find_last_of("b", 3), "");
1180 static_assert(2 == string_view("abcabc").find_last_of("c", 2), "");
1181 static_assert(2 == string_view("abcabc").find_last_of("bc", 3), "");
1182 static_assert(2 == string_view("abcabc").find_last_of("cbd", 2), "");
1183 } // namespace test_find_last_of_overload4
1184 
1185 namespace test_find_first_not_of_overload1 {
1186 static_assert(
1187     string_view::npos == string_view("").find_first_not_of(string_view("")),
1188     "");
1189 static_assert(
1190     string_view::npos == string_view("").find_first_not_of(string_view("a")),
1191     "");
1192 static_assert(
1193     string_view::npos == string_view("").find_first_not_of(string_view("abc")),
1194     "");
1195 static_assert(
1196     string_view::npos ==
1197         string_view("abc").find_first_not_of(string_view("abc")),
1198     "");
1199 static_assert(
1200     string_view::npos ==
1201         string_view("abc").find_first_not_of(string_view("acdb")),
1202     "");
1203 static_assert(
1204     string_view::npos ==
1205         string_view("abc").find_first_not_of(string_view("defabc")),
1206     "");
1207 
1208 static_assert(
1209     0 == string_view("abcabc").find_first_not_of(string_view("")),
1210     "");
1211 static_assert(
1212     0 == string_view("abcabc").find_first_not_of(string_view("bc")),
1213     "");
1214 static_assert(
1215     1 == string_view("abcabc").find_first_not_of(string_view("ac")),
1216     "");
1217 static_assert(
1218     2 == string_view("abcabc").find_first_not_of(string_view("ab")),
1219     "");
1220 static_assert(
1221     1 == string_view("abcabc").find_first_not_of(string_view("a")),
1222     "");
1223 static_assert(
1224     1 == string_view("abcabc").find_first_not_of(string_view("da")),
1225     "");
1226 
1227 static_assert(
1228     string_view::npos == string_view("").find_first_not_of(string_view(""), 1),
1229     "");
1230 static_assert(
1231     string_view::npos == string_view("").find_first_not_of(string_view("a"), 1),
1232     "");
1233 static_assert(
1234     string_view::npos ==
1235         string_view("").find_first_not_of(string_view("abc"), 100),
1236     "");
1237 static_assert(
1238     string_view::npos ==
1239         string_view("abc").find_first_not_of(string_view("abc"), 1),
1240     "");
1241 static_assert(
1242     string_view::npos ==
1243         string_view("abc").find_first_not_of(string_view("acdb"), 3),
1244     "");
1245 static_assert(
1246     string_view::npos ==
1247         string_view("abc").find_first_not_of(string_view("defabc"), 2),
1248     "");
1249 
1250 static_assert(
1251     1 == string_view("abcabc").find_first_not_of(string_view(""), 1),
1252     "");
1253 static_assert(
1254     3 == string_view("abcabc").find_first_not_of(string_view("bc"), 1),
1255     "");
1256 static_assert(
1257     4 == string_view("abcabc").find_first_not_of(string_view("ac"), 4),
1258     "");
1259 static_assert(
1260     5 == string_view("abcabc").find_first_not_of(string_view("ab"), 5),
1261     "");
1262 static_assert(
1263     4 == string_view("abcabc").find_first_not_of(string_view("a"), 3),
1264     "");
1265 static_assert(
1266     4 == string_view("abcabc").find_first_not_of(string_view("da"), 4),
1267     "");
1268 } // namespace test_find_first_not_of_overload1
1269 
1270 namespace test_find_first_not_of_overload2 {
1271 static_assert(string_view::npos == string_view("").find_first_not_of('a'), "");
1272 static_assert(string_view::npos == string_view("a").find_first_not_of('a'), "");
1273 static_assert(1 == string_view("abc").find_first_not_of('a'), "");
1274 static_assert(
1275     string_view::npos == string_view("a").find_first_not_of('a', 1),
1276     "");
1277 static_assert(0 == string_view("abc").find_first_not_of('b'), "");
1278 static_assert(2 == string_view("abc").find_first_not_of('b', 1), "");
1279 static_assert(2 == string_view("abc").find_first_not_of('b', 2), "");
1280 static_assert(
1281     string_view::npos == string_view("abc").find_first_not_of('b', 3),
1282     "");
1283 static_assert(0 == string_view("abc").find_first_not_of('c'), "");
1284 static_assert(1 == string_view("abc").find_first_not_of('c', 1), "");
1285 static_assert(
1286     string_view::npos == string_view("abc").find_first_not_of('c', 2),
1287     "");
1288 static_assert(
1289     string_view::npos == string_view("abc").find_first_not_of('c', 3),
1290     "");
1291 static_assert(
1292     string_view::npos == string_view("abc").find_first_not_of('a', 100),
1293     "");
1294 static_assert(1 == string_view("ababa").find_first_not_of('a'), "");
1295 static_assert(1 == string_view("ababa").find_first_not_of('a', 0), "");
1296 static_assert(1 == string_view("ababa").find_first_not_of('a', 1), "");
1297 static_assert(3 == string_view("ababa").find_first_not_of('a', 2), "");
1298 static_assert(3 == string_view("ababa").find_first_not_of('a', 3), "");
1299 static_assert(
1300     string_view::npos == string_view("ababa").find_first_not_of('a', 4),
1301     "");
1302 static_assert(
1303     string_view::npos == string_view("ababa").find_first_not_of('a', 5),
1304     "");
1305 } // namespace test_find_first_not_of_overload2
1306 
1307 namespace test_find_first_not_of_overload3 {
1308 static_assert(
1309     string_view::npos == string_view("").find_first_not_of("ab", 0, 0),
1310     "");
1311 static_assert(
1312     string_view::npos == string_view("").find_first_not_of("abc", 0, 1),
1313     "");
1314 static_assert(
1315     string_view::npos == string_view("").find_first_not_of("abcdef", 0, 3),
1316     "");
1317 static_assert(
1318     string_view::npos == string_view("abc").find_first_not_of("abcdef", 0, 3),
1319     "");
1320 static_assert(
1321     string_view::npos == string_view("abc").find_first_not_of("acdbef", 0, 4),
1322     "");
1323 static_assert(
1324     string_view::npos == string_view("abc").find_first_not_of("defabcas", 0, 6),
1325     "");
1326 
1327 static_assert(0 == string_view("abcabc").find_first_not_of("abc", 0, 0), "");
1328 static_assert(0 == string_view("abcabc").find_first_not_of("bca", 0, 2), "");
1329 static_assert(1 == string_view("abcabc").find_first_not_of("acb", 0, 2), "");
1330 static_assert(2 == string_view("abcabc").find_first_not_of("abc", 0, 2), "");
1331 static_assert(1 == string_view("abcabc").find_first_not_of("abac", 0, 1), "");
1332 static_assert(1 == string_view("abcabc").find_first_not_of("dadab", 0, 2), "");
1333 
1334 static_assert(
1335     string_view::npos == string_view("").find_first_not_of("ab", 1, 0),
1336     "");
1337 static_assert(
1338     string_view::npos == string_view("").find_first_not_of("abc", 1, 1),
1339     "");
1340 static_assert(
1341     string_view::npos == string_view("").find_first_not_of("abcdef", 100, 3),
1342     "");
1343 static_assert(
1344     string_view::npos == string_view("abc").find_first_not_of("abcdef", 1, 3),
1345     "");
1346 static_assert(
1347     string_view::npos == string_view("abc").find_first_not_of("acdbef", 3, 4),
1348     "");
1349 static_assert(
1350     string_view::npos == string_view("abc").find_first_not_of("defabcas", 2, 6),
1351     "");
1352 
1353 static_assert(1 == string_view("abcabc").find_first_not_of("bca", 1, 0), "");
1354 static_assert(3 == string_view("abcabc").find_first_not_of("bca", 1, 2), "");
1355 static_assert(4 == string_view("abcabc").find_first_not_of("acb", 4, 2), "");
1356 static_assert(5 == string_view("abcabc").find_first_not_of("abc", 5, 2), "");
1357 static_assert(4 == string_view("abcabc").find_first_not_of("abac", 3, 1), "");
1358 static_assert(4 == string_view("abcabc").find_first_not_of("dadab", 4, 2), "");
1359 } // namespace test_find_first_not_of_overload3
1360 
1361 namespace test_find_first_not_of_overload4 {
1362 static_assert(string_view::npos == string_view("").find_first_not_of(""), "");
1363 static_assert(string_view::npos == string_view("").find_first_not_of("a"), "");
1364 static_assert(
1365     string_view::npos == string_view("").find_first_not_of("abc"),
1366     "");
1367 static_assert(
1368     string_view::npos == string_view("abc").find_first_not_of("abc"),
1369     "");
1370 static_assert(
1371     string_view::npos == string_view("abc").find_first_not_of("acdb"),
1372     "");
1373 static_assert(
1374     string_view::npos == string_view("abc").find_first_not_of("defabc"),
1375     "");
1376 
1377 static_assert(0 == string_view("abcabc").find_first_not_of(""), "");
1378 static_assert(0 == string_view("abcabc").find_first_not_of("bc"), "");
1379 static_assert(1 == string_view("abcabc").find_first_not_of("ac"), "");
1380 static_assert(2 == string_view("abcabc").find_first_not_of("ab"), "");
1381 static_assert(1 == string_view("abcabc").find_first_not_of("a"), "");
1382 static_assert(1 == string_view("abcabc").find_first_not_of("da"), "");
1383 
1384 static_assert(
1385     string_view::npos == string_view("").find_first_not_of("", 1),
1386     "");
1387 static_assert(
1388     string_view::npos == string_view("").find_first_not_of("a", 1),
1389     "");
1390 static_assert(
1391     string_view::npos == string_view("").find_first_not_of("abc", 100),
1392     "");
1393 static_assert(
1394     string_view::npos == string_view("abc").find_first_not_of("abc", 1),
1395     "");
1396 static_assert(
1397     string_view::npos == string_view("abc").find_first_not_of("acdb", 3),
1398     "");
1399 static_assert(
1400     string_view::npos == string_view("abc").find_first_not_of("defabc", 2),
1401     "");
1402 
1403 static_assert(1 == string_view("abcabc").find_first_not_of("", 1), "");
1404 static_assert(3 == string_view("abcabc").find_first_not_of("bc", 1), "");
1405 static_assert(4 == string_view("abcabc").find_first_not_of("ac", 4), "");
1406 static_assert(5 == string_view("abcabc").find_first_not_of("ab", 5), "");
1407 static_assert(4 == string_view("abcabc").find_first_not_of("a", 3), "");
1408 static_assert(4 == string_view("abcabc").find_first_not_of("da", 4), "");
1409 } // namespace test_find_first_not_of_overload4
1410 
1411 namespace test_find_last_not_of_overload1 {
1412 static_assert(
1413     string_view::npos == string_view("").find_last_not_of(string_view("")),
1414     "");
1415 static_assert(
1416     string_view::npos == string_view("").find_last_not_of(string_view("a")),
1417     "");
1418 static_assert(
1419     string_view::npos == string_view("").find_last_not_of(string_view("abc")),
1420     "");
1421 static_assert(
1422     string_view::npos ==
1423         string_view("abc").find_last_not_of(string_view("abc")),
1424     "");
1425 static_assert(
1426     string_view::npos ==
1427         string_view("abc").find_last_not_of(string_view("acdb")),
1428     "");
1429 static_assert(
1430     string_view::npos ==
1431         string_view("abc").find_last_not_of(string_view("defabc")),
1432     "");
1433 
1434 static_assert(5 == string_view("abcabc").find_last_not_of(string_view("")), "");
1435 static_assert(
1436     3 == string_view("abcabc").find_last_not_of(string_view("bc")),
1437     "");
1438 static_assert(
1439     4 == string_view("abcabc").find_last_not_of(string_view("ac")),
1440     "");
1441 static_assert(
1442     5 == string_view("abcabc").find_last_not_of(string_view("ab")),
1443     "");
1444 static_assert(
1445     4 == string_view("abcabc").find_last_not_of(string_view("c")),
1446     "");
1447 static_assert(
1448     4 == string_view("abcabc").find_last_not_of(string_view("ca")),
1449     "");
1450 
1451 static_assert(
1452     string_view::npos == string_view("").find_last_not_of(string_view(""), 1),
1453     "");
1454 static_assert(
1455     string_view::npos == string_view("").find_last_not_of(string_view("a"), 0),
1456     "");
1457 static_assert(
1458     string_view::npos ==
1459         string_view("").find_last_not_of(string_view("abc"), 100),
1460     "");
1461 static_assert(
1462     string_view::npos ==
1463         string_view("abc").find_last_not_of(string_view("abc"), 1),
1464     "");
1465 static_assert(
1466     string_view::npos ==
1467         string_view("abc").find_last_not_of(string_view("acdb"), 3),
1468     "");
1469 static_assert(
1470     string_view::npos ==
1471         string_view("abc").find_last_not_of(string_view("defabc"), 2),
1472     "");
1473 
1474 static_assert(
1475     4 == string_view("abcabc").find_last_not_of(string_view(""), 4),
1476     "");
1477 static_assert(
1478     0 == string_view("abcabc").find_last_not_of(string_view("bc"), 2),
1479     "");
1480 static_assert(
1481     1 == string_view("abcabc").find_last_not_of(string_view("ac"), 2),
1482     "");
1483 static_assert(
1484     2 == string_view("abcabc").find_last_not_of(string_view("ab"), 2),
1485     "");
1486 static_assert(
1487     4 == string_view("abcabc").find_last_not_of(string_view("c"), 4),
1488     "");
1489 static_assert(
1490     1 == string_view("abcabc").find_last_not_of(string_view("ca"), 2),
1491     "");
1492 } // namespace test_find_last_not_of_overload1
1493 
1494 namespace test_find_last_not_of_overload2 {
1495 static_assert(string_view::npos == string_view("").find_last_not_of('a'), "");
1496 static_assert(string_view::npos == string_view("a").find_last_not_of('a'), "");
1497 static_assert(2 == string_view("abc").find_last_not_of('a'), "");
1498 static_assert(1 == string_view("abc").find_last_not_of('c'), "");
1499 static_assert(
1500     string_view::npos == string_view("a").find_last_not_of('a', 0),
1501     "");
1502 static_assert(2 == string_view("abc").find_last_not_of('b'), "");
1503 static_assert(
1504     string_view::npos == string_view("abc").find_last_not_of('a', 0),
1505     "");
1506 static_assert(0 == string_view("abc").find_last_not_of('b', 1), "");
1507 static_assert(0 == string_view("abc").find_last_not_of('c', 0), "");
1508 static_assert(1 == string_view("abc").find_last_not_of('c', 1), "");
1509 static_assert(1 == string_view("abc").find_last_not_of('c', 2), "");
1510 static_assert(1 == string_view("abc").find_last_not_of('c', 3), "");
1511 static_assert(2 == string_view("abc").find_last_not_of('a', 100), "");
1512 static_assert(3 == string_view("ababa").find_last_not_of('a'), "");
1513 static_assert(
1514     string_view::npos == string_view("ababa").find_last_not_of('a', 0),
1515     "");
1516 static_assert(1 == string_view("ababa").find_last_not_of('a', 1), "");
1517 static_assert(1 == string_view("ababa").find_last_not_of('a', 2), "");
1518 static_assert(3 == string_view("ababa").find_last_not_of('a', 3), "");
1519 static_assert(3 == string_view("ababa").find_last_not_of('a', 4), "");
1520 static_assert(3 == string_view("ababa").find_last_not_of('a', 5), "");
1521 } // namespace test_find_last_not_of_overload2
1522 
1523 namespace test_find_last_not_of_overload3 {
1524 static_assert(
1525     string_view::npos ==
1526         string_view("").find_last_not_of("ab", string_view::npos, 0),
1527     "");
1528 static_assert(
1529     string_view::npos ==
1530         string_view("").find_last_not_of("abc", string_view::npos, 1),
1531     "");
1532 static_assert(
1533     string_view::npos ==
1534         string_view("").find_last_not_of("abcdef", string_view::npos, 3),
1535     "");
1536 static_assert(
1537     string_view::npos ==
1538         string_view("abc").find_last_not_of("abcdef", string_view::npos, 3),
1539     "");
1540 static_assert(
1541     string_view::npos ==
1542         string_view("abc").find_last_not_of("acdbef", string_view::npos, 4),
1543     "");
1544 static_assert(
1545     string_view::npos ==
1546         string_view("abc").find_last_not_of("defabcas", string_view::npos, 6),
1547     "");
1548 
1549 static_assert(
1550     5 == string_view("abcabc").find_last_not_of("cab", string_view::npos, 0),
1551     "");
1552 static_assert(
1553     3 == string_view("abcabc").find_last_not_of("bca", string_view::npos, 2),
1554     "");
1555 static_assert(
1556     4 == string_view("abcabc").find_last_not_of("acb", string_view::npos, 2),
1557     "");
1558 static_assert(
1559     5 == string_view("abcabc").find_last_not_of("abc", string_view::npos, 2),
1560     "");
1561 static_assert(
1562     4 == string_view("abcabc").find_last_not_of("caba", string_view::npos, 1),
1563     "");
1564 static_assert(
1565     4 == string_view("abcabc").find_last_not_of("cacab", string_view::npos, 2),
1566     "");
1567 
1568 static_assert(
1569     string_view::npos == string_view("").find_last_not_of("ab", 1, 0),
1570     "");
1571 static_assert(
1572     string_view::npos == string_view("").find_last_not_of("abc", 0, 1),
1573     "");
1574 static_assert(
1575     string_view::npos == string_view("").find_last_not_of("abcdef", 100, 3),
1576     "");
1577 static_assert(
1578     string_view::npos == string_view("abc").find_last_not_of("abcdef", 1, 3),
1579     "");
1580 static_assert(
1581     string_view::npos == string_view("abc").find_last_not_of("acdbef", 3, 4),
1582     "");
1583 static_assert(
1584     string_view::npos == string_view("abc").find_last_not_of("defabcas", 2, 6),
1585     "");
1586 
1587 static_assert(4 == string_view("abcabc").find_last_not_of("bca", 4, 0), "");
1588 static_assert(0 == string_view("abcabc").find_last_not_of("bca", 2, 2), "");
1589 static_assert(1 == string_view("abcabc").find_last_not_of("acb", 2, 2), "");
1590 static_assert(2 == string_view("abcabc").find_last_not_of("abc", 2, 2), "");
1591 static_assert(4 == string_view("abcabc").find_last_not_of("caba", 4, 1), "");
1592 static_assert(1 == string_view("abcabc").find_last_not_of("cacab", 2, 2), "");
1593 } // namespace test_find_last_not_of_overload3
1594 
1595 namespace test_find_last_not_of_overload4 {
1596 static_assert(string_view::npos == string_view("").find_last_not_of(""), "");
1597 static_assert(string_view::npos == string_view("").find_last_not_of("a"), "");
1598 static_assert(string_view::npos == string_view("").find_last_not_of("abc"), "");
1599 static_assert(
1600     string_view::npos == string_view("abc").find_last_not_of("abc"),
1601     "");
1602 static_assert(
1603     string_view::npos == string_view("abc").find_last_not_of("acdb"),
1604     "");
1605 static_assert(
1606     string_view::npos == string_view("abc").find_last_not_of("defabc"),
1607     "");
1608 
1609 static_assert(5 == string_view("abcabc").find_last_not_of(""), "");
1610 static_assert(3 == string_view("abcabc").find_last_not_of("bc"), "");
1611 static_assert(4 == string_view("abcabc").find_last_not_of("ac"), "");
1612 static_assert(5 == string_view("abcabc").find_last_not_of("ab"), "");
1613 static_assert(4 == string_view("abcabc").find_last_not_of("c"), "");
1614 static_assert(4 == string_view("abcabc").find_last_not_of("ca"), "");
1615 
1616 static_assert(string_view::npos == string_view("").find_last_not_of("", 1), "");
1617 static_assert(
1618     string_view::npos == string_view("").find_last_not_of("a", 0),
1619     "");
1620 static_assert(
1621     string_view::npos == string_view("").find_last_not_of("abc", 100),
1622     "");
1623 static_assert(
1624     string_view::npos == string_view("abc").find_last_not_of("abc", 1),
1625     "");
1626 static_assert(
1627     string_view::npos == string_view("abc").find_last_not_of("acdb", 3),
1628     "");
1629 static_assert(
1630     string_view::npos == string_view("abc").find_last_not_of("defabc", 2),
1631     "");
1632 
1633 static_assert(4 == string_view("abcabc").find_last_not_of("", 4), "");
1634 static_assert(0 == string_view("abcabc").find_last_not_of("bc", 2), "");
1635 static_assert(1 == string_view("abcabc").find_last_not_of("ac", 2), "");
1636 static_assert(2 == string_view("abcabc").find_last_not_of("ab", 2), "");
1637 static_assert(4 == string_view("abcabc").find_last_not_of("c", 4), "");
1638 static_assert(1 == string_view("abcabc").find_last_not_of("ca", 2), "");
1639 } // namespace test_find_last_not_of_overload4
1640 
1641 namespace test_output_operator {
testOutputIterator(const std::string & str)1642 void testOutputIterator(const std::string& str) {
1643   std::ostringstream stream;
1644   stream << string_view(str);
1645   std::string actual = stream.str();
1646   EXPECT_EQ(str, actual);
1647 }
1648 
TEST(StringViewTest,testOutputOperator)1649 TEST(StringViewTest, testOutputOperator) {
1650   testOutputIterator("");
1651   testOutputIterator("abc");
1652 }
1653 } // namespace test_output_operator
1654 
1655 namespace test_hash {
TEST(StringViewTest,testHash)1656 TEST(StringViewTest, testHash) {
1657   EXPECT_EQ(
1658       std::hash<string_view>()(string_view()), std::hash<string_view>()(""));
1659   EXPECT_EQ(
1660       std::hash<string_view>()(string_view("hello")),
1661       std::hash<string_view>()("hello"));
1662   EXPECT_NE(
1663       std::hash<string_view>()(string_view("hello")),
1664       std::hash<string_view>()(""));
1665 }
1666 } // namespace test_hash
1667 
1668 } // namespace
1669 // NOLINTEND(modernize*, readability*, bugprone-string-constructor)
1670