xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/experimental/bits/string_view.tcc (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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