1// Components for manipulating non-owning sequences of characters -*- C++ -*- 
2 
3// Copyright (C) 2013-2019 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// Under Section 7 of GPL version 3, you are granted additional 
17// permissions described in the GCC Runtime Library Exception, version 
18// 3.1, as published by the Free Software Foundation. 
19 
20// You should have received a copy of the GNU General Public License and 
21// a copy of the GCC Runtime Library Exception along with this program; 
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 
23// <http://www.gnu.org/licenses/>. 
24 
25/** @file include/bits/string_view.tcc 
26 * This is an internal header file, included by other library headers. 
27 * Do not attempt to use it directly. @headername{string_view} 
28 */ 
29 
30// 
31// N3762 basic_string_view library 
32// 
33 
34#ifndef _GLIBCXX_STRING_VIEW_TCC 
35#define _GLIBCXX_STRING_VIEW_TCC 1 
36 
37#pragma GCC system_header 
38 
39#if __cplusplus >= 201703L 
40 
41namespace std _GLIBCXX_VISIBILITY(default) 
42{ 
43_GLIBCXX_BEGIN_NAMESPACE_VERSION 
44 
45 template<typename _CharT, typename _Traits> 
46 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
47 basic_string_view<_CharT, _Traits>:: 
48 find(const _CharT* __str, size_type __pos, size_type __n) const noexcept 
49 { 
50 __glibcxx_requires_string_len(__str, __n); 
51 
52 if (__n == 0) 
53 return __pos <= this->_M_len ? __pos : npos; 
54 
55 if (__n <= this->_M_len) 
56 { 
57 for (; __pos <= this->_M_len - __n; ++__pos) 
58 if (traits_type::eq(this->_M_str[__pos], __str[0]) 
59 && traits_type::compare(this->_M_str + __pos + 1, 
60 __str + 1, __n - 1) == 0) 
61 return __pos; 
62 } 
63 return npos; 
64 } 
65 
66 template<typename _CharT, typename _Traits> 
67 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
68 basic_string_view<_CharT, _Traits>:: 
69 find(_CharT __c, size_type __pos) const noexcept 
70 { 
71 size_type __ret = npos; 
72 if (__pos < this->_M_len) 
73 { 
74 const size_type __n = this->_M_len - __pos; 
75 const _CharT* __p = traits_type::find(this->_M_str + __pos, __n, __c); 
76 if (__p) 
77 __ret = __p - this->_M_str; 
78 } 
79 return __ret; 
80 } 
81 
82 template<typename _CharT, typename _Traits> 
83 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
84 basic_string_view<_CharT, _Traits>:: 
85 rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept 
86 { 
87 __glibcxx_requires_string_len(__str, __n); 
88 
89 if (__n <= this->_M_len) 
90 { 
91 __pos = std::min(size_type(this->_M_len - __n), __pos); 
92 do 
93 { 
94 if (traits_type::compare(this->_M_str + __pos, __str, __n) == 0) 
95 return __pos; 
96 } 
97 while (__pos-- > 0); 
98 } 
99 return npos; 
100 } 
101 
102 template<typename _CharT, typename _Traits> 
103 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
104 basic_string_view<_CharT, _Traits>:: 
105 rfind(_CharT __c, size_type __pos) const noexcept 
106 { 
107 size_type __size = this->_M_len; 
108 if (__size > 0) 
109 { 
110 if (--__size > __pos) 
111 __size = __pos; 
112 for (++__size; __size-- > 0; ) 
113 if (traits_type::eq(this->_M_str[__size], __c)) 
114 return __size; 
115 } 
116 return npos; 
117 } 
118 
119 template<typename _CharT, typename _Traits> 
120 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
121 basic_string_view<_CharT, _Traits>:: 
122 find_first_of(const _CharT* __str, size_type __pos, 
123 size_type __n) const noexcept 
124 { 
125 __glibcxx_requires_string_len(__str, __n); 
126 for (; __n && __pos < this->_M_len; ++__pos) 
127 { 
128 const _CharT* __p = traits_type::find(__str, __n, 
129 this->_M_str[__pos]); 
130 if (__p) 
131 return __pos; 
132 } 
133 return npos; 
134 } 
135 
136 template<typename _CharT, typename _Traits> 
137 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
138 basic_string_view<_CharT, _Traits>:: 
139 find_last_of(const _CharT* __str, size_type __pos, 
140 size_type __n) const noexcept 
141 { 
142 __glibcxx_requires_string_len(__str, __n); 
143 size_type __size = this->size(); 
144 if (__size && __n) 
145 { 
146 if (--__size > __pos) 
147 __size = __pos; 
148 do 
149 { 
150 if (traits_type::find(__str, __n, this->_M_str[__size])) 
151 return __size; 
152 } 
153 while (__size-- != 0); 
154 } 
155 return npos; 
156 } 
157 
158 template<typename _CharT, typename _Traits> 
159 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
160 basic_string_view<_CharT, _Traits>:: 
161 find_first_not_of(const _CharT* __str, size_type __pos, 
162 size_type __n) const noexcept 
163 { 
164 __glibcxx_requires_string_len(__str, __n); 
165 for (; __pos < this->_M_len; ++__pos) 
166 if (!traits_type::find(__str, __n, this->_M_str[__pos])) 
167 return __pos; 
168 return npos; 
169 } 
170 
171 template<typename _CharT, typename _Traits> 
172 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
173 basic_string_view<_CharT, _Traits>:: 
174 find_first_not_of(_CharT __c, size_type __pos) const noexcept 
175 { 
176 for (; __pos < this->_M_len; ++__pos) 
177 if (!traits_type::eq(this->_M_str[__pos], __c)) 
178 return __pos; 
179 return npos; 
180 } 
181 
182 template<typename _CharT, typename _Traits> 
183 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
184 basic_string_view<_CharT, _Traits>:: 
185 find_last_not_of(const _CharT* __str, size_type __pos, 
186 size_type __n) const noexcept 
187 { 
188 __glibcxx_requires_string_len(__str, __n); 
189 size_type __size = this->_M_len; 
190 if (__size) 
191 { 
192 if (--__size > __pos) 
193 __size = __pos; 
194 do 
195 { 
196 if (!traits_type::find(__str, __n, this->_M_str[__size])) 
197 return __size; 
198 } 
199 while (__size--); 
200 } 
201 return npos; 
202 } 
203 
204 template<typename _CharT, typename _Traits> 
205 constexpr typename basic_string_view<_CharT, _Traits>::size_type 
206 basic_string_view<_CharT, _Traits>:: 
207 find_last_not_of(_CharT __c, size_type __pos) const noexcept 
208 { 
209 size_type __size = this->_M_len; 
210 if (__size) 
211 { 
212 if (--__size > __pos) 
213 __size = __pos; 
214 do 
215 { 
216 if (!traits_type::eq(this->_M_str[__size], __c)) 
217 return __size; 
218 } 
219 while (__size--); 
220 } 
221 return npos; 
222 } 
223 
224_GLIBCXX_END_NAMESPACE_VERSION 
225} // namespace std 
226 
227#endif // __cplusplus <= 201402L 
228 
229#endif // _GLIBCXX_STRING_VIEW_TCC 
230