1*38fd1498Szrj // Versatile string -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2005-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj /** @file ext/vstring.tcc 26*38fd1498Szrj * This is an internal header file, included by other library headers. 27*38fd1498Szrj * Do not attempt to use it directly. @headername{ext/vstring.h} 28*38fd1498Szrj */ 29*38fd1498Szrj 30*38fd1498Szrj #ifndef _VSTRING_TCC 31*38fd1498Szrj #define _VSTRING_TCC 1 32*38fd1498Szrj 33*38fd1498Szrj #pragma GCC system_header 34*38fd1498Szrj 35*38fd1498Szrj #include <bits/cxxabi_forced.h> 36*38fd1498Szrj 37*38fd1498Szrj namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 38*38fd1498Szrj { 39*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION 40*38fd1498Szrj 41*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 42*38fd1498Szrj template <typename, typename, typename> class _Base> 43*38fd1498Szrj const typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 44*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>::npos; 45*38fd1498Szrj 46*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 47*38fd1498Szrj template <typename, typename, typename> class _Base> 48*38fd1498Szrj void 49*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: resize(size_type __n,_CharT __c)50*38fd1498Szrj resize(size_type __n, _CharT __c) 51*38fd1498Szrj { 52*38fd1498Szrj const size_type __size = this->size(); 53*38fd1498Szrj if (__size < __n) 54*38fd1498Szrj this->append(__n - __size, __c); 55*38fd1498Szrj else if (__n < __size) 56*38fd1498Szrj this->_M_erase(__n, __size - __n); 57*38fd1498Szrj } 58*38fd1498Szrj 59*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 60*38fd1498Szrj template <typename, typename, typename> class _Base> 61*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>& 62*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: _M_append(const _CharT * __s,size_type __n)63*38fd1498Szrj _M_append(const _CharT* __s, size_type __n) 64*38fd1498Szrj { 65*38fd1498Szrj const size_type __len = __n + this->size(); 66*38fd1498Szrj 67*38fd1498Szrj if (__len <= this->capacity() && !this->_M_is_shared()) 68*38fd1498Szrj { 69*38fd1498Szrj if (__n) 70*38fd1498Szrj this->_S_copy(this->_M_data() + this->size(), __s, __n); 71*38fd1498Szrj } 72*38fd1498Szrj else 73*38fd1498Szrj this->_M_mutate(this->size(), size_type(0), __s, __n); 74*38fd1498Szrj 75*38fd1498Szrj this->_M_set_length(__len); 76*38fd1498Szrj return *this; 77*38fd1498Szrj } 78*38fd1498Szrj 79*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 80*38fd1498Szrj template <typename, typename, typename> class _Base> 81*38fd1498Szrj template<typename _InputIterator> 82*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>& 83*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: _M_replace_dispatch(const_iterator __i1,const_iterator __i2,_InputIterator __k1,_InputIterator __k2,std::__false_type)84*38fd1498Szrj _M_replace_dispatch(const_iterator __i1, const_iterator __i2, 85*38fd1498Szrj _InputIterator __k1, _InputIterator __k2, 86*38fd1498Szrj std::__false_type) 87*38fd1498Szrj { 88*38fd1498Szrj const __versa_string __s(__k1, __k2); 89*38fd1498Szrj const size_type __n1 = __i2 - __i1; 90*38fd1498Szrj return _M_replace(__i1 - _M_ibegin(), __n1, __s._M_data(), 91*38fd1498Szrj __s.size()); 92*38fd1498Szrj } 93*38fd1498Szrj 94*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 95*38fd1498Szrj template <typename, typename, typename> class _Base> 96*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>& 97*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: _M_replace_aux(size_type __pos1,size_type __n1,size_type __n2,_CharT __c)98*38fd1498Szrj _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2, 99*38fd1498Szrj _CharT __c) 100*38fd1498Szrj { 101*38fd1498Szrj _M_check_length(__n1, __n2, "__versa_string::_M_replace_aux"); 102*38fd1498Szrj 103*38fd1498Szrj const size_type __old_size = this->size(); 104*38fd1498Szrj const size_type __new_size = __old_size + __n2 - __n1; 105*38fd1498Szrj 106*38fd1498Szrj if (__new_size <= this->capacity() && !this->_M_is_shared()) 107*38fd1498Szrj { 108*38fd1498Szrj _CharT* __p = this->_M_data() + __pos1; 109*38fd1498Szrj 110*38fd1498Szrj const size_type __how_much = __old_size - __pos1 - __n1; 111*38fd1498Szrj if (__how_much && __n1 != __n2) 112*38fd1498Szrj this->_S_move(__p + __n2, __p + __n1, __how_much); 113*38fd1498Szrj } 114*38fd1498Szrj else 115*38fd1498Szrj this->_M_mutate(__pos1, __n1, 0, __n2); 116*38fd1498Szrj 117*38fd1498Szrj if (__n2) 118*38fd1498Szrj this->_S_assign(this->_M_data() + __pos1, __n2, __c); 119*38fd1498Szrj 120*38fd1498Szrj this->_M_set_length(__new_size); 121*38fd1498Szrj return *this; 122*38fd1498Szrj } 123*38fd1498Szrj 124*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 125*38fd1498Szrj template <typename, typename, typename> class _Base> 126*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>& 127*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: _M_replace(size_type __pos,size_type __len1,const _CharT * __s,const size_type __len2)128*38fd1498Szrj _M_replace(size_type __pos, size_type __len1, const _CharT* __s, 129*38fd1498Szrj const size_type __len2) 130*38fd1498Szrj { 131*38fd1498Szrj _M_check_length(__len1, __len2, "__versa_string::_M_replace"); 132*38fd1498Szrj 133*38fd1498Szrj const size_type __old_size = this->size(); 134*38fd1498Szrj const size_type __new_size = __old_size + __len2 - __len1; 135*38fd1498Szrj 136*38fd1498Szrj if (__new_size <= this->capacity() && !this->_M_is_shared()) 137*38fd1498Szrj { 138*38fd1498Szrj _CharT* __p = this->_M_data() + __pos; 139*38fd1498Szrj 140*38fd1498Szrj const size_type __how_much = __old_size - __pos - __len1; 141*38fd1498Szrj if (_M_disjunct(__s)) 142*38fd1498Szrj { 143*38fd1498Szrj if (__how_much && __len1 != __len2) 144*38fd1498Szrj this->_S_move(__p + __len2, __p + __len1, __how_much); 145*38fd1498Szrj if (__len2) 146*38fd1498Szrj this->_S_copy(__p, __s, __len2); 147*38fd1498Szrj } 148*38fd1498Szrj else 149*38fd1498Szrj { 150*38fd1498Szrj // Work in-place. 151*38fd1498Szrj if (__len2 && __len2 <= __len1) 152*38fd1498Szrj this->_S_move(__p, __s, __len2); 153*38fd1498Szrj if (__how_much && __len1 != __len2) 154*38fd1498Szrj this->_S_move(__p + __len2, __p + __len1, __how_much); 155*38fd1498Szrj if (__len2 > __len1) 156*38fd1498Szrj { 157*38fd1498Szrj if (__s + __len2 <= __p + __len1) 158*38fd1498Szrj this->_S_move(__p, __s, __len2); 159*38fd1498Szrj else if (__s >= __p + __len1) 160*38fd1498Szrj this->_S_copy(__p, __s + __len2 - __len1, __len2); 161*38fd1498Szrj else 162*38fd1498Szrj { 163*38fd1498Szrj const size_type __nleft = (__p + __len1) - __s; 164*38fd1498Szrj this->_S_move(__p, __s, __nleft); 165*38fd1498Szrj this->_S_copy(__p + __nleft, __p + __len2, 166*38fd1498Szrj __len2 - __nleft); 167*38fd1498Szrj } 168*38fd1498Szrj } 169*38fd1498Szrj } 170*38fd1498Szrj } 171*38fd1498Szrj else 172*38fd1498Szrj this->_M_mutate(__pos, __len1, __s, __len2); 173*38fd1498Szrj 174*38fd1498Szrj this->_M_set_length(__new_size); 175*38fd1498Szrj return *this; 176*38fd1498Szrj } 177*38fd1498Szrj 178*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 179*38fd1498Szrj template <typename, typename, typename> class _Base> 180*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)181*38fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 182*38fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 183*38fd1498Szrj { 184*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> __str; 185*38fd1498Szrj __str.reserve(__lhs.size() + __rhs.size()); 186*38fd1498Szrj __str.append(__lhs); 187*38fd1498Szrj __str.append(__rhs); 188*38fd1498Szrj return __str; 189*38fd1498Szrj } 190*38fd1498Szrj 191*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 192*38fd1498Szrj template <typename, typename, typename> class _Base> 193*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> operator +(const _CharT * __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)194*38fd1498Szrj operator+(const _CharT* __lhs, 195*38fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 196*38fd1498Szrj { 197*38fd1498Szrj __glibcxx_requires_string(__lhs); 198*38fd1498Szrj typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type; 199*38fd1498Szrj typedef typename __string_type::size_type __size_type; 200*38fd1498Szrj const __size_type __len = _Traits::length(__lhs); 201*38fd1498Szrj __string_type __str; 202*38fd1498Szrj __str.reserve(__len + __rhs.size()); 203*38fd1498Szrj __str.append(__lhs, __len); 204*38fd1498Szrj __str.append(__rhs); 205*38fd1498Szrj return __str; 206*38fd1498Szrj } 207*38fd1498Szrj 208*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 209*38fd1498Szrj template <typename, typename, typename> class _Base> 210*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> operator +(_CharT __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)211*38fd1498Szrj operator+(_CharT __lhs, 212*38fd1498Szrj const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs) 213*38fd1498Szrj { 214*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> __str; 215*38fd1498Szrj __str.reserve(__rhs.size() + 1); 216*38fd1498Szrj __str.push_back(__lhs); 217*38fd1498Szrj __str.append(__rhs); 218*38fd1498Szrj return __str; 219*38fd1498Szrj } 220*38fd1498Szrj 221*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 222*38fd1498Szrj template <typename, typename, typename> class _Base> 223*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,const _CharT * __rhs)224*38fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 225*38fd1498Szrj const _CharT* __rhs) 226*38fd1498Szrj { 227*38fd1498Szrj __glibcxx_requires_string(__rhs); 228*38fd1498Szrj typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type; 229*38fd1498Szrj typedef typename __string_type::size_type __size_type; 230*38fd1498Szrj const __size_type __len = _Traits::length(__rhs); 231*38fd1498Szrj __string_type __str; 232*38fd1498Szrj __str.reserve(__lhs.size() + __len); 233*38fd1498Szrj __str.append(__lhs); 234*38fd1498Szrj __str.append(__rhs, __len); 235*38fd1498Szrj return __str; 236*38fd1498Szrj } 237*38fd1498Szrj 238*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 239*38fd1498Szrj template <typename, typename, typename> class _Base> 240*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,_CharT __rhs)241*38fd1498Szrj operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs, 242*38fd1498Szrj _CharT __rhs) 243*38fd1498Szrj { 244*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base> __str; 245*38fd1498Szrj __str.reserve(__lhs.size() + 1); 246*38fd1498Szrj __str.append(__lhs); 247*38fd1498Szrj __str.push_back(__rhs); 248*38fd1498Szrj return __str; 249*38fd1498Szrj } 250*38fd1498Szrj 251*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 252*38fd1498Szrj template <typename, typename, typename> class _Base> 253*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 254*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: copy(_CharT * __s,size_type __n,size_type __pos) const255*38fd1498Szrj copy(_CharT* __s, size_type __n, size_type __pos) const 256*38fd1498Szrj { 257*38fd1498Szrj _M_check(__pos, "__versa_string::copy"); 258*38fd1498Szrj __n = _M_limit(__pos, __n); 259*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 260*38fd1498Szrj if (__n) 261*38fd1498Szrj this->_S_copy(__s, this->_M_data() + __pos, __n); 262*38fd1498Szrj // 21.3.5.7 par 3: do not append null. (good.) 263*38fd1498Szrj return __n; 264*38fd1498Szrj } 265*38fd1498Szrj 266*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 267*38fd1498Szrj template <typename, typename, typename> class _Base> 268*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 269*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find(const _CharT * __s,size_type __pos,size_type __n) const270*38fd1498Szrj find(const _CharT* __s, size_type __pos, size_type __n) const 271*38fd1498Szrj { 272*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 273*38fd1498Szrj const size_type __size = this->size(); 274*38fd1498Szrj const _CharT* __data = this->_M_data(); 275*38fd1498Szrj 276*38fd1498Szrj if (__n == 0) 277*38fd1498Szrj return __pos <= __size ? __pos : npos; 278*38fd1498Szrj 279*38fd1498Szrj if (__n <= __size) 280*38fd1498Szrj { 281*38fd1498Szrj for (; __pos <= __size - __n; ++__pos) 282*38fd1498Szrj if (traits_type::eq(__data[__pos], __s[0]) 283*38fd1498Szrj && traits_type::compare(__data + __pos + 1, 284*38fd1498Szrj __s + 1, __n - 1) == 0) 285*38fd1498Szrj return __pos; 286*38fd1498Szrj } 287*38fd1498Szrj return npos; 288*38fd1498Szrj } 289*38fd1498Szrj 290*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 291*38fd1498Szrj template <typename, typename, typename> class _Base> 292*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 293*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find(_CharT __c,size_type __pos) const294*38fd1498Szrj find(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 295*38fd1498Szrj { 296*38fd1498Szrj size_type __ret = npos; 297*38fd1498Szrj const size_type __size = this->size(); 298*38fd1498Szrj if (__pos < __size) 299*38fd1498Szrj { 300*38fd1498Szrj const _CharT* __data = this->_M_data(); 301*38fd1498Szrj const size_type __n = __size - __pos; 302*38fd1498Szrj const _CharT* __p = traits_type::find(__data + __pos, __n, __c); 303*38fd1498Szrj if (__p) 304*38fd1498Szrj __ret = __p - __data; 305*38fd1498Szrj } 306*38fd1498Szrj return __ret; 307*38fd1498Szrj } 308*38fd1498Szrj 309*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 310*38fd1498Szrj template <typename, typename, typename> class _Base> 311*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 312*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: rfind(const _CharT * __s,size_type __pos,size_type __n) const313*38fd1498Szrj rfind(const _CharT* __s, size_type __pos, size_type __n) const 314*38fd1498Szrj { 315*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 316*38fd1498Szrj const size_type __size = this->size(); 317*38fd1498Szrj if (__n <= __size) 318*38fd1498Szrj { 319*38fd1498Szrj __pos = std::min(size_type(__size - __n), __pos); 320*38fd1498Szrj const _CharT* __data = this->_M_data(); 321*38fd1498Szrj do 322*38fd1498Szrj { 323*38fd1498Szrj if (traits_type::compare(__data + __pos, __s, __n) == 0) 324*38fd1498Szrj return __pos; 325*38fd1498Szrj } 326*38fd1498Szrj while (__pos-- > 0); 327*38fd1498Szrj } 328*38fd1498Szrj return npos; 329*38fd1498Szrj } 330*38fd1498Szrj 331*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 332*38fd1498Szrj template <typename, typename, typename> class _Base> 333*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 334*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: rfind(_CharT __c,size_type __pos) const335*38fd1498Szrj rfind(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 336*38fd1498Szrj { 337*38fd1498Szrj size_type __size = this->size(); 338*38fd1498Szrj if (__size) 339*38fd1498Szrj { 340*38fd1498Szrj if (--__size > __pos) 341*38fd1498Szrj __size = __pos; 342*38fd1498Szrj for (++__size; __size-- > 0; ) 343*38fd1498Szrj if (traits_type::eq(this->_M_data()[__size], __c)) 344*38fd1498Szrj return __size; 345*38fd1498Szrj } 346*38fd1498Szrj return npos; 347*38fd1498Szrj } 348*38fd1498Szrj 349*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 350*38fd1498Szrj template <typename, typename, typename> class _Base> 351*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 352*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find_first_of(const _CharT * __s,size_type __pos,size_type __n) const353*38fd1498Szrj find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 354*38fd1498Szrj { 355*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 356*38fd1498Szrj for (; __n && __pos < this->size(); ++__pos) 357*38fd1498Szrj { 358*38fd1498Szrj const _CharT* __p = traits_type::find(__s, __n, 359*38fd1498Szrj this->_M_data()[__pos]); 360*38fd1498Szrj if (__p) 361*38fd1498Szrj return __pos; 362*38fd1498Szrj } 363*38fd1498Szrj return npos; 364*38fd1498Szrj } 365*38fd1498Szrj 366*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 367*38fd1498Szrj template <typename, typename, typename> class _Base> 368*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 369*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find_last_of(const _CharT * __s,size_type __pos,size_type __n) const370*38fd1498Szrj find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 371*38fd1498Szrj { 372*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 373*38fd1498Szrj size_type __size = this->size(); 374*38fd1498Szrj if (__size && __n) 375*38fd1498Szrj { 376*38fd1498Szrj if (--__size > __pos) 377*38fd1498Szrj __size = __pos; 378*38fd1498Szrj do 379*38fd1498Szrj { 380*38fd1498Szrj if (traits_type::find(__s, __n, this->_M_data()[__size])) 381*38fd1498Szrj return __size; 382*38fd1498Szrj } 383*38fd1498Szrj while (__size-- != 0); 384*38fd1498Szrj } 385*38fd1498Szrj return npos; 386*38fd1498Szrj } 387*38fd1498Szrj 388*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 389*38fd1498Szrj template <typename, typename, typename> class _Base> 390*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 391*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find_first_not_of(const _CharT * __s,size_type __pos,size_type __n) const392*38fd1498Szrj find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 393*38fd1498Szrj { 394*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 395*38fd1498Szrj for (; __pos < this->size(); ++__pos) 396*38fd1498Szrj if (!traits_type::find(__s, __n, this->_M_data()[__pos])) 397*38fd1498Szrj return __pos; 398*38fd1498Szrj return npos; 399*38fd1498Szrj } 400*38fd1498Szrj 401*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 402*38fd1498Szrj template <typename, typename, typename> class _Base> 403*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 404*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find_first_not_of(_CharT __c,size_type __pos) const405*38fd1498Szrj find_first_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 406*38fd1498Szrj { 407*38fd1498Szrj for (; __pos < this->size(); ++__pos) 408*38fd1498Szrj if (!traits_type::eq(this->_M_data()[__pos], __c)) 409*38fd1498Szrj return __pos; 410*38fd1498Szrj return npos; 411*38fd1498Szrj } 412*38fd1498Szrj 413*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 414*38fd1498Szrj template <typename, typename, typename> class _Base> 415*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 416*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find_last_not_of(const _CharT * __s,size_type __pos,size_type __n) const417*38fd1498Szrj find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 418*38fd1498Szrj { 419*38fd1498Szrj __glibcxx_requires_string_len(__s, __n); 420*38fd1498Szrj size_type __size = this->size(); 421*38fd1498Szrj if (__size) 422*38fd1498Szrj { 423*38fd1498Szrj if (--__size > __pos) 424*38fd1498Szrj __size = __pos; 425*38fd1498Szrj do 426*38fd1498Szrj { 427*38fd1498Szrj if (!traits_type::find(__s, __n, this->_M_data()[__size])) 428*38fd1498Szrj return __size; 429*38fd1498Szrj } 430*38fd1498Szrj while (__size--); 431*38fd1498Szrj } 432*38fd1498Szrj return npos; 433*38fd1498Szrj } 434*38fd1498Szrj 435*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 436*38fd1498Szrj template <typename, typename, typename> class _Base> 437*38fd1498Szrj typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type 438*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: find_last_not_of(_CharT __c,size_type __pos) const439*38fd1498Szrj find_last_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT 440*38fd1498Szrj { 441*38fd1498Szrj size_type __size = this->size(); 442*38fd1498Szrj if (__size) 443*38fd1498Szrj { 444*38fd1498Szrj if (--__size > __pos) 445*38fd1498Szrj __size = __pos; 446*38fd1498Szrj do 447*38fd1498Szrj { 448*38fd1498Szrj if (!traits_type::eq(this->_M_data()[__size], __c)) 449*38fd1498Szrj return __size; 450*38fd1498Szrj } 451*38fd1498Szrj while (__size--); 452*38fd1498Szrj } 453*38fd1498Szrj return npos; 454*38fd1498Szrj } 455*38fd1498Szrj 456*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 457*38fd1498Szrj template <typename, typename, typename> class _Base> 458*38fd1498Szrj int 459*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: compare(size_type __pos,size_type __n,const __versa_string & __str) const460*38fd1498Szrj compare(size_type __pos, size_type __n, const __versa_string& __str) const 461*38fd1498Szrj { 462*38fd1498Szrj _M_check(__pos, "__versa_string::compare"); 463*38fd1498Szrj __n = _M_limit(__pos, __n); 464*38fd1498Szrj const size_type __osize = __str.size(); 465*38fd1498Szrj const size_type __len = std::min(__n, __osize); 466*38fd1498Szrj int __r = traits_type::compare(this->_M_data() + __pos, 467*38fd1498Szrj __str.data(), __len); 468*38fd1498Szrj if (!__r) 469*38fd1498Szrj __r = this->_S_compare(__n, __osize); 470*38fd1498Szrj return __r; 471*38fd1498Szrj } 472*38fd1498Szrj 473*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 474*38fd1498Szrj template <typename, typename, typename> class _Base> 475*38fd1498Szrj int 476*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: compare(size_type __pos1,size_type __n1,const __versa_string & __str,size_type __pos2,size_type __n2) const477*38fd1498Szrj compare(size_type __pos1, size_type __n1, const __versa_string& __str, 478*38fd1498Szrj size_type __pos2, size_type __n2) const 479*38fd1498Szrj { 480*38fd1498Szrj _M_check(__pos1, "__versa_string::compare"); 481*38fd1498Szrj __str._M_check(__pos2, "__versa_string::compare"); 482*38fd1498Szrj __n1 = _M_limit(__pos1, __n1); 483*38fd1498Szrj __n2 = __str._M_limit(__pos2, __n2); 484*38fd1498Szrj const size_type __len = std::min(__n1, __n2); 485*38fd1498Szrj int __r = traits_type::compare(this->_M_data() + __pos1, 486*38fd1498Szrj __str.data() + __pos2, __len); 487*38fd1498Szrj if (!__r) 488*38fd1498Szrj __r = this->_S_compare(__n1, __n2); 489*38fd1498Szrj return __r; 490*38fd1498Szrj } 491*38fd1498Szrj 492*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 493*38fd1498Szrj template <typename, typename, typename> class _Base> 494*38fd1498Szrj int 495*38fd1498Szrj __versa_string<_CharT, _Traits, _Alloc, _Base>:: compare(const _CharT * __s) const496*38fd1498Szrj compare(const _CharT* __s) const 497*38fd1498Szrj { 498*38fd1498Szrj __glibcxx_requires_string(__s); 499*38fd1498Szrj const size_type __size = this->size(); 500*38fd1498Szrj const size_type __osize = traits_type::length(__s); 501*38fd1498Szrj const size_type __len = std::min(__size, __osize); 502*38fd1498Szrj int __r = traits_type::compare(this->_M_data(), __s, __len); 503*38fd1498Szrj if (!__r) 504*38fd1498Szrj __r = this->_S_compare(__size, __osize); 505*38fd1498Szrj return __r; 506*38fd1498Szrj } 507*38fd1498Szrj 508*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 509*38fd1498Szrj template <typename, typename, typename> class _Base> 510*38fd1498Szrj int 511*38fd1498Szrj __versa_string <_CharT, _Traits, _Alloc, _Base>:: compare(size_type __pos,size_type __n1,const _CharT * __s) const512*38fd1498Szrj compare(size_type __pos, size_type __n1, const _CharT* __s) const 513*38fd1498Szrj { 514*38fd1498Szrj __glibcxx_requires_string(__s); 515*38fd1498Szrj _M_check(__pos, "__versa_string::compare"); 516*38fd1498Szrj __n1 = _M_limit(__pos, __n1); 517*38fd1498Szrj const size_type __osize = traits_type::length(__s); 518*38fd1498Szrj const size_type __len = std::min(__n1, __osize); 519*38fd1498Szrj int __r = traits_type::compare(this->_M_data() + __pos, __s, __len); 520*38fd1498Szrj if (!__r) 521*38fd1498Szrj __r = this->_S_compare(__n1, __osize); 522*38fd1498Szrj return __r; 523*38fd1498Szrj } 524*38fd1498Szrj 525*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 526*38fd1498Szrj template <typename, typename, typename> class _Base> 527*38fd1498Szrj int 528*38fd1498Szrj __versa_string <_CharT, _Traits, _Alloc, _Base>:: compare(size_type __pos,size_type __n1,const _CharT * __s,size_type __n2) const529*38fd1498Szrj compare(size_type __pos, size_type __n1, const _CharT* __s, 530*38fd1498Szrj size_type __n2) const 531*38fd1498Szrj { 532*38fd1498Szrj __glibcxx_requires_string_len(__s, __n2); 533*38fd1498Szrj _M_check(__pos, "__versa_string::compare"); 534*38fd1498Szrj __n1 = _M_limit(__pos, __n1); 535*38fd1498Szrj const size_type __len = std::min(__n1, __n2); 536*38fd1498Szrj int __r = traits_type::compare(this->_M_data() + __pos, __s, __len); 537*38fd1498Szrj if (!__r) 538*38fd1498Szrj __r = this->_S_compare(__n1, __n2); 539*38fd1498Szrj return __r; 540*38fd1498Szrj } 541*38fd1498Szrj 542*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION 543*38fd1498Szrj } // namespace 544*38fd1498Szrj 545*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default) 546*38fd1498Szrj { 547*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION 548*38fd1498Szrj 549*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 550*38fd1498Szrj template <typename, typename, typename> class _Base> 551*38fd1498Szrj basic_istream<_CharT, _Traits>& operator >>(basic_istream<_CharT,_Traits> & __in,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str)552*38fd1498Szrj operator>>(basic_istream<_CharT, _Traits>& __in, 553*38fd1498Szrj __gnu_cxx::__versa_string<_CharT, _Traits, 554*38fd1498Szrj _Alloc, _Base>& __str) 555*38fd1498Szrj { 556*38fd1498Szrj typedef basic_istream<_CharT, _Traits> __istream_type; 557*38fd1498Szrj typedef typename __istream_type::ios_base __ios_base; 558*38fd1498Szrj typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base> 559*38fd1498Szrj __string_type; 560*38fd1498Szrj typedef typename __istream_type::int_type __int_type; 561*38fd1498Szrj typedef typename __string_type::size_type __size_type; 562*38fd1498Szrj typedef ctype<_CharT> __ctype_type; 563*38fd1498Szrj typedef typename __ctype_type::ctype_base __ctype_base; 564*38fd1498Szrj 565*38fd1498Szrj __size_type __extracted = 0; 566*38fd1498Szrj typename __ios_base::iostate __err = __ios_base::goodbit; 567*38fd1498Szrj typename __istream_type::sentry __cerb(__in, false); 568*38fd1498Szrj if (__cerb) 569*38fd1498Szrj { 570*38fd1498Szrj __try 571*38fd1498Szrj { 572*38fd1498Szrj // Avoid reallocation for common case. 573*38fd1498Szrj __str.erase(); 574*38fd1498Szrj _CharT __buf[128]; 575*38fd1498Szrj __size_type __len = 0; 576*38fd1498Szrj const streamsize __w = __in.width(); 577*38fd1498Szrj const __size_type __n = __w > 0 ? static_cast<__size_type>(__w) 578*38fd1498Szrj : __str.max_size(); 579*38fd1498Szrj const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); 580*38fd1498Szrj const __int_type __eof = _Traits::eof(); 581*38fd1498Szrj __int_type __c = __in.rdbuf()->sgetc(); 582*38fd1498Szrj 583*38fd1498Szrj while (__extracted < __n 584*38fd1498Szrj && !_Traits::eq_int_type(__c, __eof) 585*38fd1498Szrj && !__ct.is(__ctype_base::space, 586*38fd1498Szrj _Traits::to_char_type(__c))) 587*38fd1498Szrj { 588*38fd1498Szrj if (__len == sizeof(__buf) / sizeof(_CharT)) 589*38fd1498Szrj { 590*38fd1498Szrj __str.append(__buf, sizeof(__buf) / sizeof(_CharT)); 591*38fd1498Szrj __len = 0; 592*38fd1498Szrj } 593*38fd1498Szrj __buf[__len++] = _Traits::to_char_type(__c); 594*38fd1498Szrj ++__extracted; 595*38fd1498Szrj __c = __in.rdbuf()->snextc(); 596*38fd1498Szrj } 597*38fd1498Szrj __str.append(__buf, __len); 598*38fd1498Szrj 599*38fd1498Szrj if (_Traits::eq_int_type(__c, __eof)) 600*38fd1498Szrj __err |= __ios_base::eofbit; 601*38fd1498Szrj __in.width(0); 602*38fd1498Szrj } 603*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 604*38fd1498Szrj { 605*38fd1498Szrj __in._M_setstate(__ios_base::badbit); 606*38fd1498Szrj __throw_exception_again; 607*38fd1498Szrj } 608*38fd1498Szrj __catch(...) 609*38fd1498Szrj { 610*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 611*38fd1498Szrj // 91. Description of operator>> and getline() for string<> 612*38fd1498Szrj // might cause endless loop 613*38fd1498Szrj __in._M_setstate(__ios_base::badbit); 614*38fd1498Szrj } 615*38fd1498Szrj } 616*38fd1498Szrj // 211. operator>>(istream&, string&) doesn't set failbit 617*38fd1498Szrj if (!__extracted) 618*38fd1498Szrj __err |= __ios_base::failbit; 619*38fd1498Szrj if (__err) 620*38fd1498Szrj __in.setstate(__err); 621*38fd1498Szrj return __in; 622*38fd1498Szrj } 623*38fd1498Szrj 624*38fd1498Szrj template<typename _CharT, typename _Traits, typename _Alloc, 625*38fd1498Szrj template <typename, typename, typename> class _Base> 626*38fd1498Szrj basic_istream<_CharT, _Traits>& getline(basic_istream<_CharT,_Traits> & __in,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str,_CharT __delim)627*38fd1498Szrj getline(basic_istream<_CharT, _Traits>& __in, 628*38fd1498Szrj __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str, 629*38fd1498Szrj _CharT __delim) 630*38fd1498Szrj { 631*38fd1498Szrj typedef basic_istream<_CharT, _Traits> __istream_type; 632*38fd1498Szrj typedef typename __istream_type::ios_base __ios_base; 633*38fd1498Szrj typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base> 634*38fd1498Szrj __string_type; 635*38fd1498Szrj typedef typename __istream_type::int_type __int_type; 636*38fd1498Szrj typedef typename __string_type::size_type __size_type; 637*38fd1498Szrj 638*38fd1498Szrj __size_type __extracted = 0; 639*38fd1498Szrj const __size_type __n = __str.max_size(); 640*38fd1498Szrj typename __ios_base::iostate __err = __ios_base::goodbit; 641*38fd1498Szrj typename __istream_type::sentry __cerb(__in, true); 642*38fd1498Szrj if (__cerb) 643*38fd1498Szrj { 644*38fd1498Szrj __try 645*38fd1498Szrj { 646*38fd1498Szrj // Avoid reallocation for common case. 647*38fd1498Szrj __str.erase(); 648*38fd1498Szrj _CharT __buf[128]; 649*38fd1498Szrj __size_type __len = 0; 650*38fd1498Szrj const __int_type __idelim = _Traits::to_int_type(__delim); 651*38fd1498Szrj const __int_type __eof = _Traits::eof(); 652*38fd1498Szrj __int_type __c = __in.rdbuf()->sgetc(); 653*38fd1498Szrj 654*38fd1498Szrj while (__extracted < __n 655*38fd1498Szrj && !_Traits::eq_int_type(__c, __eof) 656*38fd1498Szrj && !_Traits::eq_int_type(__c, __idelim)) 657*38fd1498Szrj { 658*38fd1498Szrj if (__len == sizeof(__buf) / sizeof(_CharT)) 659*38fd1498Szrj { 660*38fd1498Szrj __str.append(__buf, sizeof(__buf) / sizeof(_CharT)); 661*38fd1498Szrj __len = 0; 662*38fd1498Szrj } 663*38fd1498Szrj __buf[__len++] = _Traits::to_char_type(__c); 664*38fd1498Szrj ++__extracted; 665*38fd1498Szrj __c = __in.rdbuf()->snextc(); 666*38fd1498Szrj } 667*38fd1498Szrj __str.append(__buf, __len); 668*38fd1498Szrj 669*38fd1498Szrj if (_Traits::eq_int_type(__c, __eof)) 670*38fd1498Szrj __err |= __ios_base::eofbit; 671*38fd1498Szrj else if (_Traits::eq_int_type(__c, __idelim)) 672*38fd1498Szrj { 673*38fd1498Szrj ++__extracted; 674*38fd1498Szrj __in.rdbuf()->sbumpc(); 675*38fd1498Szrj } 676*38fd1498Szrj else 677*38fd1498Szrj __err |= __ios_base::failbit; 678*38fd1498Szrj } 679*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 680*38fd1498Szrj { 681*38fd1498Szrj __in._M_setstate(__ios_base::badbit); 682*38fd1498Szrj __throw_exception_again; 683*38fd1498Szrj } 684*38fd1498Szrj __catch(...) 685*38fd1498Szrj { 686*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 687*38fd1498Szrj // 91. Description of operator>> and getline() for string<> 688*38fd1498Szrj // might cause endless loop 689*38fd1498Szrj __in._M_setstate(__ios_base::badbit); 690*38fd1498Szrj } 691*38fd1498Szrj } 692*38fd1498Szrj if (!__extracted) 693*38fd1498Szrj __err |= __ios_base::failbit; 694*38fd1498Szrj if (__err) 695*38fd1498Szrj __in.setstate(__err); 696*38fd1498Szrj return __in; 697*38fd1498Szrj } 698*38fd1498Szrj 699*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION 700*38fd1498Szrj } // namespace 701*38fd1498Szrj 702*38fd1498Szrj #endif // _VSTRING_TCC 703