00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00040 #ifndef _BASIC_STRING_H
00041 #define _BASIC_STRING_H 1
00042
00043 #pragma GCC system_header
00044
00045 #include <bits/atomicity.h>
00046 #include <debug/debug.h>
00047
00048 namespace std
00049 {
00108
00109 template<typename _CharT, typename _Traits, typename _Alloc>
00110 class basic_string
00111 {
00112
00113 public:
00114 typedef _Traits traits_type;
00115 typedef typename _Traits::char_type value_type;
00116 typedef _Alloc allocator_type;
00117 typedef typename _Alloc::size_type size_type;
00118 typedef typename _Alloc::difference_type difference_type;
00119 typedef typename _Alloc::reference reference;
00120 typedef typename _Alloc::const_reference const_reference;
00121 typedef typename _Alloc::pointer pointer;
00122 typedef typename _Alloc::const_pointer const_pointer;
00123 typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
00124 typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
00125 const_iterator;
00126 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00127 typedef std::reverse_iterator<iterator> reverse_iterator;
00128
00129 private:
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 struct _Rep_base
00145 {
00146 size_type _M_length;
00147 size_type _M_capacity;
00148 _Atomic_word _M_refcount;
00149 };
00150
00151 struct _Rep : _Rep_base
00152 {
00153
00154 typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 static const size_type _S_max_size;
00170 static const _CharT _S_terminal;
00171
00172
00173
00174 static size_type _S_empty_rep_storage[];
00175
00176 static _Rep&
00177 _S_empty_rep()
00178 { return *reinterpret_cast<_Rep*>(&_S_empty_rep_storage); }
00179
00180 bool
00181 _M_is_leaked() const
00182 { return this->_M_refcount < 0; }
00183
00184 bool
00185 _M_is_shared() const
00186 { return this->_M_refcount > 0; }
00187
00188 void
00189 _M_set_leaked()
00190 { this->_M_refcount = -1; }
00191
00192 void
00193 _M_set_sharable()
00194 { this->_M_refcount = 0; }
00195
00196 _CharT*
00197 _M_refdata() throw()
00198 { return reinterpret_cast<_CharT*>(this + 1); }
00199
00200 _CharT*
00201 _M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
00202 {
00203 return (!_M_is_leaked() && __alloc1 == __alloc2)
00204 ? _M_refcopy() : _M_clone(__alloc1);
00205 }
00206
00207
00208 static _Rep*
00209 _S_create(size_type, size_type, const _Alloc&);
00210
00211 void
00212 _M_dispose(const _Alloc& __a)
00213 {
00214 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
00215 if (__builtin_expect(this != &_S_empty_rep(), false))
00216 #endif
00217 if (__gnu_cxx::__exchange_and_add(&this->_M_refcount, -1) <= 0)
00218 _M_destroy(__a);
00219 }
00220
00221 void
00222 _M_destroy(const _Alloc&) throw();
00223
00224 _CharT*
00225 _M_refcopy() throw()
00226 {
00227 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
00228 if (__builtin_expect(this != &_S_empty_rep(), false))
00229 #endif
00230 __gnu_cxx::__atomic_add(&this->_M_refcount, 1);
00231 return _M_refdata();
00232 }
00233
00234 _CharT*
00235 _M_clone(const _Alloc&, size_type __res = 0);
00236 };
00237
00238
00239 struct _Alloc_hider : _Alloc
00240 {
00241 _Alloc_hider(_CharT* __dat, const _Alloc& __a)
00242 : _Alloc(__a), _M_p(__dat) { }
00243
00244 _CharT* _M_p;
00245 };
00246
00247 public:
00248
00249
00250
00253 static const size_type npos = static_cast<size_type>(-1);
00254
00255 private:
00256
00257 mutable _Alloc_hider _M_dataplus;
00258
00259 _CharT*
00260 _M_data() const
00261 { return _M_dataplus._M_p; }
00262
00263 _CharT*
00264 _M_data(_CharT* __p)
00265 { return (_M_dataplus._M_p = __p); }
00266
00267 _Rep*
00268 _M_rep() const
00269 { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
00270
00271
00272
00273 iterator
00274 _M_ibegin() const { return iterator(_M_data()); }
00275
00276 iterator
00277 _M_iend() const { return iterator(_M_data() + this->size()); }
00278
00279 void
00280 _M_leak()
00281 {
00282 if (!_M_rep()->_M_is_leaked())
00283 _M_leak_hard();
00284 }
00285
00286 size_type
00287 _M_check(size_type __pos, const char* __s) const
00288 {
00289 if (__pos > this->size())
00290 __throw_out_of_range(__N(__s));
00291 return __pos;
00292 }
00293
00294
00295 size_type
00296 _M_limit(size_type __pos, size_type __off) const
00297 {
00298 const bool __testoff = __off < this->size() - __pos;
00299 return __testoff ? __off : this->size() - __pos;
00300 }
00301
00302
00303
00304 template<class _Iterator>
00305 static void
00306 _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
00307 {
00308 for (; __k1 != __k2; ++__k1, ++__p)
00309 traits_type::assign(*__p, *__k1);
00310 }
00311
00312 static void
00313 _S_copy_chars(_CharT* __p, iterator __k1, iterator __k2)
00314 { _S_copy_chars(__p, __k1.base(), __k2.base()); }
00315
00316 static void
00317 _S_copy_chars(_CharT* __p, const_iterator __k1, const_iterator __k2)
00318 { _S_copy_chars(__p, __k1.base(), __k2.base()); }
00319
00320 static void
00321 _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
00322 { traits_type::copy(__p, __k1, __k2 - __k1); }
00323
00324 static void
00325 _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
00326 { traits_type::copy(__p, __k1, __k2 - __k1); }
00327
00328 void
00329 _M_mutate(size_type __pos, size_type __len1, size_type __len2);
00330
00331 void
00332 _M_leak_hard();
00333
00334 static _Rep&
00335 _S_empty_rep()
00336 { return _Rep::_S_empty_rep(); }
00337
00338 public:
00339
00340
00341
00342
00346 inline
00347 basic_string();
00348
00352 explicit
00353 basic_string(const _Alloc& __a);
00354
00355
00360 basic_string(const basic_string& __str);
00367 basic_string(const basic_string& __str, size_type __pos,
00368 size_type __n = npos);
00376 basic_string(const basic_string& __str, size_type __pos,
00377 size_type __n, const _Alloc& __a);
00378
00388 basic_string(const _CharT* __s, size_type __n,
00389 const _Alloc& __a = _Alloc());
00395 basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
00402 basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc());
00403
00410 template<class _InputIterator>
00411 basic_string(_InputIterator __beg, _InputIterator __end,
00412 const _Alloc& __a = _Alloc());
00413
00417 ~basic_string()
00418 { _M_rep()->_M_dispose(this->get_allocator()); }
00419
00424 basic_string&
00425 operator=(const basic_string& __str)
00426 {
00427 this->assign(__str);
00428 return *this;
00429 }
00430
00435 basic_string&
00436 operator=(const _CharT* __s)
00437 {
00438 this->assign(__s);
00439 return *this;
00440 }
00441
00449 basic_string&
00450 operator=(_CharT __c)
00451 {
00452 this->assign(1, __c);
00453 return *this;
00454 }
00455
00456
00461 iterator
00462 begin()
00463 {
00464 _M_leak();
00465 return iterator(_M_data());
00466 }
00467
00472 const_iterator
00473 begin() const
00474 { return const_iterator(_M_data()); }
00475
00480 iterator
00481 end()
00482 {
00483 _M_leak();
00484 return iterator(_M_data() + this->size());
00485 }
00486
00491 const_iterator
00492 end() const
00493 { return const_iterator(_M_data() + this->size()); }
00494
00500 reverse_iterator
00501 rbegin()
00502 { return reverse_iterator(this->end()); }
00503
00509 const_reverse_iterator
00510 rbegin() const
00511 { return const_reverse_iterator(this->end()); }
00512
00518 reverse_iterator
00519 rend()
00520 { return reverse_iterator(this->begin()); }
00521
00527 const_reverse_iterator
00528 rend() const
00529 { return const_reverse_iterator(this->begin()); }
00530
00531 public:
00532
00535 size_type
00536 size() const { return _M_rep()->_M_length; }
00537
00540 size_type
00541 length() const { return _M_rep()->_M_length; }
00542
00544 size_type
00545 max_size() const { return _Rep::_S_max_size; }
00546
00557 void
00558 resize(size_type __n, _CharT __c);
00559
00570 void
00571 resize(size_type __n) { this->resize(__n, _CharT()); }
00572
00577 size_type
00578 capacity() const { return _M_rep()->_M_capacity; }
00579
00597 void
00598 reserve(size_type __res_arg = 0);
00599
00603 void
00604 clear() { _M_mutate(0, this->size(), 0); }
00605
00609 bool
00610 empty() const { return this->size() == 0; }
00611
00612
00623 const_reference
00624 operator[] (size_type __pos) const
00625 {
00626 _GLIBCXX_DEBUG_ASSERT(__pos <= size());
00627 return _M_data()[__pos];
00628 }
00629
00640 reference
00641 operator[](size_type __pos)
00642 {
00643 _GLIBCXX_DEBUG_ASSERT(__pos < size());
00644 _M_leak();
00645 return _M_data()[__pos];
00646 }
00647
00658 const_reference
00659 at(size_type __n) const
00660 {
00661 if (__n >= this->size())
00662 __throw_out_of_range(__N("basic_string::at"));
00663 return _M_data()[__n];
00664 }
00665
00677 reference
00678 at(size_type __n)
00679 {
00680 if (__n >= size())
00681 __throw_out_of_range(__N("basic_string::at"));
00682 _M_leak();
00683 return _M_data()[__n];
00684 }
00685
00686
00692 basic_string&
00693 operator+=(const basic_string& __str) { return this->append(__str); }
00694
00700 basic_string&
00701 operator+=(const _CharT* __s) { return this->append(__s); }
00702
00708 basic_string&
00709 operator+=(_CharT __c) { return this->append(size_type(1), __c); }
00710
00716 basic_string&
00717 append(const basic_string& __str);
00718
00731 basic_string&
00732 append(const basic_string& __str, size_type __pos, size_type __n);
00733
00740 basic_string&
00741 append(const _CharT* __s, size_type __n);
00742
00748 basic_string&
00749 append(const _CharT* __s)
00750 {
00751 __glibcxx_requires_string(__s);
00752 return this->append(__s, traits_type::length(__s));
00753 }
00754
00763 basic_string&
00764 append(size_type __n, _CharT __c)
00765 { return _M_replace_aux(this->size(), size_type(0), __n, __c); }
00766
00775 template<class _InputIterator>
00776 basic_string&
00777 append(_InputIterator __first, _InputIterator __last)
00778 { return this->replace(_M_iend(), _M_iend(), __first, __last); }
00779
00784 void
00785 push_back(_CharT __c)
00786 { _M_replace_aux(this->size(), size_type(0), size_type(1), __c); }
00787
00793 basic_string&
00794 assign(const basic_string& __str);
00795
00808 basic_string&
00809 assign(const basic_string& __str, size_type __pos, size_type __n)
00810 { return this->assign(__str._M_data()
00811 + __str._M_check(__pos, "basic_string::assign"),
00812 __str._M_limit(__pos, __n)); }
00813
00824 basic_string&
00825 assign(const _CharT* __s, size_type __n);
00826
00836 basic_string&
00837 assign(const _CharT* __s)
00838 {
00839 __glibcxx_requires_string(__s);
00840 return this->assign(__s, traits_type::length(__s));
00841 }
00842
00852 basic_string&
00853 assign(size_type __n, _CharT __c)
00854 { return _M_replace_aux(size_type(0), this->size(), __n, __c); }
00855
00864 template<class _InputIterator>
00865 basic_string&
00866 assign(_InputIterator __first, _InputIterator __last)
00867 { return this->replace(_M_ibegin(), _M_iend(), __first, __last); }
00868
00881 void
00882 insert(iterator __p, size_type __n, _CharT __c)
00883 { this->replace(__p, __p, __n, __c); }
00884
00896 template<class _InputIterator>
00897 void insert(iterator __p, _InputIterator __beg, _InputIterator __end)
00898 { this->replace(__p, __p, __beg, __end); }
00899
00911 basic_string&
00912 insert(size_type __pos1, const basic_string& __str)
00913 { return this->insert(__pos1, __str, size_type(0), __str.size()); }
00914
00933 basic_string&
00934 insert(size_type __pos1, const basic_string& __str,
00935 size_type __pos2, size_type __n)
00936 { return this->insert(__pos1, __str._M_data()
00937 + __str._M_check(__pos2, "basic_string::insert"),
00938 __str._M_limit(__pos2, __n)); }
00939
00956 basic_string&
00957 insert(size_type __pos, const _CharT* __s, size_type __n);
00958
00974 basic_string&
00975 insert(size_type __pos, const _CharT* __s)
00976 {
00977 __glibcxx_requires_string(__s);
00978 return this->insert(__pos, __s, traits_type::length(__s));
00979 }
00980
00997 basic_string&
00998 insert(size_type __pos, size_type __n, _CharT __c)
00999 { return _M_replace_aux(_M_check(__pos, "basic_string::insert"),
01000 size_type(0), __n, __c); }
01001
01014 iterator
01015 insert(iterator __p, _CharT __c)
01016 {
01017 _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
01018 const size_type __pos = __p - _M_ibegin();
01019 _M_replace_aux(__pos, size_type(0), size_type(1), __c);
01020 _M_rep()->_M_set_leaked();
01021 return this->_M_ibegin() + __pos;
01022 }
01023
01038 basic_string&
01039 erase(size_type __pos = 0, size_type __n = npos)
01040 { return _M_replace_safe(_M_check(__pos, "basic_string::erase"),
01041 _M_limit(__pos, __n), NULL, size_type(0)); }
01042
01051 iterator
01052 erase(iterator __position)
01053 {
01054 _GLIBCXX_DEBUG_PEDASSERT(__position >= _M_ibegin()
01055 && __position < _M_iend());
01056 const size_type __pos = __position - _M_ibegin();
01057 _M_replace_safe(__pos, size_type(1), NULL, size_type(0));
01058 _M_rep()->_M_set_leaked();
01059 return _M_ibegin() + __pos;
01060 }
01061
01071 iterator
01072 erase(iterator __first, iterator __last)
01073 {
01074 _GLIBCXX_DEBUG_PEDASSERT(__first >= _M_ibegin() && __first <= __last
01075 && __last <= _M_iend());
01076 const size_type __pos = __first - _M_ibegin();
01077 _M_replace_safe(__pos, __last - __first, NULL, size_type(0));
01078 _M_rep()->_M_set_leaked();
01079 return _M_ibegin() + __pos;
01080 }
01081
01098 basic_string&
01099 replace(size_type __pos, size_type __n, const basic_string& __str)
01100 { return this->replace(__pos, __n, __str._M_data(), __str.size()); }
01101
01120 basic_string&
01121 replace(size_type __pos1, size_type __n1, const basic_string& __str,
01122 size_type __pos2, size_type __n2)
01123 { return this->replace(__pos1, __n1, __str._M_data()
01124 + __str._M_check(__pos2, "basic_string::replace"),
01125 __str._M_limit(__pos2, __n2)); }
01126
01144 basic_string&
01145 replace(size_type __pos, size_type __n1, const _CharT* __s,
01146 size_type __n2);
01147
01163 basic_string&
01164 replace(size_type __pos, size_type __n1, const _CharT* __s)
01165 {
01166 __glibcxx_requires_string(__s);
01167 return this->replace(__pos, __n1, __s, traits_type::length(__s));
01168 }
01169
01186 basic_string&
01187 replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c)
01188 { return _M_replace_aux(_M_check(__pos, "basic_string::replace"),
01189 _M_limit(__pos, __n1), __n2, __c); }
01190
01204 basic_string&
01205 replace(iterator __i1, iterator __i2, const basic_string& __str)
01206 { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
01207
01222 basic_string&
01223 replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
01224 {
01225 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01226 && __i2 <= _M_iend());
01227 return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n);
01228 }
01229
01243 basic_string&
01244 replace(iterator __i1, iterator __i2, const _CharT* __s)
01245 {
01246 __glibcxx_requires_string(__s);
01247 return this->replace(__i1, __i2, __s, traits_type::length(__s));
01248 }
01249
01264 basic_string&
01265 replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
01266 {
01267 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01268 && __i2 <= _M_iend());
01269 return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __c);
01270 }
01271
01286 template<class _InputIterator>
01287 basic_string&
01288 replace(iterator __i1, iterator __i2,
01289 _InputIterator __k1, _InputIterator __k2)
01290 {
01291 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01292 && __i2 <= _M_iend());
01293 __glibcxx_requires_valid_range(__k1, __k2);
01294 typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
01295 return _M_replace_dispatch(__i1, __i2, __k1, __k2, _Integral());
01296 }
01297
01298
01299
01300 basic_string&
01301 replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2)
01302 {
01303 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01304 && __i2 <= _M_iend());
01305 __glibcxx_requires_valid_range(__k1, __k2);
01306 return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
01307 __k1, __k2 - __k1);
01308 }
01309
01310 basic_string&
01311 replace(iterator __i1, iterator __i2,
01312 const _CharT* __k1, const _CharT* __k2)
01313 {
01314 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01315 && __i2 <= _M_iend());
01316 __glibcxx_requires_valid_range(__k1, __k2);
01317 return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
01318 __k1, __k2 - __k1);
01319 }
01320
01321 basic_string&
01322 replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2)
01323 {
01324 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01325 && __i2 <= _M_iend());
01326 __glibcxx_requires_valid_range(__k1, __k2);
01327 return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
01328 __k1.base(), __k2 - __k1);
01329 }
01330
01331 basic_string&
01332 replace(iterator __i1, iterator __i2,
01333 const_iterator __k1, const_iterator __k2)
01334 {
01335 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
01336 && __i2 <= _M_iend());
01337 __glibcxx_requires_valid_range(__k1, __k2);
01338 return this->replace(__i1 - _M_ibegin(), __i2 - __i1,
01339 __k1.base(), __k2 - __k1);
01340 }
01341
01342 private:
01343 template<class _Integer>
01344 basic_string&
01345 _M_replace_dispatch(iterator __i1, iterator __i2, _Integer __n,
01346 _Integer __val, __true_type)
01347 { return _M_replace_aux(__i1 - _M_ibegin(), __i2 - __i1, __n, __val); }
01348
01349 template<class _InputIterator>
01350 basic_string&
01351 _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
01352 _InputIterator __k2, __false_type);
01353
01354 basic_string&
01355 _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
01356 _CharT __c)
01357 {
01358 if (this->max_size() - (this->size() - __n1) < __n2)
01359 __throw_length_error(__N("basic_string::_M_replace_aux"));
01360 _M_mutate(__pos1, __n1, __n2);
01361 if (__n2 == 1)
01362 _M_data()[__pos1] = __c;
01363 else if (__n2)
01364 traits_type::assign(_M_data() + __pos1, __n2, __c);
01365 return *this;
01366 }
01367
01368 basic_string&
01369 _M_replace_safe(size_type __pos1, size_type __n1, const _CharT* __s,
01370 size_type __n2)
01371 {
01372 _M_mutate(__pos1, __n1, __n2);
01373 if (__n2 == 1)
01374 _M_data()[__pos1] = *__s;
01375 else if (__n2)
01376 traits_type::copy(_M_data() + __pos1, __s, __n2);
01377 return *this;
01378 }
01379
01380
01381
01382 template<class _InIterator>
01383 static _CharT*
01384 _S_construct_aux(_InIterator __beg, _InIterator __end,
01385 const _Alloc& __a, __false_type)
01386 {
01387 typedef typename iterator_traits<_InIterator>::iterator_category _Tag;
01388 return _S_construct(__beg, __end, __a, _Tag());
01389 }
01390
01391 template<class _InIterator>
01392 static _CharT*
01393 _S_construct_aux(_InIterator __beg, _InIterator __end,
01394 const _Alloc& __a, __true_type)
01395 { return _S_construct(static_cast<size_type>(__beg),
01396 static_cast<value_type>(__end), __a); }
01397
01398 template<class _InIterator>
01399 static _CharT*
01400 _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
01401 {
01402 typedef typename _Is_integer<_InIterator>::_Integral _Integral;
01403 return _S_construct_aux(__beg, __end, __a, _Integral());
01404 }
01405
01406
01407 template<class _InIterator>
01408 static _CharT*
01409 _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a,
01410 input_iterator_tag);
01411
01412
01413
01414 template<class _FwdIterator>
01415 static _CharT*
01416 _S_construct(_FwdIterator __beg, _FwdIterator __end, const _Alloc& __a,
01417 forward_iterator_tag);
01418
01419 static _CharT*
01420 _S_construct(size_type __req, _CharT __c, const _Alloc& __a);
01421
01422 public:
01423
01435 size_type
01436 copy(_CharT* __s, size_type __n, size_type __pos = 0) const;
01437
01445 void
01446 swap(basic_string& __s);
01447
01448
01455 const _CharT*
01456 c_str() const { return _M_data(); }
01457
01464 const _CharT*
01465 data() const { return _M_data(); }
01466
01470 allocator_type
01471 get_allocator() const { return _M_dataplus; }
01472
01484 size_type
01485 find(const _CharT* __s, size_type __pos, size_type __n) const;
01486
01497 size_type
01498 find(const basic_string& __str, size_type __pos = 0) const
01499 { return this->find(__str.data(), __pos, __str.size()); }
01500
01511 size_type
01512 find(const _CharT* __s, size_type __pos = 0) const
01513 {
01514 __glibcxx_requires_string(__s);
01515 return this->find(__s, __pos, traits_type::length(__s));
01516 }
01517
01528 size_type
01529 find(_CharT __c, size_type __pos = 0) const;
01530
01541 size_type
01542 rfind(const basic_string& __str, size_type __pos = npos) const
01543 { return this->rfind(__str.data(), __pos, __str.size()); }
01544
01556 size_type
01557 rfind(const _CharT* __s, size_type __pos, size_type __n) const;
01558
01569 size_type
01570 rfind(const _CharT* __s, size_type __pos = npos) const
01571 {
01572 __glibcxx_requires_string(__s);
01573 return this->rfind(__s, __pos, traits_type::length(__s));
01574 }
01575
01586 size_type
01587 rfind(_CharT __c, size_type __pos = npos) const;
01588
01599 size_type
01600 find_first_of(const basic_string& __str, size_type __pos = 0) const
01601 { return this->find_first_of(__str.data(), __pos, __str.size()); }
01602
01614 size_type
01615 find_first_of(const _CharT* __s, size_type __pos, size_type __n) const;
01616
01627 size_type
01628 find_first_of(const _CharT* __s, size_type __pos = 0) const
01629 {
01630 __glibcxx_requires_string(__s);
01631 return this->find_first_of(__s, __pos, traits_type::length(__s));
01632 }
01633
01646 size_type
01647 find_first_of(_CharT __c, size_type __pos = 0) const
01648 { return this->find(__c, __pos); }
01649
01660 size_type
01661 find_last_of(const basic_string& __str, size_type __pos = npos) const
01662 { return this->find_last_of(__str.data(), __pos, __str.size()); }
01663
01675 size_type
01676 find_last_of(const _CharT* __s, size_type __pos, size_type __n) const;
01677
01688 size_type
01689 find_last_of(const _CharT* __s, size_type __pos = npos) const
01690 {
01691 __glibcxx_requires_string(__s);
01692 return this->find_last_of(__s, __pos, traits_type::length(__s));
01693 }
01694
01707 size_type
01708 find_last_of(_CharT __c, size_type __pos = npos) const
01709 { return this->rfind(__c, __pos); }
01710
01721 size_type
01722 find_first_not_of(const basic_string& __str, size_type __pos = 0) const
01723 { return this->find_first_not_of(__str.data(), __pos, __str.size()); }
01724
01736 size_type
01737 find_first_not_of(const _CharT* __s, size_type __pos,
01738 size_type __n) const;
01739
01750 size_type
01751 find_first_not_of(const _CharT* __s, size_type __pos = 0) const
01752 {
01753 __glibcxx_requires_string(__s);
01754 return this->find_first_not_of(__s, __pos, traits_type::length(__s));
01755 }
01756
01767 size_type
01768 find_first_not_of(_CharT __c, size_type __pos = 0) const;
01769
01780 size_type
01781 find_last_not_of(const basic_string& __str, size_type __pos = npos) const
01782 { return this->find_last_not_of(__str.data(), __pos, __str.size()); }
01783
01796 size_type
01797 find_last_not_of(const _CharT* __s, size_type __pos,
01798 size_type __n) const;
01809 size_type
01810 find_last_not_of(const _CharT* __s, size_type __pos = npos) const
01811 {
01812 __glibcxx_requires_string(__s);
01813 return this->find_last_not_of(__s, __pos, traits_type::length(__s));
01814 }
01815
01826 size_type
01827 find_last_not_of(_CharT __c, size_type __pos = npos) const;
01828
01841 basic_string
01842 substr(size_type __pos = 0, size_type __n = npos) const
01843 { return basic_string(*this,
01844 _M_check(__pos, "basic_string::substr"), __n); }
01845
01859 int
01860 compare(const basic_string& __str) const
01861 {
01862 const size_type __size = this->size();
01863 const size_type __osize = __str.size();
01864 const size_type __len = std::min(__size, __osize);
01865
01866 int __r = traits_type::compare(_M_data(), __str.data(), __len);
01867 if (!__r)
01868 __r = __size - __osize;
01869 return __r;
01870 }
01871
01889 int
01890 compare(size_type __pos, size_type __n, const basic_string& __str) const;
01891
01913 int
01914 compare(size_type __pos1, size_type __n1, const basic_string& __str,
01915 size_type __pos2, size_type __n2) const;
01916
01931 int
01932 compare(const _CharT* __s) const;
01933
01934
01935
01954 int
01955 compare(size_type __pos, size_type __n1, const _CharT* __s) const;
01956
01979 int
01980 compare(size_type __pos, size_type __n1, const _CharT* __s,
01981 size_type __n2) const;
01982 };
01983
01984 template<typename _CharT, typename _Traits, typename _Alloc>
01985 inline basic_string<_CharT, _Traits, _Alloc>::
01986 basic_string()
01987 #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
01988 : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
01989 #else
01990 : _M_dataplus(_S_construct(size_type(), _CharT(), _Alloc()), _Alloc()) { }
01991 #endif
01992
01993
02000 template<typename _CharT, typename _Traits, typename _Alloc>
02001 basic_string<_CharT, _Traits, _Alloc>
02002 operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02003 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02004 {
02005 basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
02006 __str.append(__rhs);
02007 return __str;
02008 }
02009
02016 template<typename _CharT, typename _Traits, typename _Alloc>
02017 basic_string<_CharT,_Traits,_Alloc>
02018 operator+(const _CharT* __lhs,
02019 const basic_string<_CharT,_Traits,_Alloc>& __rhs);
02020
02027 template<typename _CharT, typename _Traits, typename _Alloc>
02028 basic_string<_CharT,_Traits,_Alloc>
02029 operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Alloc>& __rhs);
02030
02037 template<typename _CharT, typename _Traits, typename _Alloc>
02038 inline basic_string<_CharT, _Traits, _Alloc>
02039 operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02040 const _CharT* __rhs)
02041 {
02042 basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
02043 __str.append(__rhs);
02044 return __str;
02045 }
02046
02053 template<typename _CharT, typename _Traits, typename _Alloc>
02054 inline basic_string<_CharT, _Traits, _Alloc>
02055 operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
02056 {
02057 typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
02058 typedef typename __string_type::size_type __size_type;
02059 __string_type __str(__lhs);
02060 __str.append(__size_type(1), __rhs);
02061 return __str;
02062 }
02063
02064
02071 template<typename _CharT, typename _Traits, typename _Alloc>
02072 inline bool
02073 operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02074 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02075 { return __lhs.compare(__rhs) == 0; }
02076
02083 template<typename _CharT, typename _Traits, typename _Alloc>
02084 inline bool
02085 operator==(const _CharT* __lhs,
02086 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02087 { return __rhs.compare(__lhs) == 0; }
02088
02095 template<typename _CharT, typename _Traits, typename _Alloc>
02096 inline bool
02097 operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02098 const _CharT* __rhs)
02099 { return __lhs.compare(__rhs) == 0; }
02100
02101
02108 template<typename _CharT, typename _Traits, typename _Alloc>
02109 inline bool
02110 operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02111 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02112 { return __rhs.compare(__lhs) != 0; }
02113
02120 template<typename _CharT, typename _Traits, typename _Alloc>
02121 inline bool
02122 operator!=(const _CharT* __lhs,
02123 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02124 { return __rhs.compare(__lhs) != 0; }
02125
02132 template<typename _CharT, typename _Traits, typename _Alloc>
02133 inline bool
02134 operator!=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02135 const _CharT* __rhs)
02136 { return __lhs.compare(__rhs) != 0; }
02137
02138
02145 template<typename _CharT, typename _Traits, typename _Alloc>
02146 inline bool
02147 operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02148 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02149 { return __lhs.compare(__rhs) < 0; }
02150
02157 template<typename _CharT, typename _Traits, typename _Alloc>
02158 inline bool
02159 operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02160 const _CharT* __rhs)
02161 { return __lhs.compare(__rhs) < 0; }
02162
02169 template<typename _CharT, typename _Traits, typename _Alloc>
02170 inline bool
02171 operator<(const _CharT* __lhs,
02172 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02173 { return __rhs.compare(__lhs) > 0; }
02174
02175
02182 template<typename _CharT, typename _Traits, typename _Alloc>
02183 inline bool
02184 operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02185 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02186 { return __lhs.compare(__rhs) > 0; }
02187
02194 template<typename _CharT, typename _Traits, typename _Alloc>
02195 inline bool
02196 operator>(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02197 const _CharT* __rhs)
02198 { return __lhs.compare(__rhs) > 0; }
02199
02206 template<typename _CharT, typename _Traits, typename _Alloc>
02207 inline bool
02208 operator>(const _CharT* __lhs,
02209 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02210 { return __rhs.compare(__lhs) < 0; }
02211
02212
02219 template<typename _CharT, typename _Traits, typename _Alloc>
02220 inline bool
02221 operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02222 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02223 { return __lhs.compare(__rhs) <= 0; }
02224
02231 template<typename _CharT, typename _Traits, typename _Alloc>
02232 inline bool
02233 operator<=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02234 const _CharT* __rhs)
02235 { return __lhs.compare(__rhs) <= 0; }
02236
02243 template<typename _CharT, typename _Traits, typename _Alloc>
02244 inline bool
02245 operator<=(const _CharT* __lhs,
02246 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02247 { return __rhs.compare(__lhs) >= 0; }
02248
02249
02256 template<typename _CharT, typename _Traits, typename _Alloc>
02257 inline bool
02258 operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02259 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02260 { return __lhs.compare(__rhs) >= 0; }
02261
02268 template<typename _CharT, typename _Traits, typename _Alloc>
02269 inline bool
02270 operator>=(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
02271 const _CharT* __rhs)
02272 { return __lhs.compare(__rhs) >= 0; }
02273
02280 template<typename _CharT, typename _Traits, typename _Alloc>
02281 inline bool
02282 operator>=(const _CharT* __lhs,
02283 const basic_string<_CharT, _Traits, _Alloc>& __rhs)
02284 { return __rhs.compare(__lhs) <= 0; }
02285
02293 template<typename _CharT, typename _Traits, typename _Alloc>
02294 inline void
02295 swap(basic_string<_CharT, _Traits, _Alloc>& __lhs,
02296 basic_string<_CharT, _Traits, _Alloc>& __rhs)
02297 { __lhs.swap(__rhs); }
02298
02310 template<typename _CharT, typename _Traits, typename _Alloc>
02311 basic_istream<_CharT, _Traits>&
02312 operator>>(basic_istream<_CharT, _Traits>& __is,
02313 basic_string<_CharT, _Traits, _Alloc>& __str);
02314
02324 template<typename _CharT, typename _Traits, typename _Alloc>
02325 basic_ostream<_CharT, _Traits>&
02326 operator<<(basic_ostream<_CharT, _Traits>& __os,
02327 const basic_string<_CharT, _Traits, _Alloc>& __str);
02328
02342 template<typename _CharT, typename _Traits, typename _Alloc>
02343 basic_istream<_CharT,_Traits>&
02344 getline(basic_istream<_CharT, _Traits>& __is,
02345 basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim);
02346
02359 template<typename _CharT, typename _Traits, typename _Alloc>
02360 inline basic_istream<_CharT,_Traits>&
02361 getline(basic_istream<_CharT, _Traits>& __is,
02362 basic_string<_CharT, _Traits, _Alloc>& __str);
02363 }
02364
02365 #endif