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 |   |
41 | namespace 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 | |