1// { dg-options "-std=gnu++17" } 2 3// Copyright (C) 2013-2023 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20// basic_string_view find_first_of 21 22namespace operations_find_2 { 23 24static void 25test02 () 26{ 27 typedef gdb::string_view::size_type csize_type; 28 csize_type npos = gdb::string_view::npos; 29 csize_type csz01, csz02; 30 31 const char str_lit01[] = "mave"; 32 const gdb::string_view str01("mavericks, santa cruz"); 33 gdb::string_view str02(str_lit01); 34 gdb::string_view str03("s, s"); 35 gdb::string_view str04; 36 37 // size_type find_first_of(const string_view&, size_type pos = 0) const; 38 gdb::string_view str05("xena rulez"); 39 csz01 = str01.find_first_of(str01); 40 VERIFY( csz01 == 0 ); 41 csz01 = str01.find_first_of(str01, 4); 42 VERIFY( csz01 == 4 ); 43 csz01 = str01.find_first_of(str02, 0); 44 VERIFY( csz01 == 0 ); 45 csz01 = str01.find_first_of(str02, 3); 46 VERIFY( csz01 == 3 ); 47 csz01 = str01.find_first_of(str03, 0); 48 VERIFY( csz01 == 8 ); 49 csz01 = str01.find_first_of(str03, 3); 50 VERIFY( csz01 == 8 ); 51 csz01 = str01.find_first_of(str03, 12); 52 VERIFY( csz01 == 16 ); 53 csz01 = str01.find_first_of(str05, 0); 54 VERIFY( csz01 == 1 ); 55 csz01 = str01.find_first_of(str05, 4); 56 VERIFY( csz01 == 4 ); 57 58 // An empty string_view consists of no characters 59 // therefore it should be found at every point in a string_view, 60 // except beyond the end 61 // However, str1.find_first_of(str2,pos) finds the first character in 62 // str1 (starting at pos) that exists in str2, which is none for empty str2 63 csz01 = str01.find_first_of(str04, 0); 64 VERIFY( csz01 == npos ); 65 csz01 = str01.find_first_of(str04, 5); 66 VERIFY( csz01 == npos ); 67 68 // size_type find_first_of(const char* s, size_type pos, size_type n) const; 69 csz01 = str01.find_first_of(str_lit01, 0, 3); 70 VERIFY( csz01 == 0 ); 71 csz01 = str01.find_first_of(str_lit01, 3, 0); 72 VERIFY( csz01 == npos ); 73 74 // size_type find_first_of(const char* s, size_type pos = 0) const; 75 csz01 = str01.find_first_of(str_lit01); 76 VERIFY( csz01 == 0 ); 77 csz01 = str01.find_first_of(str_lit01, 3); 78 VERIFY( csz01 == 3 ); 79 80 // size_type find_first_of(char c, size_type pos = 0) const; 81 csz01 = str01.find_first_of('z'); 82 csz02 = str01.size() - 1; 83 VERIFY( csz01 == csz02 ); 84} 85 86#ifndef GDB_STRING_VIEW 87constexpr bool 88test03() 89{ 90 typedef std::string_view::size_type csize_type; 91 csize_type npos = std::string_view::npos; 92 csize_type csz01 = 0, csz02 = 0; 93 94 const char str_lit01[] = "mave"; 95 const std::string_view str01("mavericks, santa cruz"); 96 std::string_view str02(str_lit01); 97 std::string_view str03("s, s"); 98 std::string_view str04; 99 100#undef VERIFY 101#define VERIFY(x) if(!(x)) return false 102 103 // size_type find_first_of(const string_view&, size_type pos = 0) const; 104 std::string_view str05("xena rulez"); 105 csz01 = str01.find_first_of(str01); 106 VERIFY( csz01 == 0 ); 107 csz01 = str01.find_first_of(str01, 4); 108 VERIFY( csz01 == 4 ); 109 csz01 = str01.find_first_of(str02, 0); 110 VERIFY( csz01 == 0 ); 111 csz01 = str01.find_first_of(str02, 3); 112 VERIFY( csz01 == 3 ); 113 csz01 = str01.find_first_of(str03, 0); 114 VERIFY( csz01 == 8 ); 115 csz01 = str01.find_first_of(str03, 3); 116 VERIFY( csz01 == 8 ); 117 csz01 = str01.find_first_of(str03, 12); 118 VERIFY( csz01 == 16 ); 119 csz01 = str01.find_first_of(str05, 0); 120 VERIFY( csz01 == 1 ); 121 csz01 = str01.find_first_of(str05, 4); 122 VERIFY( csz01 == 4 ); 123 124 // An empty string_view consists of no characters 125 // therefore it should be found at every point in a string_view, 126 // except beyond the end 127 // However, str1.find_first_of(str2,pos) finds the first character in 128 // str1 (starting at pos) that exists in str2, which is none for empty str2 129 csz01 = str01.find_first_of(str04, 0); 130 VERIFY( csz01 == npos ); 131 csz01 = str01.find_first_of(str04, 5); 132 VERIFY( csz01 == npos ); 133 134 // size_type find_first_of(const char* s, size_type pos, size_type n) const; 135 csz01 = str01.find_first_of(str_lit01, 0, 3); 136 VERIFY( csz01 == 0 ); 137 csz01 = str01.find_first_of(str_lit01, 3, 0); 138 VERIFY( csz01 == npos ); 139 140 // size_type find_first_of(const char* s, size_type pos = 0) const; 141 csz01 = str01.find_first_of(str_lit01); 142 VERIFY( csz01 == 0 ); 143 csz01 = str01.find_first_of(str_lit01, 3); 144 VERIFY( csz01 == 3 ); 145 146 // size_type find_first_of(char c, size_type pos = 0) const; 147 csz01 = str01.find_first_of('z'); 148 csz02 = str01.size() - 1; 149 VERIFY( csz01 == csz02 ); 150 151 return true; 152} 153#endif 154 155static int 156main () 157{ 158 test02(); 159#ifndef GDB_STRING_VIEW 160 static_assert( test03() ); 161#endif 162 163 return 0; 164} 165 166} // namespace operations_find_2 { 167