1    	// Components for manipulating non-owning sequences of characters -*- C++ -*-
2    	
3    	// Copyright (C) 2013-2017 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 experimental/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{experimental/string_view}
28   	 */
29   	
30   	//
31   	// N3762 basic_string_view library
32   	//
33   	
34   	#ifndef _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC
35   	#define _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC 1
36   	
37   	#pragma GCC system_header
38   	
39   	#if __cplusplus >= 201402L
40   	
41   	namespace std _GLIBCXX_VISIBILITY(default)
42   	{
43   	namespace experimental
44   	{
45   	inline namespace fundamentals_v1
46   	{
47   	_GLIBCXX_BEGIN_NAMESPACE_VERSION
48   	
49   	  template<typename _CharT, typename _Traits>
50   	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
51   	    basic_string_view<_CharT, _Traits>::
52   	    find(const _CharT* __str, size_type __pos, size_type __n) const noexcept
53   	    {
54   	      __glibcxx_requires_string_len(__str, __n);
55   	
56   	      if (__n == 0)
57   		return __pos <= this->_M_len ? __pos : npos;
58   	
59   	      if (__n <= this->_M_len)
60   		{
61   		  for (; __pos <= this->_M_len - __n; ++__pos)
62   		    if (traits_type::eq(this->_M_str[__pos], __str[0])
63   			&& traits_type::compare(this->_M_str + __pos + 1,
64   						__str + 1, __n - 1) == 0)
65   		      return __pos;
66   		}
67   	      return npos;
68   	    }
69   	
70   	  template<typename _CharT, typename _Traits>
71   	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
72   	    basic_string_view<_CharT, _Traits>::
73   	    find(_CharT __c, size_type __pos) const noexcept
74   	    {
75   	      size_type __ret = npos;
76   	      if (__pos < this->_M_len)
77   		{
78   		  const size_type __n = this->_M_len - __pos;
79   		  const _CharT* __p = traits_type::find(this->_M_str + __pos, __n, __c);
80   		  if (__p)
81   		    __ret = __p - this->_M_str;
82   		}
83   	      return __ret;
84   	    }
85   	
86   	  template<typename _CharT, typename _Traits>
87   	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
88   	    basic_string_view<_CharT, _Traits>::
89   	    rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept
90   	    {
91   	      __glibcxx_requires_string_len(__str, __n);
92   	
93   	      if (__n <= this->_M_len)
94   		{
95   		  __pos = std::min(size_type(this->_M_len - __n), __pos);
96   		  do
97   		    {
98   		      if (traits_type::compare(this->_M_str + __pos, __str, __n) == 0)
99   			return __pos;
100  		    }
101  		  while (__pos-- > 0);
102  		}
103  	      return npos;
104  	    }
105  	
106  	  template<typename _CharT, typename _Traits>
107  	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
108  	    basic_string_view<_CharT, _Traits>::
109  	    rfind(_CharT __c, size_type __pos) const noexcept
110  	    {
111  	      size_type __size = this->_M_len;
112  	      if (__size > 0)
113  		{
114  		  if (--__size > __pos)
115  		    __size = __pos;
116  		  for (++__size; __size-- > 0; )
117  		    if (traits_type::eq(this->_M_str[__size], __c))
118  		      return __size;
119  		}
120  	      return npos;
121  	    }
122  	
123  	  template<typename _CharT, typename _Traits>
124  	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
125  	    basic_string_view<_CharT, _Traits>::
126  	    find_first_of(const _CharT* __str, size_type __pos, size_type __n) const
127  	    {
128  	      __glibcxx_requires_string_len(__str, __n);
129  	      for (; __n && __pos < this->_M_len; ++__pos)
130  		{
131  		  const _CharT* __p = traits_type::find(__str, __n,
132  							this->_M_str[__pos]);
133  		  if (__p)
134  		    return __pos;
135  		}
136  	      return npos;
137  	    }
138  	
139  	  template<typename _CharT, typename _Traits>
140  	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
141  	    basic_string_view<_CharT, _Traits>::
142  	    find_last_of(const _CharT* __str, size_type __pos, size_type __n) const
143  	    {
144  	      __glibcxx_requires_string_len(__str, __n);
145  	      size_type __size = this->size();
146  	      if (__size && __n)
147  		{
148  		  if (--__size > __pos)
149  		    __size = __pos;
150  		  do
151  		    {
152  		      if (traits_type::find(__str, __n, this->_M_str[__size]))
153  			return __size;
154  		    }
155  		  while (__size-- != 0);
156  		}
157  	      return npos;
158  	    }
159  	
160  	  template<typename _CharT, typename _Traits>
161  	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
162  	    basic_string_view<_CharT, _Traits>::
163  	    find_first_not_of(const _CharT* __str, size_type __pos, size_type __n) const
164  	    {
165  	      __glibcxx_requires_string_len(__str, __n);
166  	      for (; __pos < this->_M_len; ++__pos)
167  		if (!traits_type::find(__str, __n, this->_M_str[__pos]))
168  		  return __pos;
169  	      return npos;
170  	    }
171  	
172  	  template<typename _CharT, typename _Traits>
173  	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
174  	    basic_string_view<_CharT, _Traits>::
175  	    find_first_not_of(_CharT __c, size_type __pos) const noexcept
176  	    {
177  	      for (; __pos < this->_M_len; ++__pos)
178  		if (!traits_type::eq(this->_M_str[__pos], __c))
179  		  return __pos;
180  	      return npos;
181  	    }
182  	
183  	  template<typename _CharT, typename _Traits>
184  	    constexpr typename basic_string_view<_CharT, _Traits>::size_type
185  	    basic_string_view<_CharT, _Traits>::
186  	    find_last_not_of(const _CharT* __str, size_type __pos, size_type __n) const
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 fundamentals_v1
226  	} // namespace experimental
227  	} // namespace std
228  	
229  	#endif // __cplusplus <= 201103L
230  	
231  	#endif // _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC
232