1// { dg-options "-std=gnu++17" } 2 3// Copyright (C) 2013-2020 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 22#include <string_view> 23#include <testsuite_hooks.h> 24 25void 26test02() 27{ 28 typedef std::wstring_view::size_type csize_type; 29 csize_type npos = std::wstring_view::npos; 30 csize_type csz01, csz02; 31 32 const wchar_t str_lit01[] = L"mave"; 33 const std::wstring_view str01(L"mavericks, santa cruz"); 34 std::wstring_view str02(str_lit01); 35 std::wstring_view str03(L"s, s"); 36 std::wstring_view str04; 37 38 // size_type find_first_of(const wstring_view&, size_type pos = 0) const; 39 std::wstring_view str05(L"xena rulez"); 40 csz01 = str01.find_first_of(str01); 41 VERIFY( csz01 == 0 ); 42 csz01 = str01.find_first_of(str01, 4); 43 VERIFY( csz01 == 4 ); 44 csz01 = str01.find_first_of(str02, 0); 45 VERIFY( csz01 == 0 ); 46 csz01 = str01.find_first_of(str02, 3); 47 VERIFY( csz01 == 3 ); 48 csz01 = str01.find_first_of(str03, 0); 49 VERIFY( csz01 == 8 ); 50 csz01 = str01.find_first_of(str03, 3); 51 VERIFY( csz01 == 8 ); 52 csz01 = str01.find_first_of(str03, 12); 53 VERIFY( csz01 == 16 ); 54 csz01 = str01.find_first_of(str05, 0); 55 VERIFY( csz01 == 1 ); 56 csz01 = str01.find_first_of(str05, 4); 57 VERIFY( csz01 == 4 ); 58 59 // An empty string_view consists of no characters 60 // therefore it should be found at every point in a string_view, 61 // except beyond the end 62 // However, str1.find_first_of(str2,pos) finds the first character in 63 // str1 (starting at pos) that exists in str2, which is none for empty str2 64 csz01 = str01.find_first_of(str04, 0); 65 VERIFY( csz01 == npos ); 66 csz01 = str01.find_first_of(str04, 5); 67 VERIFY( csz01 == npos ); 68 69 // size_type find_first_of(const wchar_t* s, size_type pos, size_type n) const; 70 csz01 = str01.find_first_of(str_lit01, 0, 3); 71 VERIFY( csz01 == 0 ); 72 csz01 = str01.find_first_of(str_lit01, 3, 0); 73 VERIFY( csz01 == npos ); 74 75 // size_type find_first_of(const wchar_t* s, size_type pos = 0) const; 76 csz01 = str01.find_first_of(str_lit01); 77 VERIFY( csz01 == 0 ); 78 csz01 = str01.find_first_of(str_lit01, 3); 79 VERIFY( csz01 == 3 ); 80 81 // size_type find_first_of(wchar_t c, size_type pos = 0) const; 82 csz01 = str01.find_first_of(L'z'); 83 csz02 = str01.size() - 1; 84 VERIFY( csz01 == csz02 ); 85} 86 87constexpr bool 88test04() 89{ 90 typedef std::wstring_view::size_type csize_type; 91 csize_type npos = std::wstring_view::npos; 92 csize_type csz01 = 0, csz02 = 0; 93 94 const wchar_t str_lit01[] = L"mave"; 95 const std::wstring_view str01(L"mavericks, santa cruz"); 96 std::wstring_view str02(str_lit01); 97 std::wstring_view str03(L"s, s"); 98 std::wstring_view str04; 99 100#undef VERIFY 101#define VERIFY(x) if(!(x)) return false 102 103 // size_type find_first_of(const wstring_view&, size_type pos = 0) const; 104 std::wstring_view str05(L"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 wchar_t* 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 wchar_t* 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(wchar_t c, size_type pos = 0) const; 147 csz01 = str01.find_first_of(L'z'); 148 csz02 = str01.size() - 1; 149 VERIFY( csz01 == csz02 ); 150 151 return true; 152} 153 154int 155main() 156{ 157 test02(); 158 static_assert( test04() ); 159 160 return 0; 161} 162