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