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