1 1.1 mrg // Debugging string implementation -*- C++ -*- 2 1.1 mrg 3 1.1.1.14 mrg // Copyright (C) 2003-2024 Free Software Foundation, Inc. 4 1.1 mrg // 5 1.1 mrg // This file is part of the GNU ISO C++ Library. This library is free 6 1.1 mrg // software; you can redistribute it and/or modify it under the 7 1.1 mrg // terms of the GNU General Public License as published by the 8 1.1 mrg // Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg // any later version. 10 1.1 mrg 11 1.1 mrg // This library is distributed in the hope that it will be useful, 12 1.1 mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg // GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg // Under Section 7 of GPL version 3, you are granted additional 17 1.1 mrg // permissions described in the GCC Runtime Library Exception, version 18 1.1 mrg // 3.1, as published by the Free Software Foundation. 19 1.1 mrg 20 1.1 mrg // You should have received a copy of the GNU General Public License and 21 1.1 mrg // a copy of the GCC Runtime Library Exception along with this program; 22 1.1 mrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 1.1 mrg // <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1 mrg /** @file debug/string 26 1.1 mrg * This file is a GNU debug extension to the Standard C++ Library. 27 1.1 mrg */ 28 1.1 mrg 29 1.1 mrg #ifndef _GLIBCXX_DEBUG_STRING 30 1.1 mrg #define _GLIBCXX_DEBUG_STRING 1 31 1.1 mrg 32 1.1.1.7 mrg #pragma GCC system_header 33 1.1.1.7 mrg 34 1.1 mrg #include <string> 35 1.1 mrg #include <debug/safe_sequence.h> 36 1.1.1.3 mrg #include <debug/safe_container.h> 37 1.1 mrg #include <debug/safe_iterator.h> 38 1.1 mrg 39 1.1.1.11 mrg #define _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(_Cond,_File,_Line,_Func) \ 40 1.1.1.11 mrg if (! (_Cond)) \ 41 1.1.1.11 mrg __gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func) \ 42 1.1.1.11 mrg ._M_message(#_Cond)._M_error() 43 1.1.1.11 mrg 44 1.1.1.13 mrg #if _GLIBCXX_USE_CXX11_ABI && __cplusplus >= 201103 45 1.1.1.13 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR 1 46 1.1.1.13 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(expr) expr 47 1.1.1.13 mrg #else 48 1.1.1.13 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR 0 49 1.1.1.13 mrg # define _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(expr) 50 1.1.1.13 mrg #endif 51 1.1.1.13 mrg 52 1.1.1.14 mrg #ifdef _GLIBCXX_DEBUG_PEDANTIC 53 1.1.1.14 mrg # if __cplusplus < 201103L 54 1.1.1.14 mrg # define __glibcxx_check_string(_String) \ 55 1.1.1.14 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(_String != 0, \ 56 1.1.1.14 mrg __FILE__, __LINE__, \ 57 1.1.1.14 mrg __PRETTY_FUNCTION__); 58 1.1.1.14 mrg # define __glibcxx_check_string_len(_String,_Len) \ 59 1.1.1.14 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(_String != 0 || _Len == 0, \ 60 1.1.1.14 mrg __FILE__, __LINE__, \ 61 1.1.1.14 mrg __PRETTY_FUNCTION__); 62 1.1.1.14 mrg # else 63 1.1.1.14 mrg # define __glibcxx_check_string(_String) \ 64 1.1.1.14 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(_String != nullptr, \ 65 1.1.1.14 mrg __FILE__, __LINE__, \ 66 1.1.1.14 mrg __PRETTY_FUNCTION__); 67 1.1.1.14 mrg # define __glibcxx_check_string_len(_String,_Len) \ 68 1.1.1.14 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(_String != nullptr || _Len == 0, \ 69 1.1.1.14 mrg __FILE__, __LINE__, \ 70 1.1.1.14 mrg __PRETTY_FUNCTION__); 71 1.1.1.14 mrg # endif 72 1.1.1.14 mrg #else 73 1.1.1.14 mrg # define __glibcxx_check_string(_String) 74 1.1.1.14 mrg # define __glibcxx_check_string_len(_String,_Len) 75 1.1.1.14 mrg #endif 76 1.1.1.14 mrg 77 1.1 mrg namespace __gnu_debug 78 1.1 mrg { 79 1.1.1.11 mrg /** Checks that __s is non-NULL or __n == 0, and then returns __s. */ 80 1.1.1.11 mrg template<typename _CharT, typename _Integer> 81 1.1.1.11 mrg inline const _CharT* 82 1.1.1.11 mrg __check_string(const _CharT* __s, 83 1.1.1.11 mrg _Integer __n __attribute__((__unused__)), 84 1.1.1.11 mrg const char* __file __attribute__((__unused__)), 85 1.1.1.11 mrg unsigned int __line __attribute__((__unused__)), 86 1.1.1.11 mrg const char* __function __attribute__((__unused__))) 87 1.1.1.11 mrg { 88 1.1.1.11 mrg #ifdef _GLIBCXX_DEBUG_PEDANTIC 89 1.1.1.14 mrg # if __cplusplus < 201103L 90 1.1.1.11 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(__s != 0 || __n == 0, 91 1.1.1.11 mrg __file, __line, __function); 92 1.1.1.14 mrg # else 93 1.1.1.14 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(__s != nullptr || __n == 0, 94 1.1.1.14 mrg __file, __line, __function); 95 1.1.1.14 mrg # endif 96 1.1.1.11 mrg #endif 97 1.1.1.11 mrg return __s; 98 1.1.1.11 mrg } 99 1.1.1.11 mrg 100 1.1.1.11 mrg /** Checks that __s is non-NULL and then returns __s. */ 101 1.1.1.11 mrg template<typename _CharT> 102 1.1.1.11 mrg inline const _CharT* 103 1.1.1.11 mrg __check_string(const _CharT* __s, 104 1.1.1.11 mrg const char* __file __attribute__((__unused__)), 105 1.1.1.11 mrg unsigned int __line __attribute__((__unused__)), 106 1.1.1.11 mrg const char* __function __attribute__((__unused__))) 107 1.1.1.11 mrg { 108 1.1.1.11 mrg #ifdef _GLIBCXX_DEBUG_PEDANTIC 109 1.1.1.14 mrg # if __cplusplus < 201103L 110 1.1.1.11 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(__s != 0, 111 1.1.1.11 mrg __file, __line, __function); 112 1.1.1.14 mrg # else 113 1.1.1.14 mrg _GLIBCXX_DEBUG_VERIFY_STR_COND_AT(__s != nullptr, 114 1.1.1.14 mrg __file, __line, __function); 115 1.1.1.14 mrg # endif 116 1.1.1.11 mrg #endif 117 1.1.1.11 mrg return __s; 118 1.1.1.11 mrg } 119 1.1.1.11 mrg 120 1.1.1.11 mrg #define __glibcxx_check_string_n_constructor(_Str, _Size) \ 121 1.1.1.11 mrg __check_string(_Str, _Size, __FILE__, __LINE__, __PRETTY_FUNCTION__) 122 1.1.1.11 mrg 123 1.1.1.11 mrg #define __glibcxx_check_string_constructor(_Str) \ 124 1.1.1.11 mrg __check_string(_Str, __FILE__, __LINE__, __PRETTY_FUNCTION__) 125 1.1.1.11 mrg 126 1.1.1.11 mrg /// Class std::basic_string with safety/checking/debug instrumentation. 127 1.1.1.11 mrg template<typename _CharT, typename _Traits = std::char_traits<_CharT>, 128 1.1.1.11 mrg typename _Allocator = std::allocator<_CharT> > 129 1.1.1.11 mrg class basic_string 130 1.1.1.11 mrg : public __gnu_debug::_Safe_container< 131 1.1.1.11 mrg basic_string<_CharT, _Traits, _Allocator>, 132 1.1.1.11 mrg _Allocator, _Safe_sequence, bool(_GLIBCXX_USE_CXX11_ABI)>, 133 1.1.1.11 mrg public std::basic_string<_CharT, _Traits, _Allocator> 134 1.1.1.11 mrg { 135 1.1.1.11 mrg typedef std::basic_string<_CharT, _Traits, _Allocator> _Base; 136 1.1.1.11 mrg typedef __gnu_debug::_Safe_container< 137 1.1.1.11 mrg basic_string, _Allocator, _Safe_sequence, bool(_GLIBCXX_USE_CXX11_ABI)> 138 1.1.1.4 mrg _Safe; 139 1.1 mrg 140 1.1.1.11 mrg template<typename _ItT, typename _SeqT, typename _CatT> 141 1.1.1.11 mrg friend class ::__gnu_debug::_Safe_iterator; 142 1.1.1.11 mrg 143 1.1.1.11 mrg // type used for positions in insert, erase etc. 144 1.1.1.11 mrg typedef __gnu_debug::_Safe_iterator< 145 1.1.1.11 mrg typename _Base::__const_iterator, basic_string> __const_iterator; 146 1.1.1.11 mrg 147 1.1.1.11 mrg public: 148 1.1.1.11 mrg // types: 149 1.1.1.11 mrg typedef _Traits traits_type; 150 1.1.1.11 mrg typedef typename _Traits::char_type value_type; 151 1.1.1.11 mrg typedef _Allocator allocator_type; 152 1.1.1.11 mrg typedef typename _Base::size_type size_type; 153 1.1.1.11 mrg typedef typename _Base::difference_type difference_type; 154 1.1.1.11 mrg typedef typename _Base::reference reference; 155 1.1.1.11 mrg typedef typename _Base::const_reference const_reference; 156 1.1.1.11 mrg typedef typename _Base::pointer pointer; 157 1.1.1.11 mrg typedef typename _Base::const_pointer const_pointer; 158 1.1.1.11 mrg 159 1.1.1.11 mrg typedef __gnu_debug::_Safe_iterator< 160 1.1.1.11 mrg typename _Base::iterator, basic_string> iterator; 161 1.1.1.11 mrg typedef __gnu_debug::_Safe_iterator< 162 1.1.1.11 mrg typename _Base::const_iterator, basic_string> const_iterator; 163 1.1.1.11 mrg 164 1.1.1.11 mrg typedef std::reverse_iterator<iterator> reverse_iterator; 165 1.1.1.11 mrg typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 166 1.1.1.11 mrg 167 1.1.1.11 mrg using _Base::npos; 168 1.1.1.11 mrg 169 1.1.1.11 mrg // 21.3.1 construct/copy/destroy: 170 1.1.1.13 mrg 171 1.1.1.11 mrg explicit 172 1.1.1.11 mrg basic_string(const _Allocator& __a) _GLIBCXX_NOEXCEPT 173 1.1.1.11 mrg : _Base(__a) { } 174 1.1 mrg 175 1.1.1.3 mrg #if __cplusplus < 201103L 176 1.1.1.13 mrg basic_string() : _Base() { } 177 1.1.1.13 mrg 178 1.1.1.11 mrg basic_string(const basic_string& __str) 179 1.1.1.11 mrg : _Base(__str) { } 180 1.1.1.3 mrg 181 1.1.1.11 mrg ~basic_string() { } 182 1.1.1.3 mrg #else 183 1.1.1.13 mrg basic_string() = default; 184 1.1.1.11 mrg basic_string(const basic_string&) = default; 185 1.1.1.11 mrg basic_string(basic_string&&) = default; 186 1.1.1.3 mrg 187 1.1.1.11 mrg basic_string(std::initializer_list<_CharT> __l, 188 1.1.1.11 mrg const _Allocator& __a = _Allocator()) 189 1.1.1.11 mrg : _Base(__l, __a) 190 1.1.1.11 mrg { } 191 1.1 mrg 192 1.1.1.11 mrg basic_string(const basic_string& __s, const _Allocator& __a) 193 1.1.1.11 mrg : _Base(__s, __a) { } 194 1.1.1.4 mrg 195 1.1.1.11 mrg basic_string(basic_string&& __s, const _Allocator& __a) 196 1.1.1.13 mrg noexcept( 197 1.1.1.13 mrg std::is_nothrow_constructible<_Base, _Base, const _Allocator&>::value ) 198 1.1.1.13 mrg : _Safe(std::move(__s), __a), 199 1.1.1.13 mrg _Base(std::move(__s), __a) 200 1.1.1.13 mrg { } 201 1.1.1.4 mrg 202 1.1.1.11 mrg ~basic_string() = default; 203 1.1.1.4 mrg 204 1.1.1.11 mrg // Provides conversion from a normal-mode string to a debug-mode string 205 1.1.1.11 mrg basic_string(_Base&& __base) noexcept 206 1.1.1.11 mrg : _Base(std::move(__base)) { } 207 1.1.1.3 mrg #endif // C++11 208 1.1.1.3 mrg 209 1.1.1.11 mrg // Provides conversion from a normal-mode string to a debug-mode string 210 1.1.1.11 mrg basic_string(const _Base& __base) 211 1.1.1.11 mrg : _Base(__base) { } 212 1.1 mrg 213 1.1.1.11 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 214 1.1.1.11 mrg // 42. string ctors specify wrong default allocator 215 1.1.1.11 mrg basic_string(const basic_string& __str, size_type __pos, 216 1.1.1.11 mrg size_type __n = _Base::npos, 217 1.1 mrg const _Allocator& __a = _Allocator()) 218 1.1.1.11 mrg : _Base(__str, __pos, __n, __a) { } 219 1.1 mrg 220 1.1.1.11 mrg basic_string(const _CharT* __s, size_type __n, 221 1.1 mrg const _Allocator& __a = _Allocator()) 222 1.1.1.11 mrg : _Base(__glibcxx_check_string_n_constructor(__s, __n), __n, __a) { } 223 1.1.1.11 mrg 224 1.1.1.11 mrg basic_string(const _CharT* __s, const _Allocator& __a = _Allocator()) 225 1.1.1.11 mrg : _Base(__glibcxx_check_string_constructor(__s), __a) 226 1.1.1.13 mrg { } 227 1.1 mrg 228 1.1.1.11 mrg basic_string(size_type __n, _CharT __c, 229 1.1.1.2 mrg const _Allocator& __a = _Allocator()) 230 1.1.1.11 mrg : _Base(__n, __c, __a) { } 231 1.1.1.11 mrg 232 1.1.1.11 mrg template<typename _InputIterator> 233 1.1.1.11 mrg basic_string(_InputIterator __begin, _InputIterator __end, 234 1.1.1.11 mrg const _Allocator& __a = _Allocator()) 235 1.1.1.11 mrg : _Base(__gnu_debug::__base( 236 1.1.1.11 mrg __glibcxx_check_valid_constructor_range(__begin, __end)), 237 1.1.1.11 mrg __gnu_debug::__base(__end), __a) { } 238 1.1 mrg 239 1.1.1.13 mrg #if __cplusplus >= 201103L 240 1.1.1.11 mrg basic_string& 241 1.1.1.11 mrg operator=(const basic_string&) = default; 242 1.1.1.3 mrg 243 1.1.1.11 mrg basic_string& 244 1.1.1.11 mrg operator=(basic_string&&) = default; 245 1.1.1.3 mrg #endif 246 1.1 mrg 247 1.1.1.11 mrg basic_string& 248 1.1.1.11 mrg operator=(const _CharT* __s) 249 1.1.1.11 mrg { 250 1.1.1.11 mrg __glibcxx_check_string(__s); 251 1.1.1.13 mrg _Base::operator=(__s); 252 1.1.1.11 mrg this->_M_invalidate_all(); 253 1.1.1.11 mrg return *this; 254 1.1.1.11 mrg } 255 1.1 mrg 256 1.1.1.11 mrg basic_string& 257 1.1.1.11 mrg operator=(_CharT __c) 258 1.1.1.11 mrg { 259 1.1.1.13 mrg _Base::operator=(__c); 260 1.1.1.11 mrg this->_M_invalidate_all(); 261 1.1.1.11 mrg return *this; 262 1.1.1.11 mrg } 263 1.1 mrg 264 1.1.1.2 mrg #if __cplusplus >= 201103L 265 1.1.1.11 mrg basic_string& 266 1.1.1.11 mrg operator=(std::initializer_list<_CharT> __l) 267 1.1.1.11 mrg { 268 1.1.1.13 mrg _Base::operator=(__l); 269 1.1.1.11 mrg this->_M_invalidate_all(); 270 1.1.1.11 mrg return *this; 271 1.1.1.11 mrg } 272 1.1.1.2 mrg #endif // C++11 273 1.1 mrg 274 1.1.1.11 mrg // 21.3.2 iterators: 275 1.1.1.11 mrg iterator 276 1.1.1.11 mrg begin() // _GLIBCXX_NOEXCEPT 277 1.1.1.11 mrg { return iterator(_Base::begin(), this); } 278 1.1.1.11 mrg 279 1.1.1.11 mrg const_iterator 280 1.1.1.11 mrg begin() const _GLIBCXX_NOEXCEPT 281 1.1.1.11 mrg { return const_iterator(_Base::begin(), this); } 282 1.1.1.11 mrg 283 1.1.1.11 mrg iterator 284 1.1.1.11 mrg end() // _GLIBCXX_NOEXCEPT 285 1.1.1.11 mrg { return iterator(_Base::end(), this); } 286 1.1.1.11 mrg 287 1.1.1.11 mrg const_iterator 288 1.1.1.11 mrg end() const _GLIBCXX_NOEXCEPT 289 1.1.1.11 mrg { return const_iterator(_Base::end(), this); } 290 1.1.1.11 mrg 291 1.1.1.11 mrg reverse_iterator 292 1.1.1.11 mrg rbegin() // _GLIBCXX_NOEXCEPT 293 1.1.1.11 mrg { return reverse_iterator(end()); } 294 1.1.1.11 mrg 295 1.1.1.11 mrg const_reverse_iterator 296 1.1.1.11 mrg rbegin() const _GLIBCXX_NOEXCEPT 297 1.1.1.11 mrg { return const_reverse_iterator(end()); } 298 1.1.1.11 mrg 299 1.1.1.11 mrg reverse_iterator 300 1.1.1.11 mrg rend() // _GLIBCXX_NOEXCEPT 301 1.1.1.11 mrg { return reverse_iterator(begin()); } 302 1.1.1.11 mrg 303 1.1.1.11 mrg const_reverse_iterator 304 1.1.1.11 mrg rend() const _GLIBCXX_NOEXCEPT 305 1.1.1.11 mrg { return const_reverse_iterator(begin()); } 306 1.1 mrg 307 1.1.1.2 mrg #if __cplusplus >= 201103L 308 1.1.1.11 mrg const_iterator 309 1.1.1.11 mrg cbegin() const noexcept 310 1.1.1.11 mrg { return const_iterator(_Base::begin(), this); } 311 1.1.1.11 mrg 312 1.1.1.11 mrg const_iterator 313 1.1.1.11 mrg cend() const noexcept 314 1.1.1.11 mrg { return const_iterator(_Base::end(), this); } 315 1.1.1.11 mrg 316 1.1.1.11 mrg const_reverse_iterator 317 1.1.1.11 mrg crbegin() const noexcept 318 1.1.1.11 mrg { return const_reverse_iterator(end()); } 319 1.1.1.11 mrg 320 1.1.1.11 mrg const_reverse_iterator 321 1.1.1.11 mrg crend() const noexcept 322 1.1.1.11 mrg { return const_reverse_iterator(begin()); } 323 1.1.1.2 mrg #endif 324 1.1.1.2 mrg 325 1.1.1.11 mrg // 21.3.3 capacity: 326 1.1.1.11 mrg using _Base::size; 327 1.1.1.11 mrg using _Base::length; 328 1.1.1.11 mrg using _Base::max_size; 329 1.1 mrg 330 1.1.1.11 mrg void 331 1.1.1.11 mrg resize(size_type __n, _CharT __c) 332 1.1.1.11 mrg { 333 1.1.1.11 mrg _Base::resize(__n, __c); 334 1.1.1.11 mrg this->_M_invalidate_all(); 335 1.1.1.11 mrg } 336 1.1 mrg 337 1.1.1.11 mrg void 338 1.1.1.11 mrg resize(size_type __n) 339 1.1.1.11 mrg { this->resize(__n, _CharT()); } 340 1.1 mrg 341 1.1.1.2 mrg #if __cplusplus >= 201103L 342 1.1.1.11 mrg void 343 1.1.1.11 mrg shrink_to_fit() noexcept 344 1.1.1.11 mrg { 345 1.1.1.11 mrg if (capacity() > size()) 346 1.1.1.11 mrg { 347 1.1.1.11 mrg __try 348 1.1.1.11 mrg { 349 1.1.1.11 mrg reserve(0); 350 1.1.1.11 mrg this->_M_invalidate_all(); 351 1.1.1.11 mrg } 352 1.1.1.11 mrg __catch(...) 353 1.1.1.11 mrg { } 354 1.1.1.11 mrg } 355 1.1.1.11 mrg } 356 1.1 mrg #endif 357 1.1 mrg 358 1.1.1.11 mrg using _Base::capacity; 359 1.1.1.11 mrg using _Base::reserve; 360 1.1 mrg 361 1.1.1.11 mrg void 362 1.1.1.11 mrg clear() // _GLIBCXX_NOEXCEPT 363 1.1.1.11 mrg { 364 1.1.1.11 mrg _Base::clear(); 365 1.1.1.11 mrg this->_M_invalidate_all(); 366 1.1.1.11 mrg } 367 1.1 mrg 368 1.1.1.11 mrg using _Base::empty; 369 1.1 mrg 370 1.1.1.11 mrg // 21.3.4 element access: 371 1.1.1.11 mrg const_reference 372 1.1.1.11 mrg operator[](size_type __pos) const _GLIBCXX_NOEXCEPT 373 1.1.1.11 mrg { 374 1.1.1.11 mrg _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 375 1.1.1.11 mrg _M_message(__gnu_debug::__msg_subscript_oob) 376 1.1.1.11 mrg ._M_sequence(*this, "this") 377 1.1.1.11 mrg ._M_integer(__pos, "__pos") 378 1.1.1.11 mrg ._M_integer(this->size(), "size")); 379 1.1.1.13 mrg return _Base::operator[](__pos); 380 1.1.1.11 mrg } 381 1.1 mrg 382 1.1.1.11 mrg reference 383 1.1.1.11 mrg operator[](size_type __pos) // _GLIBCXX_NOEXCEPT 384 1.1.1.11 mrg { 385 1.1.1.4 mrg #if __cplusplus < 201103L && defined(_GLIBCXX_DEBUG_PEDANTIC) 386 1.1.1.11 mrg __glibcxx_check_subscript(__pos); 387 1.1 mrg #else 388 1.1.1.11 mrg // as an extension v3 allows s[s.size()] when s is non-const. 389 1.1.1.11 mrg _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(), 390 1.1.1.11 mrg _M_message(__gnu_debug::__msg_subscript_oob) 391 1.1.1.11 mrg ._M_sequence(*this, "this") 392 1.1.1.11 mrg ._M_integer(__pos, "__pos") 393 1.1.1.11 mrg ._M_integer(this->size(), "size")); 394 1.1 mrg #endif 395 1.1.1.13 mrg return _Base::operator[](__pos); 396 1.1.1.11 mrg } 397 1.1 mrg 398 1.1.1.11 mrg using _Base::at; 399 1.1 mrg 400 1.1.1.2 mrg #if __cplusplus >= 201103L 401 1.1.1.11 mrg using _Base::front; 402 1.1.1.11 mrg using _Base::back; 403 1.1.1.2 mrg #endif 404 1.1.1.2 mrg 405 1.1.1.11 mrg // 21.3.5 modifiers: 406 1.1.1.11 mrg basic_string& 407 1.1.1.11 mrg operator+=(const basic_string& __str) 408 1.1.1.11 mrg { 409 1.1.1.13 mrg _Base::operator+=(__str); 410 1.1.1.11 mrg this->_M_invalidate_all(); 411 1.1.1.11 mrg return *this; 412 1.1.1.11 mrg } 413 1.1 mrg 414 1.1.1.11 mrg basic_string& 415 1.1.1.11 mrg operator+=(const _CharT* __s) 416 1.1.1.11 mrg { 417 1.1.1.11 mrg __glibcxx_check_string(__s); 418 1.1.1.13 mrg _Base::operator+=(__s); 419 1.1.1.11 mrg this->_M_invalidate_all(); 420 1.1.1.11 mrg return *this; 421 1.1.1.11 mrg } 422 1.1 mrg 423 1.1.1.11 mrg basic_string& 424 1.1.1.11 mrg operator+=(_CharT __c) 425 1.1.1.11 mrg { 426 1.1.1.13 mrg _Base::operator+=(__c); 427 1.1.1.11 mrg this->_M_invalidate_all(); 428 1.1.1.11 mrg return *this; 429 1.1.1.11 mrg } 430 1.1 mrg 431 1.1.1.2 mrg #if __cplusplus >= 201103L 432 1.1.1.11 mrg basic_string& 433 1.1.1.11 mrg operator+=(std::initializer_list<_CharT> __l) 434 1.1.1.11 mrg { 435 1.1.1.13 mrg _Base::operator+=(__l); 436 1.1.1.11 mrg this->_M_invalidate_all(); 437 1.1.1.11 mrg return *this; 438 1.1.1.11 mrg } 439 1.1.1.2 mrg #endif // C++11 440 1.1 mrg 441 1.1.1.11 mrg basic_string& 442 1.1.1.11 mrg append(const basic_string& __str) 443 1.1.1.11 mrg { 444 1.1.1.11 mrg _Base::append(__str); 445 1.1.1.11 mrg this->_M_invalidate_all(); 446 1.1.1.11 mrg return *this; 447 1.1.1.11 mrg } 448 1.1 mrg 449 1.1.1.11 mrg basic_string& 450 1.1.1.11 mrg append(const basic_string& __str, size_type __pos, size_type __n) 451 1.1.1.11 mrg { 452 1.1.1.11 mrg _Base::append(__str, __pos, __n); 453 1.1.1.11 mrg this->_M_invalidate_all(); 454 1.1.1.11 mrg return *this; 455 1.1.1.11 mrg } 456 1.1 mrg 457 1.1 mrg basic_string& 458 1.1.1.11 mrg append(const _CharT* __s, size_type __n) 459 1.1 mrg { 460 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n); 461 1.1.1.11 mrg _Base::append(__s, __n); 462 1.1.1.11 mrg this->_M_invalidate_all(); 463 1.1.1.11 mrg return *this; 464 1.1.1.11 mrg } 465 1.1.1.5 mrg 466 1.1.1.11 mrg basic_string& 467 1.1.1.11 mrg append(const _CharT* __s) 468 1.1.1.11 mrg { 469 1.1.1.11 mrg __glibcxx_check_string(__s); 470 1.1.1.11 mrg _Base::append(__s); 471 1.1.1.11 mrg this->_M_invalidate_all(); 472 1.1.1.11 mrg return *this; 473 1.1.1.11 mrg } 474 1.1.1.5 mrg 475 1.1.1.11 mrg basic_string& 476 1.1.1.11 mrg append(size_type __n, _CharT __c) 477 1.1.1.11 mrg { 478 1.1.1.11 mrg _Base::append(__n, __c); 479 1.1 mrg this->_M_invalidate_all(); 480 1.1 mrg return *this; 481 1.1 mrg } 482 1.1 mrg 483 1.1.1.11 mrg template<typename _InputIterator> 484 1.1.1.11 mrg basic_string& 485 1.1.1.11 mrg append(_InputIterator __first, _InputIterator __last) 486 1.1.1.11 mrg { 487 1.1.1.11 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 488 1.1.1.11 mrg __glibcxx_check_valid_range2(__first, __last, __dist); 489 1.1 mrg 490 1.1.1.11 mrg if (__dist.second >= __dp_sign) 491 1.1.1.11 mrg _Base::append(__gnu_debug::__unsafe(__first), 492 1.1.1.11 mrg __gnu_debug::__unsafe(__last)); 493 1.1.1.11 mrg else 494 1.1.1.11 mrg _Base::append(__first, __last); 495 1.1 mrg 496 1.1.1.11 mrg this->_M_invalidate_all(); 497 1.1.1.11 mrg return *this; 498 1.1.1.11 mrg } 499 1.1 mrg 500 1.1.1.11 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 501 1.1.1.11 mrg // 7. string clause minor problems 502 1.1.1.11 mrg void 503 1.1.1.11 mrg push_back(_CharT __c) 504 1.1.1.11 mrg { 505 1.1.1.11 mrg _Base::push_back(__c); 506 1.1.1.11 mrg this->_M_invalidate_all(); 507 1.1.1.11 mrg } 508 1.1 mrg 509 1.1.1.11 mrg basic_string& 510 1.1.1.11 mrg assign(const basic_string& __x) 511 1.1.1.11 mrg { 512 1.1.1.11 mrg _Base::assign(__x); 513 1.1.1.11 mrg this->_M_invalidate_all(); 514 1.1.1.11 mrg return *this; 515 1.1.1.11 mrg } 516 1.1 mrg 517 1.1.1.11 mrg #if __cplusplus >= 201103L 518 1.1.1.11 mrg basic_string& 519 1.1.1.11 mrg assign(basic_string&& __x) 520 1.1.1.11 mrg noexcept(noexcept(std::declval<_Base&>().assign(std::move(__x)))) 521 1.1.1.11 mrg { 522 1.1.1.11 mrg _Base::assign(std::move(__x)); 523 1.1.1.11 mrg this->_M_invalidate_all(); 524 1.1.1.11 mrg return *this; 525 1.1.1.11 mrg } 526 1.1.1.11 mrg #endif // C++11 527 1.1 mrg 528 1.1 mrg basic_string& 529 1.1.1.11 mrg assign(const basic_string& __str, size_type __pos, size_type __n) 530 1.1 mrg { 531 1.1.1.11 mrg _Base::assign(__str, __pos, __n); 532 1.1.1.11 mrg this->_M_invalidate_all(); 533 1.1.1.11 mrg return *this; 534 1.1.1.11 mrg } 535 1.1.1.5 mrg 536 1.1.1.11 mrg basic_string& 537 1.1.1.11 mrg assign(const _CharT* __s, size_type __n) 538 1.1.1.11 mrg { 539 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n); 540 1.1.1.11 mrg _Base::assign(__s, __n); 541 1.1.1.11 mrg this->_M_invalidate_all(); 542 1.1.1.11 mrg return *this; 543 1.1.1.11 mrg } 544 1.1.1.5 mrg 545 1.1.1.11 mrg basic_string& 546 1.1.1.11 mrg assign(const _CharT* __s) 547 1.1.1.11 mrg { 548 1.1.1.11 mrg __glibcxx_check_string(__s); 549 1.1.1.11 mrg _Base::assign(__s); 550 1.1 mrg this->_M_invalidate_all(); 551 1.1 mrg return *this; 552 1.1 mrg } 553 1.1 mrg 554 1.1.1.11 mrg basic_string& 555 1.1.1.11 mrg assign(size_type __n, _CharT __c) 556 1.1.1.11 mrg { 557 1.1.1.11 mrg _Base::assign(__n, __c); 558 1.1.1.11 mrg this->_M_invalidate_all(); 559 1.1.1.11 mrg return *this; 560 1.1.1.11 mrg } 561 1.1 mrg 562 1.1.1.11 mrg template<typename _InputIterator> 563 1.1.1.11 mrg basic_string& 564 1.1.1.11 mrg assign(_InputIterator __first, _InputIterator __last) 565 1.1.1.11 mrg { 566 1.1.1.11 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 567 1.1.1.11 mrg __glibcxx_check_valid_range2(__first, __last, __dist); 568 1.1 mrg 569 1.1.1.11 mrg if (__dist.second >= __dp_sign) 570 1.1.1.11 mrg _Base::assign(__gnu_debug::__unsafe(__first), 571 1.1.1.11 mrg __gnu_debug::__unsafe(__last)); 572 1.1.1.11 mrg else 573 1.1.1.11 mrg _Base::assign(__first, __last); 574 1.1 mrg 575 1.1.1.11 mrg this->_M_invalidate_all(); 576 1.1.1.11 mrg return *this; 577 1.1.1.11 mrg } 578 1.1 mrg 579 1.1.1.11 mrg #if __cplusplus >= 201103L 580 1.1.1.11 mrg basic_string& 581 1.1.1.11 mrg assign(std::initializer_list<_CharT> __l) 582 1.1.1.11 mrg { 583 1.1.1.11 mrg _Base::assign(__l); 584 1.1.1.11 mrg this->_M_invalidate_all(); 585 1.1.1.11 mrg return *this; 586 1.1.1.11 mrg } 587 1.1.1.11 mrg #endif // C++11 588 1.1 mrg 589 1.1.1.11 mrg basic_string& 590 1.1.1.11 mrg insert(size_type __pos1, const basic_string& __str) 591 1.1.1.11 mrg { 592 1.1.1.11 mrg _Base::insert(__pos1, __str); 593 1.1.1.11 mrg this->_M_invalidate_all(); 594 1.1.1.11 mrg return *this; 595 1.1.1.11 mrg } 596 1.1 mrg 597 1.1.1.11 mrg basic_string& 598 1.1.1.11 mrg insert(size_type __pos1, const basic_string& __str, 599 1.1.1.11 mrg size_type __pos2, size_type __n) 600 1.1.1.11 mrg { 601 1.1.1.11 mrg _Base::insert(__pos1, __str, __pos2, __n); 602 1.1.1.11 mrg this->_M_invalidate_all(); 603 1.1.1.11 mrg return *this; 604 1.1.1.11 mrg } 605 1.1 mrg 606 1.1.1.11 mrg basic_string& 607 1.1.1.11 mrg insert(size_type __pos, const _CharT* __s, size_type __n) 608 1.1.1.11 mrg { 609 1.1.1.11 mrg __glibcxx_check_string(__s); 610 1.1.1.11 mrg _Base::insert(__pos, __s, __n); 611 1.1.1.11 mrg this->_M_invalidate_all(); 612 1.1.1.11 mrg return *this; 613 1.1.1.11 mrg } 614 1.1 mrg 615 1.1.1.11 mrg basic_string& 616 1.1.1.11 mrg insert(size_type __pos, const _CharT* __s) 617 1.1 mrg { 618 1.1.1.11 mrg __glibcxx_check_string(__s); 619 1.1.1.11 mrg _Base::insert(__pos, __s); 620 1.1.1.11 mrg this->_M_invalidate_all(); 621 1.1.1.11 mrg return *this; 622 1.1.1.11 mrg } 623 1.1.1.5 mrg 624 1.1.1.11 mrg basic_string& 625 1.1.1.11 mrg insert(size_type __pos, size_type __n, _CharT __c) 626 1.1.1.11 mrg { 627 1.1.1.11 mrg _Base::insert(__pos, __n, __c); 628 1.1.1.11 mrg this->_M_invalidate_all(); 629 1.1.1.11 mrg return *this; 630 1.1.1.11 mrg } 631 1.1.1.5 mrg 632 1.1.1.11 mrg iterator 633 1.1.1.11 mrg insert(__const_iterator __p, _CharT __c) 634 1.1.1.11 mrg { 635 1.1.1.11 mrg __glibcxx_check_insert(__p); 636 1.1.1.11 mrg typename _Base::iterator __res = _Base::insert(__p.base(), __c); 637 1.1 mrg this->_M_invalidate_all(); 638 1.1.1.11 mrg return iterator(__res, this); 639 1.1 mrg } 640 1.1 mrg 641 1.1.1.2 mrg #if __cplusplus >= 201103L 642 1.1.1.11 mrg iterator 643 1.1.1.11 mrg insert(const_iterator __p, size_type __n, _CharT __c) 644 1.1.1.11 mrg { 645 1.1.1.11 mrg __glibcxx_check_insert(__p); 646 1.1.1.11 mrg #if _GLIBCXX_USE_CXX11_ABI 647 1.1.1.11 mrg typename _Base::iterator __res = _Base::insert(__p.base(), __n, __c); 648 1.1.1.11 mrg #else 649 1.1.1.11 mrg const size_type __offset = __p.base() - _Base::cbegin(); 650 1.1.1.11 mrg _Base::insert(_Base::begin() + __offset, __n, __c); 651 1.1.1.11 mrg typename _Base::iterator __res = _Base::begin() + __offset; 652 1.1.1.11 mrg #endif 653 1.1.1.11 mrg this->_M_invalidate_all(); 654 1.1.1.11 mrg return iterator(__res, this); 655 1.1.1.11 mrg } 656 1.1.1.11 mrg #else 657 1.1.1.11 mrg void 658 1.1.1.11 mrg insert(iterator __p, size_type __n, _CharT __c) 659 1.1.1.11 mrg { 660 1.1.1.11 mrg __glibcxx_check_insert(__p); 661 1.1.1.11 mrg _Base::insert(__p.base(), __n, __c); 662 1.1.1.11 mrg this->_M_invalidate_all(); 663 1.1.1.11 mrg } 664 1.1.1.11 mrg #endif 665 1.1 mrg 666 1.1.1.11 mrg template<typename _InputIterator> 667 1.1.1.11 mrg iterator 668 1.1.1.11 mrg insert(__const_iterator __p, 669 1.1.1.11 mrg _InputIterator __first, _InputIterator __last) 670 1.1.1.11 mrg { 671 1.1.1.11 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 672 1.1.1.11 mrg __glibcxx_check_insert_range(__p, __first, __last, __dist); 673 1.1 mrg 674 1.1.1.11 mrg typename _Base::iterator __res; 675 1.1.1.13 mrg #if ! _GLIBCXX_INSERT_RETURNS_ITERATOR 676 1.1.1.13 mrg const size_type __offset = __p.base() - _Base::begin(); 677 1.1.1.13 mrg #endif 678 1.1.1.11 mrg if (__dist.second >= __dp_sign) 679 1.1.1.13 mrg { 680 1.1.1.13 mrg _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(__res =) 681 1.1.1.13 mrg _Base::insert(__p.base(), __gnu_debug::__unsafe(__first), 682 1.1.1.13 mrg __gnu_debug::__unsafe(__last)); 683 1.1.1.13 mrg } 684 1.1.1.11 mrg else 685 1.1.1.13 mrg { 686 1.1.1.13 mrg _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY(__res =) 687 1.1.1.13 mrg _Base::insert(__p.base(), __first, __last); 688 1.1.1.13 mrg } 689 1.1.1.13 mrg 690 1.1.1.13 mrg #if ! _GLIBCXX_INSERT_RETURNS_ITERATOR 691 1.1.1.11 mrg __res = _Base::begin() + __offset; 692 1.1.1.11 mrg #endif 693 1.1.1.11 mrg this->_M_invalidate_all(); 694 1.1.1.11 mrg return iterator(__res, this); 695 1.1.1.11 mrg } 696 1.1 mrg 697 1.1.1.2 mrg #if __cplusplus >= 201103L 698 1.1.1.11 mrg iterator 699 1.1.1.11 mrg insert(const_iterator __p, std::initializer_list<_CharT> __l) 700 1.1.1.11 mrg { 701 1.1.1.11 mrg __glibcxx_check_insert(__p); 702 1.1.1.11 mrg #if _GLIBCXX_USE_CXX11_ABI 703 1.1.1.11 mrg const auto __res = _Base::insert(__p.base(), __l); 704 1.1.1.11 mrg #else 705 1.1.1.11 mrg const size_type __offset = __p.base() - _Base::cbegin(); 706 1.1.1.11 mrg _Base::insert(_Base::begin() + __offset, __l); 707 1.1.1.11 mrg auto __res = _Base::begin() + __offset; 708 1.1.1.11 mrg #endif 709 1.1.1.11 mrg this->_M_invalidate_all(); 710 1.1.1.11 mrg return iterator(__res, this); 711 1.1.1.11 mrg } 712 1.1.1.2 mrg #endif // C++11 713 1.1.1.2 mrg 714 1.1.1.11 mrg basic_string& 715 1.1.1.11 mrg erase(size_type __pos = 0, size_type __n = _Base::npos) 716 1.1.1.11 mrg { 717 1.1.1.11 mrg _Base::erase(__pos, __n); 718 1.1.1.11 mrg this->_M_invalidate_all(); 719 1.1.1.11 mrg return *this; 720 1.1.1.11 mrg } 721 1.1 mrg 722 1.1.1.11 mrg iterator 723 1.1.1.13 mrg erase(__const_iterator __position) 724 1.1.1.11 mrg { 725 1.1.1.11 mrg __glibcxx_check_erase(__position); 726 1.1.1.11 mrg typename _Base::iterator __res = _Base::erase(__position.base()); 727 1.1.1.11 mrg this->_M_invalidate_all(); 728 1.1.1.11 mrg return iterator(__res, this); 729 1.1.1.11 mrg } 730 1.1 mrg 731 1.1.1.11 mrg iterator 732 1.1.1.13 mrg erase(__const_iterator __first, __const_iterator __last) 733 1.1.1.11 mrg { 734 1.1.1.11 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 735 1.1.1.11 mrg // 151. can't currently clear() empty container 736 1.1.1.11 mrg __glibcxx_check_erase_range(__first, __last); 737 1.1.1.11 mrg typename _Base::iterator __res = _Base::erase(__first.base(), 738 1.1.1.11 mrg __last.base()); 739 1.1.1.11 mrg this->_M_invalidate_all(); 740 1.1.1.11 mrg return iterator(__res, this); 741 1.1.1.11 mrg } 742 1.1 mrg 743 1.1.1.11 mrg #if __cplusplus >= 201103L 744 1.1.1.11 mrg void 745 1.1.1.11 mrg pop_back() // noexcept 746 1.1.1.11 mrg { 747 1.1.1.11 mrg __glibcxx_check_nonempty(); 748 1.1.1.11 mrg _Base::pop_back(); 749 1.1.1.11 mrg this->_M_invalidate_all(); 750 1.1.1.11 mrg } 751 1.1.1.11 mrg #endif // C++11 752 1.1 mrg 753 1.1.1.11 mrg basic_string& 754 1.1.1.11 mrg replace(size_type __pos1, size_type __n1, const basic_string& __str) 755 1.1.1.11 mrg { 756 1.1.1.11 mrg _Base::replace(__pos1, __n1, __str); 757 1.1.1.11 mrg this->_M_invalidate_all(); 758 1.1.1.11 mrg return *this; 759 1.1.1.11 mrg } 760 1.1 mrg 761 1.1.1.11 mrg basic_string& 762 1.1.1.11 mrg replace(size_type __pos1, size_type __n1, const basic_string& __str, 763 1.1.1.11 mrg size_type __pos2, size_type __n2) 764 1.1.1.11 mrg { 765 1.1.1.11 mrg _Base::replace(__pos1, __n1, __str, __pos2, __n2); 766 1.1.1.11 mrg this->_M_invalidate_all(); 767 1.1.1.11 mrg return *this; 768 1.1.1.11 mrg } 769 1.1 mrg 770 1.1.1.11 mrg basic_string& 771 1.1.1.11 mrg replace(size_type __pos, size_type __n1, const _CharT* __s, 772 1.1.1.11 mrg size_type __n2) 773 1.1.1.11 mrg { 774 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n2); 775 1.1.1.11 mrg _Base::replace(__pos, __n1, __s, __n2); 776 1.1.1.11 mrg this->_M_invalidate_all(); 777 1.1.1.11 mrg return *this; 778 1.1.1.11 mrg } 779 1.1 mrg 780 1.1.1.11 mrg basic_string& 781 1.1.1.11 mrg replace(size_type __pos, size_type __n1, const _CharT* __s) 782 1.1.1.11 mrg { 783 1.1.1.11 mrg __glibcxx_check_string(__s); 784 1.1.1.11 mrg _Base::replace(__pos, __n1, __s); 785 1.1.1.11 mrg this->_M_invalidate_all(); 786 1.1.1.11 mrg return *this; 787 1.1.1.11 mrg } 788 1.1 mrg 789 1.1.1.11 mrg basic_string& 790 1.1.1.11 mrg replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) 791 1.1.1.11 mrg { 792 1.1.1.11 mrg _Base::replace(__pos, __n1, __n2, __c); 793 1.1.1.11 mrg this->_M_invalidate_all(); 794 1.1.1.11 mrg return *this; 795 1.1.1.11 mrg } 796 1.1 mrg 797 1.1 mrg basic_string& 798 1.1.1.11 mrg replace(__const_iterator __i1, __const_iterator __i2, 799 1.1.1.11 mrg const basic_string& __str) 800 1.1 mrg { 801 1.1 mrg __glibcxx_check_erase_range(__i1, __i2); 802 1.1.1.11 mrg _Base::replace(__i1.base(), __i2.base(), __str); 803 1.1.1.11 mrg this->_M_invalidate_all(); 804 1.1.1.11 mrg return *this; 805 1.1.1.11 mrg } 806 1.1.1.5 mrg 807 1.1.1.11 mrg basic_string& 808 1.1.1.11 mrg replace(__const_iterator __i1, __const_iterator __i2, 809 1.1.1.11 mrg const _CharT* __s, size_type __n) 810 1.1.1.11 mrg { 811 1.1.1.11 mrg __glibcxx_check_erase_range(__i1, __i2); 812 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n); 813 1.1.1.11 mrg _Base::replace(__i1.base(), __i2.base(), __s, __n); 814 1.1.1.11 mrg this->_M_invalidate_all(); 815 1.1.1.11 mrg return *this; 816 1.1.1.11 mrg } 817 1.1.1.5 mrg 818 1.1.1.11 mrg basic_string& 819 1.1.1.11 mrg replace(__const_iterator __i1, __const_iterator __i2, 820 1.1.1.11 mrg const _CharT* __s) 821 1.1.1.11 mrg { 822 1.1.1.11 mrg __glibcxx_check_erase_range(__i1, __i2); 823 1.1.1.11 mrg __glibcxx_check_string(__s); 824 1.1.1.11 mrg _Base::replace(__i1.base(), __i2.base(), __s); 825 1.1.1.11 mrg this->_M_invalidate_all(); 826 1.1.1.11 mrg return *this; 827 1.1.1.11 mrg } 828 1.1.1.5 mrg 829 1.1.1.11 mrg basic_string& 830 1.1.1.11 mrg replace(__const_iterator __i1, __const_iterator __i2, 831 1.1.1.11 mrg size_type __n, _CharT __c) 832 1.1.1.11 mrg { 833 1.1.1.11 mrg __glibcxx_check_erase_range(__i1, __i2); 834 1.1.1.11 mrg _Base::replace(__i1.base(), __i2.base(), __n, __c); 835 1.1 mrg this->_M_invalidate_all(); 836 1.1 mrg return *this; 837 1.1 mrg } 838 1.1 mrg 839 1.1.1.11 mrg template<typename _InputIterator> 840 1.1.1.11 mrg basic_string& 841 1.1.1.11 mrg replace(__const_iterator __i1, __const_iterator __i2, 842 1.1.1.11 mrg _InputIterator __j1, _InputIterator __j2) 843 1.1.1.11 mrg { 844 1.1.1.11 mrg __glibcxx_check_erase_range(__i1, __i2); 845 1.1.1.11 mrg 846 1.1.1.11 mrg typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 847 1.1.1.11 mrg __glibcxx_check_valid_range2(__j1, __j2, __dist); 848 1.1.1.11 mrg 849 1.1.1.11 mrg if (__dist.second >= __dp_sign) 850 1.1.1.11 mrg _Base::replace(__i1.base(), __i2.base(), 851 1.1.1.11 mrg __gnu_debug::__unsafe(__j1), 852 1.1.1.11 mrg __gnu_debug::__unsafe(__j2)); 853 1.1.1.11 mrg else 854 1.1.1.11 mrg _Base::replace(__i1.base(), __i2.base(), __j1, __j2); 855 1.1.1.11 mrg 856 1.1.1.11 mrg this->_M_invalidate_all(); 857 1.1.1.11 mrg return *this; 858 1.1.1.11 mrg } 859 1.1.1.11 mrg 860 1.1.1.2 mrg #if __cplusplus >= 201103L 861 1.1.1.11 mrg basic_string& 862 1.1.1.11 mrg replace(__const_iterator __i1, __const_iterator __i2, 863 1.1.1.11 mrg std::initializer_list<_CharT> __l) 864 1.1 mrg { 865 1.1 mrg __glibcxx_check_erase_range(__i1, __i2); 866 1.1 mrg _Base::replace(__i1.base(), __i2.base(), __l); 867 1.1 mrg this->_M_invalidate_all(); 868 1.1 mrg return *this; 869 1.1 mrg } 870 1.1.1.2 mrg #endif // C++11 871 1.1 mrg 872 1.1.1.11 mrg size_type 873 1.1.1.11 mrg copy(_CharT* __s, size_type __n, size_type __pos = 0) const 874 1.1.1.11 mrg { 875 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n); 876 1.1.1.11 mrg return _Base::copy(__s, __n, __pos); 877 1.1.1.11 mrg } 878 1.1 mrg 879 1.1.1.11 mrg void 880 1.1.1.11 mrg swap(basic_string& __x) 881 1.1.1.11 mrg _GLIBCXX_NOEXCEPT_IF(std::__is_nothrow_swappable<_Base>::value) 882 1.1.1.11 mrg { 883 1.1.1.11 mrg _Safe::_M_swap(__x); 884 1.1.1.11 mrg _Base::swap(__x); 885 1.1.1.11 mrg } 886 1.1 mrg 887 1.1.1.11 mrg // 21.3.6 string operations: 888 1.1.1.11 mrg const _CharT* 889 1.1.1.11 mrg c_str() const _GLIBCXX_NOEXCEPT 890 1.1.1.11 mrg { 891 1.1.1.11 mrg const _CharT* __res = _Base::c_str(); 892 1.1.1.11 mrg this->_M_invalidate_all(); 893 1.1.1.11 mrg return __res; 894 1.1.1.11 mrg } 895 1.1 mrg 896 1.1.1.11 mrg const _CharT* 897 1.1.1.11 mrg data() const _GLIBCXX_NOEXCEPT 898 1.1.1.11 mrg { 899 1.1.1.11 mrg const _CharT* __res = _Base::data(); 900 1.1.1.11 mrg this->_M_invalidate_all(); 901 1.1.1.11 mrg return __res; 902 1.1.1.11 mrg } 903 1.1 mrg 904 1.1.1.11 mrg using _Base::get_allocator; 905 1.1 mrg 906 1.1.1.14 mrg using _Base::find; 907 1.1 mrg 908 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 909 1.1.1.11 mrg size_type 910 1.1.1.11 mrg find(const _CharT* __s, size_type __pos, size_type __n) const 911 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 912 1.1.1.11 mrg { 913 1.1.1.11 mrg __glibcxx_check_string(__s); 914 1.1.1.11 mrg return _Base::find(__s, __pos, __n); 915 1.1.1.11 mrg } 916 1.1 mrg 917 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 918 1.1.1.11 mrg size_type 919 1.1.1.14 mrg find(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 920 1.1.1.11 mrg { 921 1.1.1.11 mrg __glibcxx_check_string(__s); 922 1.1.1.11 mrg return _Base::find(__s, __pos); 923 1.1.1.11 mrg } 924 1.1 mrg 925 1.1.1.14 mrg using _Base::rfind; 926 1.1 mrg 927 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 928 1.1.1.11 mrg size_type 929 1.1.1.11 mrg rfind(const _CharT* __s, size_type __pos, size_type __n) const 930 1.1.1.11 mrg { 931 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n); 932 1.1.1.11 mrg return _Base::rfind(__s, __pos, __n); 933 1.1.1.11 mrg } 934 1.1 mrg 935 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 936 1.1.1.11 mrg size_type 937 1.1.1.11 mrg rfind(const _CharT* __s, size_type __pos = _Base::npos) const 938 1.1.1.11 mrg { 939 1.1.1.11 mrg __glibcxx_check_string(__s); 940 1.1.1.11 mrg return _Base::rfind(__s, __pos); 941 1.1.1.11 mrg } 942 1.1 mrg 943 1.1.1.14 mrg using _Base::find_first_of; 944 1.1 mrg 945 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 946 1.1.1.11 mrg size_type 947 1.1.1.11 mrg find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 948 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 949 1.1.1.11 mrg { 950 1.1.1.11 mrg __glibcxx_check_string(__s); 951 1.1.1.11 mrg return _Base::find_first_of(__s, __pos, __n); 952 1.1.1.11 mrg } 953 1.1 mrg 954 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 955 1.1.1.11 mrg size_type 956 1.1.1.14 mrg find_first_of(const _CharT* __s, size_type __pos = 0) const _GLIBCXX_NOEXCEPT 957 1.1.1.11 mrg { 958 1.1.1.11 mrg __glibcxx_check_string(__s); 959 1.1.1.11 mrg return _Base::find_first_of(__s, __pos); 960 1.1.1.11 mrg } 961 1.1 mrg 962 1.1.1.14 mrg using _Base::find_last_of; 963 1.1 mrg 964 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 965 1.1.1.11 mrg size_type 966 1.1.1.11 mrg find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 967 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 968 1.1.1.11 mrg { 969 1.1.1.11 mrg __glibcxx_check_string(__s); 970 1.1.1.11 mrg return _Base::find_last_of(__s, __pos, __n); 971 1.1.1.11 mrg } 972 1.1 mrg 973 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 974 1.1.1.11 mrg size_type 975 1.1.1.11 mrg find_last_of(const _CharT* __s, size_type __pos = _Base::npos) const 976 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 977 1.1.1.11 mrg { 978 1.1.1.11 mrg __glibcxx_check_string(__s); 979 1.1.1.11 mrg return _Base::find_last_of(__s, __pos); 980 1.1.1.11 mrg } 981 1.1 mrg 982 1.1.1.14 mrg using _Base::find_first_not_of; 983 1.1 mrg 984 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 985 1.1.1.11 mrg size_type 986 1.1.1.11 mrg find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 987 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 988 1.1.1.11 mrg { 989 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n); 990 1.1.1.11 mrg return _Base::find_first_not_of(__s, __pos, __n); 991 1.1.1.11 mrg } 992 1.1 mrg 993 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 994 1.1.1.11 mrg size_type 995 1.1.1.11 mrg find_first_not_of(const _CharT* __s, size_type __pos = 0) const 996 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 997 1.1.1.11 mrg { 998 1.1.1.11 mrg __glibcxx_check_string(__s); 999 1.1.1.11 mrg return _Base::find_first_not_of(__s, __pos); 1000 1.1.1.11 mrg } 1001 1.1 mrg 1002 1.1.1.14 mrg using _Base::find_last_not_of; 1003 1.1 mrg 1004 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 1005 1.1.1.11 mrg size_type 1006 1.1.1.11 mrg find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 1007 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 1008 1.1.1.11 mrg { 1009 1.1.1.11 mrg __glibcxx_check_string(__s); 1010 1.1.1.11 mrg return _Base::find_last_not_of(__s, __pos, __n); 1011 1.1.1.11 mrg } 1012 1.1 mrg 1013 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 1014 1.1.1.11 mrg size_type 1015 1.1.1.11 mrg find_last_not_of(const _CharT* __s, size_type __pos = _Base::npos) const 1016 1.1.1.14 mrg _GLIBCXX_NOEXCEPT 1017 1.1.1.11 mrg { 1018 1.1.1.11 mrg __glibcxx_check_string(__s); 1019 1.1.1.11 mrg return _Base::find_last_not_of(__s, __pos); 1020 1.1.1.11 mrg } 1021 1.1 mrg 1022 1.1.1.11 mrg basic_string 1023 1.1.1.11 mrg substr(size_type __pos = 0, size_type __n = _Base::npos) const 1024 1.1.1.11 mrg { return basic_string(_Base::substr(__pos, __n)); } 1025 1.1.1.11 mrg 1026 1.1.1.14 mrg using _Base::compare; 1027 1.1 mrg 1028 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 1029 1.1.1.11 mrg int 1030 1.1.1.14 mrg compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT 1031 1.1.1.11 mrg { 1032 1.1.1.11 mrg __glibcxx_check_string(__s); 1033 1.1.1.11 mrg return _Base::compare(__s); 1034 1.1.1.11 mrg } 1035 1.1 mrg 1036 1.1.1.11 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1037 1.1.1.11 mrg // 5. string::compare specification questionable 1038 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 1039 1.1.1.11 mrg int 1040 1.1.1.11 mrg compare(size_type __pos1, size_type __n1, const _CharT* __s) const 1041 1.1.1.11 mrg { 1042 1.1.1.11 mrg __glibcxx_check_string(__s); 1043 1.1.1.11 mrg return _Base::compare(__pos1, __n1, __s); 1044 1.1.1.11 mrg } 1045 1.1 mrg 1046 1.1.1.11 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1047 1.1.1.11 mrg // 5. string::compare specification questionable 1048 1.1.1.14 mrg _GLIBCXX20_CONSTEXPR 1049 1.1.1.11 mrg int 1050 1.1.1.11 mrg compare(size_type __pos1, size_type __n1,const _CharT* __s, 1051 1.1.1.11 mrg size_type __n2) const 1052 1.1.1.11 mrg { 1053 1.1.1.11 mrg __glibcxx_check_string_len(__s, __n2); 1054 1.1.1.11 mrg return _Base::compare(__pos1, __n1, __s, __n2); 1055 1.1.1.11 mrg } 1056 1.1 mrg 1057 1.1.1.11 mrg _Base& 1058 1.1.1.11 mrg _M_base() _GLIBCXX_NOEXCEPT { return *this; } 1059 1.1 mrg 1060 1.1.1.11 mrg const _Base& 1061 1.1.1.11 mrg _M_base() const _GLIBCXX_NOEXCEPT { return *this; } 1062 1.1 mrg 1063 1.1.1.11 mrg using _Safe::_M_invalidate_all; 1064 1.1.1.11 mrg }; 1065 1.1 mrg 1066 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1067 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1068 1.1 mrg operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1069 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1070 1.1 mrg { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 1071 1.1 mrg 1072 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1073 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1074 1.1 mrg operator+(const _CharT* __lhs, 1075 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1076 1.1 mrg { 1077 1.1 mrg __glibcxx_check_string(__lhs); 1078 1.1 mrg return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 1079 1.1 mrg } 1080 1.1 mrg 1081 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1082 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1083 1.1 mrg operator+(_CharT __lhs, 1084 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1085 1.1 mrg { return basic_string<_CharT,_Traits,_Allocator>(1, __lhs) += __rhs; } 1086 1.1 mrg 1087 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1088 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1089 1.1 mrg operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1090 1.1 mrg const _CharT* __rhs) 1091 1.1 mrg { 1092 1.1 mrg __glibcxx_check_string(__rhs); 1093 1.1 mrg return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; 1094 1.1 mrg } 1095 1.1 mrg 1096 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1097 1.1 mrg inline basic_string<_CharT,_Traits,_Allocator> 1098 1.1 mrg operator+(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1099 1.1 mrg _CharT __rhs) 1100 1.1 mrg { return basic_string<_CharT,_Traits,_Allocator>(__lhs) += __rhs; } 1101 1.1 mrg 1102 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1103 1.1 mrg inline bool 1104 1.1 mrg operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1105 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1106 1.1 mrg { return __lhs._M_base() == __rhs._M_base(); } 1107 1.1 mrg 1108 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1109 1.1 mrg inline bool 1110 1.1 mrg operator==(const _CharT* __lhs, 1111 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1112 1.1 mrg { 1113 1.1 mrg __glibcxx_check_string(__lhs); 1114 1.1 mrg return __lhs == __rhs._M_base(); 1115 1.1 mrg } 1116 1.1 mrg 1117 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1118 1.1 mrg inline bool 1119 1.1 mrg operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1120 1.1 mrg const _CharT* __rhs) 1121 1.1 mrg { 1122 1.1 mrg __glibcxx_check_string(__rhs); 1123 1.1 mrg return __lhs._M_base() == __rhs; 1124 1.1 mrg } 1125 1.1 mrg 1126 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1127 1.1 mrg inline bool 1128 1.1 mrg operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1129 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1130 1.1 mrg { return __lhs._M_base() != __rhs._M_base(); } 1131 1.1 mrg 1132 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1133 1.1 mrg inline bool 1134 1.1 mrg operator!=(const _CharT* __lhs, 1135 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1136 1.1 mrg { 1137 1.1 mrg __glibcxx_check_string(__lhs); 1138 1.1 mrg return __lhs != __rhs._M_base(); 1139 1.1 mrg } 1140 1.1 mrg 1141 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1142 1.1 mrg inline bool 1143 1.1 mrg operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1144 1.1 mrg const _CharT* __rhs) 1145 1.1 mrg { 1146 1.1 mrg __glibcxx_check_string(__rhs); 1147 1.1 mrg return __lhs._M_base() != __rhs; 1148 1.1 mrg } 1149 1.1 mrg 1150 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1151 1.1 mrg inline bool 1152 1.1 mrg operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1153 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1154 1.1 mrg { return __lhs._M_base() < __rhs._M_base(); } 1155 1.1 mrg 1156 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1157 1.1 mrg inline bool 1158 1.1 mrg operator<(const _CharT* __lhs, 1159 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1160 1.1 mrg { 1161 1.1 mrg __glibcxx_check_string(__lhs); 1162 1.1 mrg return __lhs < __rhs._M_base(); 1163 1.1 mrg } 1164 1.1 mrg 1165 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1166 1.1 mrg inline bool 1167 1.1 mrg operator<(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1168 1.1 mrg const _CharT* __rhs) 1169 1.1 mrg { 1170 1.1 mrg __glibcxx_check_string(__rhs); 1171 1.1 mrg return __lhs._M_base() < __rhs; 1172 1.1 mrg } 1173 1.1 mrg 1174 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1175 1.1 mrg inline bool 1176 1.1 mrg operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1177 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1178 1.1 mrg { return __lhs._M_base() <= __rhs._M_base(); } 1179 1.1 mrg 1180 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1181 1.1 mrg inline bool 1182 1.1 mrg operator<=(const _CharT* __lhs, 1183 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1184 1.1 mrg { 1185 1.1 mrg __glibcxx_check_string(__lhs); 1186 1.1 mrg return __lhs <= __rhs._M_base(); 1187 1.1 mrg } 1188 1.1 mrg 1189 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1190 1.1 mrg inline bool 1191 1.1 mrg operator<=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1192 1.1 mrg const _CharT* __rhs) 1193 1.1 mrg { 1194 1.1 mrg __glibcxx_check_string(__rhs); 1195 1.1 mrg return __lhs._M_base() <= __rhs; 1196 1.1 mrg } 1197 1.1 mrg 1198 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1199 1.1 mrg inline bool 1200 1.1 mrg operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1201 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1202 1.1 mrg { return __lhs._M_base() >= __rhs._M_base(); } 1203 1.1 mrg 1204 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1205 1.1 mrg inline bool 1206 1.1 mrg operator>=(const _CharT* __lhs, 1207 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1208 1.1 mrg { 1209 1.1 mrg __glibcxx_check_string(__lhs); 1210 1.1 mrg return __lhs >= __rhs._M_base(); 1211 1.1 mrg } 1212 1.1 mrg 1213 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1214 1.1 mrg inline bool 1215 1.1 mrg operator>=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1216 1.1 mrg const _CharT* __rhs) 1217 1.1 mrg { 1218 1.1 mrg __glibcxx_check_string(__rhs); 1219 1.1 mrg return __lhs._M_base() >= __rhs; 1220 1.1 mrg } 1221 1.1 mrg 1222 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1223 1.1 mrg inline bool 1224 1.1 mrg operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1225 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1226 1.1 mrg { return __lhs._M_base() > __rhs._M_base(); } 1227 1.1 mrg 1228 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1229 1.1 mrg inline bool 1230 1.1 mrg operator>(const _CharT* __lhs, 1231 1.1 mrg const basic_string<_CharT,_Traits,_Allocator>& __rhs) 1232 1.1 mrg { 1233 1.1 mrg __glibcxx_check_string(__lhs); 1234 1.1 mrg return __lhs > __rhs._M_base(); 1235 1.1 mrg } 1236 1.1 mrg 1237 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1238 1.1 mrg inline bool 1239 1.1 mrg operator>(const basic_string<_CharT,_Traits,_Allocator>& __lhs, 1240 1.1 mrg const _CharT* __rhs) 1241 1.1 mrg { 1242 1.1 mrg __glibcxx_check_string(__rhs); 1243 1.1 mrg return __lhs._M_base() > __rhs; 1244 1.1 mrg } 1245 1.1 mrg 1246 1.1 mrg // 21.3.7.8: 1247 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1248 1.1 mrg inline void 1249 1.1 mrg swap(basic_string<_CharT,_Traits,_Allocator>& __lhs, 1250 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __rhs) 1251 1.1 mrg { __lhs.swap(__rhs); } 1252 1.1 mrg 1253 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1254 1.1 mrg std::basic_ostream<_CharT, _Traits>& 1255 1.1 mrg operator<<(std::basic_ostream<_CharT, _Traits>& __os, 1256 1.1 mrg const basic_string<_CharT, _Traits, _Allocator>& __str) 1257 1.1 mrg { return __os << __str._M_base(); } 1258 1.1 mrg 1259 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1260 1.1 mrg std::basic_istream<_CharT,_Traits>& 1261 1.1 mrg operator>>(std::basic_istream<_CharT,_Traits>& __is, 1262 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __str) 1263 1.1 mrg { 1264 1.1 mrg std::basic_istream<_CharT,_Traits>& __res = __is >> __str._M_base(); 1265 1.1 mrg __str._M_invalidate_all(); 1266 1.1 mrg return __res; 1267 1.1 mrg } 1268 1.1 mrg 1269 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1270 1.1 mrg std::basic_istream<_CharT,_Traits>& 1271 1.1 mrg getline(std::basic_istream<_CharT,_Traits>& __is, 1272 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __str, _CharT __delim) 1273 1.1 mrg { 1274 1.1 mrg std::basic_istream<_CharT,_Traits>& __res = getline(__is, 1275 1.1 mrg __str._M_base(), 1276 1.1 mrg __delim); 1277 1.1 mrg __str._M_invalidate_all(); 1278 1.1 mrg return __res; 1279 1.1 mrg } 1280 1.1 mrg 1281 1.1 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1282 1.1 mrg std::basic_istream<_CharT,_Traits>& 1283 1.1 mrg getline(std::basic_istream<_CharT,_Traits>& __is, 1284 1.1 mrg basic_string<_CharT,_Traits,_Allocator>& __str) 1285 1.1 mrg { 1286 1.1 mrg std::basic_istream<_CharT,_Traits>& __res = getline(__is, 1287 1.1 mrg __str._M_base()); 1288 1.1 mrg __str._M_invalidate_all(); 1289 1.1 mrg return __res; 1290 1.1 mrg } 1291 1.1 mrg 1292 1.1 mrg typedef basic_string<char> string; 1293 1.1 mrg 1294 1.1 mrg typedef basic_string<wchar_t> wstring; 1295 1.1.1.13 mrg 1296 1.1.1.13 mrg #ifdef _GLIBCXX_USE_CHAR8_T 1297 1.1.1.13 mrg /// A string of @c char8_t 1298 1.1.1.13 mrg typedef basic_string<char8_t> u8string; 1299 1.1.1.13 mrg #endif 1300 1.1.1.13 mrg 1301 1.1.1.13 mrg #if __cplusplus >= 201103L 1302 1.1.1.13 mrg /// A string of @c char16_t 1303 1.1.1.13 mrg typedef basic_string<char16_t> u16string; 1304 1.1.1.13 mrg 1305 1.1.1.13 mrg /// A string of @c char32_t 1306 1.1.1.13 mrg typedef basic_string<char32_t> u32string; 1307 1.1 mrg #endif 1308 1.1 mrg 1309 1.1.1.3 mrg template<typename _CharT, typename _Traits, typename _Allocator> 1310 1.1.1.3 mrg struct _Insert_range_from_self_is_safe< 1311 1.1.1.3 mrg __gnu_debug::basic_string<_CharT, _Traits, _Allocator> > 1312 1.1.1.3 mrg { enum { __value = 1 }; }; 1313 1.1.1.3 mrg 1314 1.1 mrg } // namespace __gnu_debug 1315 1.1 mrg 1316 1.1.1.13 mrg #if __cplusplus >= 201103L 1317 1.1.1.13 mrg namespace std _GLIBCXX_VISIBILITY(default) 1318 1.1.1.13 mrg { 1319 1.1.1.13 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 1320 1.1.1.13 mrg 1321 1.1.1.13 mrg /// std::hash specialization for __gnu_debug::basic_string. 1322 1.1.1.13 mrg template<typename _CharT> 1323 1.1.1.13 mrg struct hash<__gnu_debug::basic_string<_CharT>> 1324 1.1.1.13 mrg : public hash<std::basic_string<_CharT>> 1325 1.1.1.13 mrg { }; 1326 1.1.1.13 mrg 1327 1.1.1.13 mrg template<typename _CharT> 1328 1.1.1.13 mrg struct __is_fast_hash<hash<__gnu_debug::basic_string<_CharT>>> 1329 1.1.1.13 mrg : __is_fast_hash<hash<std::basic_string<_CharT>>> 1330 1.1.1.13 mrg { }; 1331 1.1.1.13 mrg 1332 1.1.1.13 mrg _GLIBCXX_END_NAMESPACE_VERSION 1333 1.1.1.13 mrg } 1334 1.1.1.13 mrg #endif /* C++11 */ 1335 1.1.1.13 mrg 1336 1.1.1.13 mrg #undef _GLIBCXX_INSERT_RETURNS_ITERATOR 1337 1.1.1.13 mrg #undef _GLIBCXX_INSERT_RETURNS_ITERATOR_ONLY 1338 1.1.1.13 mrg 1339 1.1 mrg #endif 1340