136ac495dSmrg // Components for manipulating non-owning sequences of characters -*- C++ -*- 236ac495dSmrg 3*8feb0f0bSmrg // Copyright (C) 2013-2020 Free Software Foundation, Inc. 436ac495dSmrg // 536ac495dSmrg // This file is part of the GNU ISO C++ Library. This library is free 636ac495dSmrg // software; you can redistribute it and/or modify it under the 736ac495dSmrg // terms of the GNU General Public License as published by the 836ac495dSmrg // Free Software Foundation; either version 3, or (at your option) 936ac495dSmrg // any later version. 1036ac495dSmrg 1136ac495dSmrg // This library is distributed in the hope that it will be useful, 1236ac495dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 1336ac495dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1436ac495dSmrg // GNU General Public License for more details. 1536ac495dSmrg 1636ac495dSmrg // Under Section 7 of GPL version 3, you are granted additional 1736ac495dSmrg // permissions described in the GCC Runtime Library Exception, version 1836ac495dSmrg // 3.1, as published by the Free Software Foundation. 1936ac495dSmrg 2036ac495dSmrg // You should have received a copy of the GNU General Public License and 2136ac495dSmrg // a copy of the GCC Runtime Library Exception along with this program; 2236ac495dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2336ac495dSmrg // <http://www.gnu.org/licenses/>. 2436ac495dSmrg 2536ac495dSmrg /** @file experimental/bits/string_view.tcc 2636ac495dSmrg * This is an internal header file, included by other library headers. 2736ac495dSmrg * Do not attempt to use it directly. @headername{experimental/string_view} 2836ac495dSmrg */ 2936ac495dSmrg 3036ac495dSmrg // 3136ac495dSmrg // N3762 basic_string_view library 3236ac495dSmrg // 3336ac495dSmrg 3436ac495dSmrg #ifndef _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC 3536ac495dSmrg #define _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC 1 3636ac495dSmrg 3736ac495dSmrg #pragma GCC system_header 3836ac495dSmrg 3936ac495dSmrg #if __cplusplus >= 201402L 4036ac495dSmrg 4136ac495dSmrg namespace std _GLIBCXX_VISIBILITY(default) 4236ac495dSmrg { 43a2dc1f3fSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 44a2dc1f3fSmrg 4536ac495dSmrg namespace experimental 4636ac495dSmrg { 4736ac495dSmrg inline namespace fundamentals_v1 4836ac495dSmrg { 4936ac495dSmrg template<typename _CharT, typename _Traits> 5036ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 5136ac495dSmrg basic_string_view<_CharT, _Traits>:: find(const _CharT * __str,size_type __pos,size_type __n) const5236ac495dSmrg find(const _CharT* __str, size_type __pos, size_type __n) const noexcept 5336ac495dSmrg { 5436ac495dSmrg __glibcxx_requires_string_len(__str, __n); 5536ac495dSmrg 5636ac495dSmrg if (__n == 0) 5736ac495dSmrg return __pos <= this->_M_len ? __pos : npos; 5836ac495dSmrg 5936ac495dSmrg if (__n <= this->_M_len) 6036ac495dSmrg { 6136ac495dSmrg for (; __pos <= this->_M_len - __n; ++__pos) 6236ac495dSmrg if (traits_type::eq(this->_M_str[__pos], __str[0]) 6336ac495dSmrg && traits_type::compare(this->_M_str + __pos + 1, 6436ac495dSmrg __str + 1, __n - 1) == 0) 6536ac495dSmrg return __pos; 6636ac495dSmrg } 6736ac495dSmrg return npos; 6836ac495dSmrg } 6936ac495dSmrg 7036ac495dSmrg template<typename _CharT, typename _Traits> 7136ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 7236ac495dSmrg basic_string_view<_CharT, _Traits>:: find(_CharT __c,size_type __pos) const7336ac495dSmrg find(_CharT __c, size_type __pos) const noexcept 7436ac495dSmrg { 7536ac495dSmrg size_type __ret = npos; 7636ac495dSmrg if (__pos < this->_M_len) 7736ac495dSmrg { 7836ac495dSmrg const size_type __n = this->_M_len - __pos; 7936ac495dSmrg const _CharT* __p = traits_type::find(this->_M_str + __pos, __n, __c); 8036ac495dSmrg if (__p) 8136ac495dSmrg __ret = __p - this->_M_str; 8236ac495dSmrg } 8336ac495dSmrg return __ret; 8436ac495dSmrg } 8536ac495dSmrg 8636ac495dSmrg template<typename _CharT, typename _Traits> 8736ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 8836ac495dSmrg basic_string_view<_CharT, _Traits>:: rfind(const _CharT * __str,size_type __pos,size_type __n) const8936ac495dSmrg rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept 9036ac495dSmrg { 9136ac495dSmrg __glibcxx_requires_string_len(__str, __n); 9236ac495dSmrg 9336ac495dSmrg if (__n <= this->_M_len) 9436ac495dSmrg { 9536ac495dSmrg __pos = std::min(size_type(this->_M_len - __n), __pos); 9636ac495dSmrg do 9736ac495dSmrg { 9836ac495dSmrg if (traits_type::compare(this->_M_str + __pos, __str, __n) == 0) 9936ac495dSmrg return __pos; 10036ac495dSmrg } 10136ac495dSmrg while (__pos-- > 0); 10236ac495dSmrg } 10336ac495dSmrg return npos; 10436ac495dSmrg } 10536ac495dSmrg 10636ac495dSmrg template<typename _CharT, typename _Traits> 10736ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 10836ac495dSmrg basic_string_view<_CharT, _Traits>:: rfind(_CharT __c,size_type __pos) const10936ac495dSmrg rfind(_CharT __c, size_type __pos) const noexcept 11036ac495dSmrg { 11136ac495dSmrg size_type __size = this->_M_len; 11236ac495dSmrg if (__size > 0) 11336ac495dSmrg { 11436ac495dSmrg if (--__size > __pos) 11536ac495dSmrg __size = __pos; 11636ac495dSmrg for (++__size; __size-- > 0; ) 11736ac495dSmrg if (traits_type::eq(this->_M_str[__size], __c)) 11836ac495dSmrg return __size; 11936ac495dSmrg } 12036ac495dSmrg return npos; 12136ac495dSmrg } 12236ac495dSmrg 12336ac495dSmrg template<typename _CharT, typename _Traits> 12436ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 12536ac495dSmrg basic_string_view<_CharT, _Traits>:: find_first_of(const _CharT * __str,size_type __pos,size_type __n) const12636ac495dSmrg find_first_of(const _CharT* __str, size_type __pos, size_type __n) const 12736ac495dSmrg { 12836ac495dSmrg __glibcxx_requires_string_len(__str, __n); 12936ac495dSmrg for (; __n && __pos < this->_M_len; ++__pos) 13036ac495dSmrg { 13136ac495dSmrg const _CharT* __p = traits_type::find(__str, __n, 13236ac495dSmrg this->_M_str[__pos]); 13336ac495dSmrg if (__p) 13436ac495dSmrg return __pos; 13536ac495dSmrg } 13636ac495dSmrg return npos; 13736ac495dSmrg } 13836ac495dSmrg 13936ac495dSmrg template<typename _CharT, typename _Traits> 14036ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 14136ac495dSmrg basic_string_view<_CharT, _Traits>:: find_last_of(const _CharT * __str,size_type __pos,size_type __n) const14236ac495dSmrg find_last_of(const _CharT* __str, size_type __pos, size_type __n) const 14336ac495dSmrg { 14436ac495dSmrg __glibcxx_requires_string_len(__str, __n); 14536ac495dSmrg size_type __size = this->size(); 14636ac495dSmrg if (__size && __n) 14736ac495dSmrg { 14836ac495dSmrg if (--__size > __pos) 14936ac495dSmrg __size = __pos; 15036ac495dSmrg do 15136ac495dSmrg { 15236ac495dSmrg if (traits_type::find(__str, __n, this->_M_str[__size])) 15336ac495dSmrg return __size; 15436ac495dSmrg } 15536ac495dSmrg while (__size-- != 0); 15636ac495dSmrg } 15736ac495dSmrg return npos; 15836ac495dSmrg } 15936ac495dSmrg 16036ac495dSmrg template<typename _CharT, typename _Traits> 16136ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 16236ac495dSmrg basic_string_view<_CharT, _Traits>:: find_first_not_of(const _CharT * __str,size_type __pos,size_type __n) const16336ac495dSmrg find_first_not_of(const _CharT* __str, size_type __pos, size_type __n) const 16436ac495dSmrg { 16536ac495dSmrg __glibcxx_requires_string_len(__str, __n); 16636ac495dSmrg for (; __pos < this->_M_len; ++__pos) 16736ac495dSmrg if (!traits_type::find(__str, __n, this->_M_str[__pos])) 16836ac495dSmrg return __pos; 16936ac495dSmrg return npos; 17036ac495dSmrg } 17136ac495dSmrg 17236ac495dSmrg template<typename _CharT, typename _Traits> 17336ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 17436ac495dSmrg basic_string_view<_CharT, _Traits>:: find_first_not_of(_CharT __c,size_type __pos) const17536ac495dSmrg find_first_not_of(_CharT __c, size_type __pos) const noexcept 17636ac495dSmrg { 17736ac495dSmrg for (; __pos < this->_M_len; ++__pos) 17836ac495dSmrg if (!traits_type::eq(this->_M_str[__pos], __c)) 17936ac495dSmrg return __pos; 18036ac495dSmrg return npos; 18136ac495dSmrg } 18236ac495dSmrg 18336ac495dSmrg template<typename _CharT, typename _Traits> 18436ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 18536ac495dSmrg basic_string_view<_CharT, _Traits>:: find_last_not_of(const _CharT * __str,size_type __pos,size_type __n) const18636ac495dSmrg find_last_not_of(const _CharT* __str, size_type __pos, size_type __n) const 18736ac495dSmrg { 18836ac495dSmrg __glibcxx_requires_string_len(__str, __n); 18936ac495dSmrg size_type __size = this->_M_len; 19036ac495dSmrg if (__size) 19136ac495dSmrg { 19236ac495dSmrg if (--__size > __pos) 19336ac495dSmrg __size = __pos; 19436ac495dSmrg do 19536ac495dSmrg { 19636ac495dSmrg if (!traits_type::find(__str, __n, this->_M_str[__size])) 19736ac495dSmrg return __size; 19836ac495dSmrg } 19936ac495dSmrg while (__size--); 20036ac495dSmrg } 20136ac495dSmrg return npos; 20236ac495dSmrg } 20336ac495dSmrg 20436ac495dSmrg template<typename _CharT, typename _Traits> 20536ac495dSmrg constexpr typename basic_string_view<_CharT, _Traits>::size_type 20636ac495dSmrg basic_string_view<_CharT, _Traits>:: find_last_not_of(_CharT __c,size_type __pos) const20736ac495dSmrg find_last_not_of(_CharT __c, size_type __pos) const noexcept 20836ac495dSmrg { 20936ac495dSmrg size_type __size = this->_M_len; 21036ac495dSmrg if (__size) 21136ac495dSmrg { 21236ac495dSmrg if (--__size > __pos) 21336ac495dSmrg __size = __pos; 21436ac495dSmrg do 21536ac495dSmrg { 21636ac495dSmrg if (!traits_type::eq(this->_M_str[__size], __c)) 21736ac495dSmrg return __size; 21836ac495dSmrg } 21936ac495dSmrg while (__size--); 22036ac495dSmrg } 22136ac495dSmrg return npos; 22236ac495dSmrg } 22336ac495dSmrg } // namespace fundamentals_v1 22436ac495dSmrg } // namespace experimental 225a2dc1f3fSmrg 226a2dc1f3fSmrg _GLIBCXX_END_NAMESPACE_VERSION 22736ac495dSmrg } // namespace std 22836ac495dSmrg 22936ac495dSmrg #endif // __cplusplus <= 201103L 23036ac495dSmrg 23136ac495dSmrg #endif // _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC 232