1/*
2 * Copyright (c) 1997-1999
3 * Silicon Graphics Computer Systems, Inc.
4 *
5 * Copyright (c) 1999
6 * Boris Fomitchev
7 *
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
10 *
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
16 */
17
18#ifndef _STLP_DBG_STRING_H
19#define _STLP_DBG_STRING_H
20
21#ifndef _STLP_DBG_ITERATOR_H
22#  include <stl/debug/_iterator.h>
23#endif
24
25_STLP_BEGIN_NAMESPACE
26
27#define _STLP_NON_DBG_STRING_NAME _STLP_NON_DBG_NAME(str)
28#define _STLP_NON_DBG_STRING _STLP_PRIV _STLP_NON_DBG_STRING_NAME <_CharT, _Traits, _Alloc>
29
30#if defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
31template <class _CharT,class _Traits, class _Alloc>
32inline _CharT*
33value_type(const _STLP_PRIV _DBG_iter_base< _STLP_NON_DBG_STRING >&)
34{ return (_CharT*)0; }
35template <class _CharT, class _Traits, class _Alloc>
36inline random_access_iterator_tag
37iterator_category(const _STLP_PRIV _DBG_iter_base< _STLP_NON_DBG_STRING >&)
38{ return random_access_iterator_tag(); }
39#endif
40
41template <class _CharT, class _Traits, class _Alloc>
42class basic_string :
43#if !defined (__DMC__)
44                     private
45#else
46                     public
47#endif
48                             _STLP_PRIV __construct_checker<_STLP_NON_DBG_STRING >
49#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (basic_string)
50                   , public __stlport_class<basic_string<_CharT, _Traits, _Alloc> >
51#endif
52{
53protected:
54  typedef _STLP_NON_DBG_STRING _Base;
55  typedef basic_string<_CharT, _Traits, _Alloc> _Self;
56  typedef _STLP_PRIV __construct_checker<_STLP_NON_DBG_STRING > _ConstructCheck;
57  typedef typename _IsPOD<_CharT>::_Type _Char_Is_POD;
58
59public:
60  __IMPORT_CONTAINER_TYPEDEFS(_Base)
61  typedef typename _Base::traits_type traits_type;
62  typedef _STLP_PRIV _DBG_iter<_Base, _STLP_PRIV _DbgTraits<_Nonconst_traits<value_type> > > iterator;
63  typedef _STLP_PRIV _DBG_iter<_Base, _STLP_PRIV _DbgTraits<_Const_traits<value_type> > > const_iterator;
64  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
65
66public:                         // Constructor, destructor, assignment.
67  typedef typename _Base::_Reserve_t _Reserve_t;
68
69private:
70  _Base _M_non_dbg_impl;
71  _STLP_PRIV __owned_list _M_iter_list;
72
73  void _Invalidate_all()
74  { _M_iter_list._Invalidate_all(); }
75  void _Compare_Capacity (size_type __old_capacity) {
76    if (this->capacity() > __old_capacity) {
77      _Invalidate_all();
78    }
79  }
80  void _Invalidate_iterator(const iterator& __it)
81  { _STLP_PRIV __invalidate_iterator(&_M_iter_list, __it); }
82  void _Invalidate_iterators(const iterator& __f, const iterator& __l)
83  { _STLP_PRIV __invalidate_range(&_M_iter_list, __f, __l); }
84
85public:
86#include <stl/_string_npos.h>
87
88  allocator_type get_allocator() const { return _M_non_dbg_impl.get_allocator(); }
89
90  explicit basic_string(const allocator_type& __a = allocator_type())
91    : _M_non_dbg_impl(__a), _M_iter_list(&_M_non_dbg_impl) {}
92
93  basic_string(_Reserve_t __r, size_t __n,
94               const allocator_type& __a = allocator_type())
95    : _M_non_dbg_impl(__r, __n, __a), _M_iter_list(&_M_non_dbg_impl) {}
96
97  basic_string(const _Self& __s)
98    : _ConstructCheck(__s),
99      _M_non_dbg_impl(__s._M_non_dbg_impl), _M_iter_list(&_M_non_dbg_impl) {}
100
101  basic_string(const _Self& __s, size_type __pos, size_type __n = npos,
102               const allocator_type& __a = allocator_type())
103    : _M_non_dbg_impl(__s._M_non_dbg_impl, __pos, __n, __a),
104      _M_iter_list(&_M_non_dbg_impl) {}
105
106  basic_string(const _CharT* __s, size_type __n,
107               const allocator_type& __a = allocator_type())
108    : _ConstructCheck(__s), _M_non_dbg_impl(__s, __n, __a),
109      _M_iter_list(&_M_non_dbg_impl) {}
110
111  basic_string(const _CharT* __s,
112               const allocator_type& __a = allocator_type())
113    : _ConstructCheck(__s),
114      _M_non_dbg_impl(__s, __a), _M_iter_list(&_M_non_dbg_impl) {}
115
116  basic_string(size_type __n, _CharT __c,
117               const allocator_type& __a = allocator_type())
118    : _M_non_dbg_impl(__n, __c, __a), _M_iter_list(&_M_non_dbg_impl) {}
119
120#if !defined (_STLP_NO_MOVE_SEMANTIC)
121  basic_string(__move_source<_Self> src)
122    : _M_non_dbg_impl(__move_source<_Base >(src.get()._M_non_dbg_impl)),
123      _M_iter_list(&_M_non_dbg_impl) {
124#  if defined (_STLP_NO_EXTENSIONS) || (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
125    src.get()._M_iter_list._Invalidate_all();
126#  else
127    src.get()._M_iter_list._Set_owner(_M_iter_list);
128#  endif
129  }
130#endif
131
132#if !defined (_STLP_MEMBER_TEMPLATES)
133  basic_string(const _CharT* __f, const _CharT* __l,
134               const allocator_type& __a = allocator_type())
135    : _ConstructCheck(__f, __l),
136      _M_non_dbg_impl(__f, __l, __a), _M_iter_list(&_M_non_dbg_impl) {
137  }
138  basic_string(const_iterator __f, const_iterator __l,
139               const allocator_type & __a = allocator_type())
140    : _ConstructCheck(__f, __l),
141      _M_non_dbg_impl(__f._M_iterator, __l._M_iterator, __a), _M_iter_list(&_M_non_dbg_impl) {
142  }
143#else
144  template <class _InputIterator>
145  basic_string(_InputIterator __f, _InputIterator __l,
146               const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL)
147    : _ConstructCheck(__f, __l),
148      _M_non_dbg_impl(_STLP_PRIV _Non_Dbg_iter(__f), _STLP_PRIV _Non_Dbg_iter(__l), __a),
149      _M_iter_list(&_M_non_dbg_impl) {}
150#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
151  template <class _InputIterator>
152  basic_string(_InputIterator __f, _InputIterator __l)
153    : _ConstructCheck(__f, __l),
154      _M_non_dbg_impl(_STLP_PRIV _Non_Dbg_iter(__f), _STLP_PRIV _Non_Dbg_iter(__l)),
155      _M_iter_list(&_M_non_dbg_impl) {}
156#  endif
157#endif
158
159private:
160  // constructor from non-debug version for substr
161  basic_string (const _Base& __x)
162    : _M_non_dbg_impl(__x), _M_iter_list(&_M_non_dbg_impl) {}
163
164public:
165  _Self& operator=(const _Self& __s) {
166    if (this != &__s) {
167      assign(__s);
168    }
169    return *this;
170  }
171
172  _Self& operator=(const _CharT* __s) {
173    _STLP_FIX_LITERAL_BUG(__s)
174    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
175    return assign(__s);
176  }
177
178  _Self& operator=(_CharT __c) {
179    return assign(1, __c);
180  }
181
182  // Iterators.
183  iterator begin() { return iterator(&_M_iter_list, _M_non_dbg_impl.begin()); }
184  const_iterator begin() const { return const_iterator(&_M_iter_list, _M_non_dbg_impl.begin()); }
185  iterator end() { return iterator(&_M_iter_list, _M_non_dbg_impl.end()); }
186  const_iterator end() const { return const_iterator(&_M_iter_list, _M_non_dbg_impl.end()); }
187
188  reverse_iterator rbegin()             { return reverse_iterator(end()); }
189  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
190  reverse_iterator rend()               { return reverse_iterator(begin()); }
191  const_reverse_iterator rend() const   { return const_reverse_iterator(begin()); }
192
193  // Size, capacity, etc.
194  size_type size() const { return _M_non_dbg_impl.size(); }
195  size_type length() const { return _M_non_dbg_impl.length(); }
196  size_t max_size() const { return _M_non_dbg_impl.max_size(); }
197
198  void resize(size_type __n, _CharT __c) {
199    if (__n > capacity())
200      _Invalidate_all();
201    else if (__n < size())
202      _Invalidate_iterators(begin() + __n, end());
203    _M_non_dbg_impl.resize(__n, __c);
204  }
205  void resize(size_type __n) { resize(__n, _STLP_DEFAULT_CONSTRUCTED(_CharT)); }
206  size_type capacity() const { return _M_non_dbg_impl.capacity(); }
207
208  void reserve(size_type __s = 0) {
209    if (__s > capacity()) _Invalidate_all();
210    _M_non_dbg_impl.reserve(__s);
211  }
212
213  void clear() {
214    _Invalidate_all();
215    _M_non_dbg_impl.clear();
216  }
217
218  bool empty() const { return _M_non_dbg_impl.empty(); }
219
220  const_reference operator[](size_type __n) const {
221    _STLP_VERBOSE_ASSERT(__n <= this->size(), _StlMsg_OUT_OF_BOUNDS);
222    return _M_non_dbg_impl[__n];
223  }
224
225  reference operator[](size_type __n) {
226    _STLP_VERBOSE_ASSERT(__n < this->size(), _StlMsg_OUT_OF_BOUNDS)
227    return _M_non_dbg_impl[__n];
228  }
229
230  const_reference at(size_type __n) const { return _M_non_dbg_impl.at(__n); }
231  reference at(size_type __n) { return _M_non_dbg_impl.at(__n); }
232
233  // Append, operator+=, push_back.
234  _Self& operator+=(const _Self& __s) { return append(__s); }
235  _Self& operator+=(const _CharT* __s) {
236    _STLP_FIX_LITERAL_BUG(__s)
237    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
238    return append(__s);
239  }
240  _Self& operator+=(_CharT __c) { return append(1, __c); }
241
242#if defined (_STLP_MEMBER_TEMPLATES)
243  template <class _InputIter>
244  _Self& append(_InputIter __first, _InputIter __last) {
245    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
246    size_type __old_capacity = capacity();
247    _M_non_dbg_impl.append(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
248    _Compare_Capacity(__old_capacity);
249    return *this;
250  }
251#endif
252
253#if !defined (_STLP_MEMBER_TEMPLATES) || \
254    !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS)
255  _Self& append(const _CharT* __f, const _CharT* __l) {
256    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
257    _STLP_DEBUG_CHECK(_STLP_PRIV __check_ptr_range(__f, __l))
258    size_type __old_capacity = capacity();
259    _M_non_dbg_impl.append(__f, __l);
260    _Compare_Capacity(__old_capacity);
261    return *this;
262  }
263
264  _Self& append(const_iterator __f, const_iterator __l) {
265    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l))
266    size_type __old_capacity = capacity();
267    _M_non_dbg_impl.append(__f._M_iterator, __l._M_iterator);
268    _Compare_Capacity(__old_capacity);
269    return *this;
270  }
271#endif
272
273  _Self& append(const _Self& __s) {
274    size_type __old_capacity = capacity();
275    _M_non_dbg_impl.append(__s._M_non_dbg_impl);
276    _Compare_Capacity(__old_capacity);
277    return *this;
278  }
279
280  _Self& append(const _Self& __s, size_type __pos, size_type __n) {
281    size_type __old_capacity = capacity();
282    _M_non_dbg_impl.append(__s._M_non_dbg_impl, __pos, __n);
283    _Compare_Capacity(__old_capacity);
284    return *this;
285  }
286
287  _Self& append(const _CharT* __s, size_type __n) {
288    _STLP_FIX_LITERAL_BUG(__s)
289    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
290    size_type __old_capacity = capacity();
291    _M_non_dbg_impl.append(__s, __n);
292    _Compare_Capacity(__old_capacity);
293    return *this;
294  }
295
296  _Self& append(const _CharT* __s) {
297    _STLP_FIX_LITERAL_BUG(__s)
298    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
299    size_type __old_capacity = capacity();
300    _M_non_dbg_impl.append(__s);
301    _Compare_Capacity(__old_capacity);
302    return *this;
303  }
304
305  _Self& append(size_type __n, _CharT __c) {
306    size_type __old_capacity = this->capacity();
307    _M_non_dbg_impl.append(__n, __c);
308    _Compare_Capacity(__old_capacity);
309    return *this;
310  }
311
312  void push_back(_CharT __c) {
313    size_type __old_capacity = this->capacity();
314    _M_non_dbg_impl.push_back(__c);
315    _Compare_Capacity(__old_capacity);
316  }
317
318  void pop_back() {
319    _Invalidate_iterator(this->end());
320    _M_non_dbg_impl.pop_back();
321  }
322
323  // Assign
324  _Self& assign(const _Self& __s) {
325    _Invalidate_all();
326    _M_non_dbg_impl.assign(__s._M_non_dbg_impl);
327    return *this;
328  }
329
330  _Self& assign(const _Self& __s, size_type __pos, size_type __n) {
331    if (__pos < __s.size()) {
332      _Invalidate_all();
333    }
334    _M_non_dbg_impl.assign(__s._M_non_dbg_impl, __pos, __n);
335    return *this;
336  }
337
338  _Self& assign(const _CharT* __s, size_type __n) {
339    _STLP_FIX_LITERAL_BUG(__s)
340    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
341    _Invalidate_all();
342    _M_non_dbg_impl.assign(__s, __s + __n);
343    return *this;
344  }
345
346  _Self& assign(const _CharT* __s) {
347    _STLP_FIX_LITERAL_BUG(__s)
348    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
349    _Invalidate_all();
350    _M_non_dbg_impl.assign(__s);
351    return *this;
352  }
353
354  _Self& assign(size_type __n, _CharT __c) {
355    _Invalidate_all();
356    _M_non_dbg_impl.assign(__n, __c);
357    return *this;
358  }
359
360#if defined(_STLP_MEMBER_TEMPLATES)
361  template <class _InputIter>
362  inline _Self& assign(_InputIter __first, _InputIter __last) {
363    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
364    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last))
365    _Invalidate_all();
366    _M_non_dbg_impl.assign(_STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
367    return *this;
368  }
369#endif
370
371#if !defined (_STLP_MEMBER_TEMPLATES) || \
372    !defined (_STLP_NO_METHOD_SPECIALIZATION) && !defined (_STLP_NO_EXTENSIONS)
373  _Self& assign(const _CharT* __f, const _CharT* __l) {
374    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
375    _STLP_DEBUG_CHECK(_STLP_PRIV __check_ptr_range(__f, __l))
376    _Invalidate_all();
377    _M_non_dbg_impl.assign(__f, __l);
378    return *this;
379  }
380  _Self& assign(const_iterator __f, const_iterator __l) {
381    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l))
382    _Invalidate_all();
383    _M_non_dbg_impl.assign(__f._M_iterator, __l._M_iterator);
384    return *this;
385  }
386#endif
387
388  // Insert
389  _Self& insert(size_type __pos, const _Self& __s) {
390    size_type __old_capacity = capacity();
391    _M_non_dbg_impl.insert(__pos, __s._M_non_dbg_impl);
392    _Compare_Capacity(__old_capacity);
393    return *this;
394  }
395
396  _Self& insert(size_type __pos, const _Self& __s,
397                size_type __beg, size_type __n) {
398    size_type __old_capacity = capacity();
399    _M_non_dbg_impl.insert(__pos, __s._M_non_dbg_impl, __beg, __n);
400    _Compare_Capacity(__old_capacity);
401    return *this;
402  }
403
404  _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {
405    _STLP_FIX_LITERAL_BUG(__s)
406    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
407    size_type __old_capacity = capacity();
408    _M_non_dbg_impl.insert(__pos, __s, __n);
409    _Compare_Capacity(__old_capacity);
410    return *this;
411  }
412
413  _Self& insert(size_type __pos, const _CharT* __s) {
414    _STLP_FIX_LITERAL_BUG(__s)
415    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
416    return insert(__pos, __s, _Traits::length(__s));
417  }
418
419  _Self& insert(size_type __pos, size_type __n, _CharT __c) {
420    size_type __old_capacity = capacity();
421    _M_non_dbg_impl.insert(__pos, __n, __c);
422    _Compare_Capacity(__old_capacity);
423    return *this;
424  }
425
426  iterator insert(iterator __p, _CharT __c) {
427    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__p))
428    size_type __old_capacity = capacity();
429    typename _Base::iterator __ret = _M_non_dbg_impl.insert(__p._M_iterator, __c);
430    _Compare_Capacity(__old_capacity);
431    return iterator(&_M_iter_list, __ret);
432  }
433
434  void insert(iterator __p, size_t __n, _CharT __c) {
435    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__p))
436    size_type __old_capacity = capacity();
437    _M_non_dbg_impl.insert(__p._M_iterator, __n, __c);
438    _Compare_Capacity(__old_capacity);
439  }
440
441#if defined (_STLP_MEMBER_TEMPLATES)
442  template <class _InputIter>
443  void insert(iterator __p, _InputIter __first, _InputIter __last) {
444    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__p))
445    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first,__last))
446
447    size_type __old_capacity = this->capacity();
448    _M_non_dbg_impl.insert(__p._M_iterator,
449                           _STLP_PRIV _Non_Dbg_iter(__first), _STLP_PRIV _Non_Dbg_iter(__last));
450    _Compare_Capacity(__old_capacity);
451  }
452#endif
453
454#if !defined (_STLP_MEMBER_TEMPLATES)
455  void insert(iterator __p, const _CharT* __f, const _CharT* __l) {
456    _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l)
457    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__p))
458    _STLP_DEBUG_CHECK(_STLP_PRIV __check_ptr_range(__f,__l))
459    size_type __old_capacity = capacity();
460    _M_non_dbg_impl.insert(__p._M_iterator, __f, __l);
461    _Compare_Capacity(__old_capacity);
462  }
463#endif
464
465#if !defined (_STLP_MEMBER_TEMPLATES) || !defined (_STLP_NO_METHOD_SPECIALIZATION)
466  // Those overloads are necessary to check self referencing correctly in non debug
467  // basic_string implementation
468  void insert(iterator __p, const_iterator __f, const_iterator __l) {
469    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__p))
470    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f,__l))
471#  if (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
472    _STLP_STD_DEBUG_CHECK(__check_if_not_owner(&_M_iter_list, __f))
473#  endif
474    size_type __old_capacity = capacity();
475    _M_non_dbg_impl.insert(__p._M_iterator, __f._M_iterator, __l._M_iterator);
476    _Compare_Capacity(__old_capacity);
477  }
478  void insert(iterator __p, iterator __f, iterator __l) {
479    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__p))
480    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f,__l))
481#  if (_STLP_DEBUG_LEVEL == _STLP_STANDARD_DBG_LEVEL)
482    _STLP_STD_DEBUG_CHECK(__check_if_not_owner(&_M_iter_list, __f))
483#  endif
484    size_type __old_capacity = capacity();
485    _M_non_dbg_impl.insert(__p._M_iterator, __f._M_iterator, __l._M_iterator);
486    _Compare_Capacity(__old_capacity);
487  }
488#endif
489
490  // Erase.
491  _Self& erase(size_type __pos = 0, size_type __n = npos) {
492    if (__pos < size()) {
493      _Invalidate_iterators(begin() + __pos, end());
494    }
495    _M_non_dbg_impl.erase(__pos, __n);
496    return *this;
497  }
498  iterator erase(iterator __pos) {
499    _STLP_DEBUG_CHECK(_STLP_PRIV _Dereferenceable(__pos))
500    _STLP_DEBUG_CHECK(_STLP_PRIV __check_if_owner(&_M_iter_list,__pos))
501    _Invalidate_iterators(__pos, end());
502    return iterator(&_M_iter_list, _M_non_dbg_impl.erase(__pos._M_iterator));
503  }
504  iterator erase(iterator __f, iterator __l) {
505    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l, begin(), end()))
506    _Invalidate_iterators(__f, end());
507    return iterator(&_M_iter_list, _M_non_dbg_impl.erase(__f._M_iterator, __l._M_iterator));
508  }
509
510  // Substring.
511  _Self substr(size_type __pos = 0, size_type __n = npos) const
512  { return _M_non_dbg_impl.substr(__pos, __n); }
513
514  // Replace.  (Conceptually equivalent to erase followed by insert.)
515  _Self& replace(size_type __pos, size_type __n, const _Self& __s) {
516    size_type __old_capacity = capacity();
517    _M_non_dbg_impl.replace(__pos, __n, __s._M_non_dbg_impl);
518    _Compare_Capacity(__old_capacity);
519    return *this;
520  }
521
522  _Self& replace(size_type __pos1, size_type __n1, const _Self& __s,
523                 size_type __pos2, size_type __n2) {
524    size_type __old_capacity = capacity();
525    _M_non_dbg_impl.replace(__pos1, __n1, __s._M_non_dbg_impl, __pos2, __n2);
526    _Compare_Capacity(__old_capacity);
527    return *this;
528  }
529
530  _Self& replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2) {
531    _STLP_FIX_LITERAL_BUG(__s)
532    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
533    size_type __old_capacity = capacity();
534    _M_non_dbg_impl.replace(__pos, __n1, __s, __n2);
535    _Compare_Capacity(__old_capacity);
536    return *this;
537  }
538
539  _Self& replace(size_type __pos, size_type __n1, const _CharT* __s) {
540    _STLP_FIX_LITERAL_BUG(__s)
541    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
542    size_type __old_capacity = capacity();
543    _M_non_dbg_impl.replace(__pos, __n1, __s);
544    _Compare_Capacity(__old_capacity);
545    return *this;
546  }
547
548  _Self& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) {
549    size_type __old_capacity = capacity();
550    _M_non_dbg_impl.replace(__pos, __n1, __n2, __c);
551    _Compare_Capacity(__old_capacity);
552    return *this;
553  }
554
555  _Self& replace(iterator __f, iterator __l, const _Self& __s) {
556    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l, begin(), end()))
557    size_type __old_capacity = capacity();
558    _M_non_dbg_impl.replace(__f._M_iterator, __l._M_iterator, __s._M_non_dbg_impl);
559    _Compare_Capacity(__old_capacity);
560    return *this;
561  }
562
563  _Self& replace(iterator __f, iterator __l, const _CharT* __s, size_type __n) {
564    _STLP_FIX_LITERAL_BUG(__s)
565    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l, begin(), end()))
566    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
567    size_type __old_capacity = capacity();
568    _M_non_dbg_impl.replace(__f._M_iterator, __l._M_iterator, __s, __n);
569    _Compare_Capacity(__old_capacity);
570    return *this;
571  }
572
573  _Self& replace(iterator __f, iterator __l, const _CharT* __s) {
574    _STLP_FIX_LITERAL_BUG(__s)
575    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l, begin(), end()))
576    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
577    size_type __old_capacity = capacity();
578    _M_non_dbg_impl.replace(__f._M_iterator, __l._M_iterator, __s);
579    _Compare_Capacity(__old_capacity);
580    return *this;
581  }
582
583  _Self& replace(iterator __f, iterator __l, size_type __n, _CharT __c) {
584    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l, begin(), end()))
585    size_type __old_capacity = capacity();
586    _M_non_dbg_impl.replace(__f._M_iterator, __l._M_iterator, __n, __c);
587    _Compare_Capacity(__old_capacity);
588    return *this;
589  }
590
591#if defined (_STLP_MEMBER_TEMPLATES)
592  template <class _InputIter>
593  _Self& replace(iterator __first, iterator __last,
594                 _InputIter __f, _InputIter __l) {
595    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last, begin(), end()))
596    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l))
597
598    size_type __old_capacity = capacity();
599    _M_non_dbg_impl.replace(__first._M_iterator, __last._M_iterator,
600                            _STLP_PRIV _Non_Dbg_iter(__f), _STLP_PRIV _Non_Dbg_iter(__l));
601    _Compare_Capacity(__old_capacity);
602    return *this;
603  }
604#endif
605
606#if !defined (_STLP_MEMBER_TEMPLATES)
607  _Self& replace(iterator __first, iterator __last,
608                 const _CharT* __f, const _CharT* __l) {
609    _STLP_FIX_LITERAL_BUG(__f)_STLP_FIX_LITERAL_BUG(__l)
610    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last, begin(), end()))
611    _STLP_DEBUG_CHECK(_STLP_PRIV __check_ptr_range(__f, __l))
612    size_type __old_capacity = capacity();
613    _M_non_dbg_impl.replace(__first._M_iterator, __last._M_iterator, __f, __l);
614    _Compare_Capacity(__old_capacity);
615    return *this;
616  }
617#endif
618
619#if !defined (_STLP_MEMBER_TEMPLATES) || !defined (_STLP_NO_METHOD_SPECIALIZATION)
620  _Self& replace(iterator __first, iterator __last,
621                 const_iterator __f, const_iterator __l) {
622    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last, begin(), end()))
623    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l))
624    size_type __old_capacity = capacity();
625    _M_non_dbg_impl.replace(__first._M_iterator, __last._M_iterator,
626                            __f._M_iterator, __l._M_iterator);
627    _Compare_Capacity(__old_capacity);
628    return *this;
629  }
630  _Self& replace(iterator __first, iterator __last,
631                 iterator __f, iterator __l) {
632    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last, begin(), end()))
633    _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__f, __l))
634    size_type __old_capacity = capacity();
635    _M_non_dbg_impl.replace(__first._M_iterator, __last._M_iterator,
636                            __f._M_iterator, __l._M_iterator);
637    _Compare_Capacity(__old_capacity);
638    return *this;
639  }
640#endif
641
642  // Other modifier member functions.
643  void swap(_Self& __s) {
644    _M_iter_list._Swap_owners(__s._M_iter_list);
645    _M_non_dbg_impl.swap(__s._M_non_dbg_impl);
646  }
647#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
648  void _M_swap_workaround(_Self& __x) { swap(__x); }
649#endif
650
651  int compare(const _Self& __s) const
652  { return _M_non_dbg_impl.compare(__s._M_non_dbg_impl); }
653  int compare(size_type __pos, size_type __n, const _Self& __s) const
654  { return _M_non_dbg_impl.compare(__pos, __n, __s._M_non_dbg_impl); }
655  int compare(size_type __pos1, size_type __n1, const _Self& __s,
656              size_type __pos2, size_type __n2) const
657  { return _M_non_dbg_impl.compare(__pos1, __n1, __s._M_non_dbg_impl, __pos2, __n2); }
658  int compare(const _CharT* __s) const {
659    _STLP_FIX_LITERAL_BUG(__s)
660    return _M_non_dbg_impl.compare(__s);
661  }
662  int compare(size_type __pos, size_type __n, const _CharT* __s) const {
663    _STLP_FIX_LITERAL_BUG(__s)
664    return _M_non_dbg_impl.compare(__pos, __n, __s);
665  }
666  int compare(size_type __pos1, size_type __n1, const _CharT* __s,
667              size_type __n2) const {
668    _STLP_FIX_LITERAL_BUG(__s)
669    return _M_non_dbg_impl.compare(__pos1, __n1, __s, __n2);
670  }
671
672  // Helper functions for compare.
673  static int _STLP_CALL _M_compare(const _CharT* __f1, const _CharT* __l1,
674                                   const _CharT* __f2, const _CharT* __l2)
675  { return _Base::_M_compare(__f1, __l1, __f2, __l2); }
676  static int _STLP_CALL _M_compare(const_iterator __f1, const_iterator __l1,
677                                   const _CharT* __f2, const _CharT* __l2)
678  { return _Base::_M_compare(__f1._M_iterator, __l1._M_iterator, __f2, __l2); }
679  static int _STLP_CALL _M_compare(const _CharT* __f1, const _CharT* __l1,
680                                   const_iterator __f2, const_iterator __l2)
681  { return _Base::_M_compare(__f1, __l1, __f2._M_iterator, __l2._M_iterator); }
682  static int _STLP_CALL _M_compare(const_iterator __f1, const_iterator __l1,
683                                   const_iterator __f2, const_iterator __l2)
684  { return _Base::_M_compare(__f1._M_iterator, __l1._M_iterator, __f2._M_iterator, __l2._M_iterator); }
685
686  const _CharT* c_str() const { return _M_non_dbg_impl.c_str(); }
687  const _CharT* data()  const { return _M_non_dbg_impl.data(); }
688
689  size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
690  { return _M_non_dbg_impl.copy(__s, __n, __pos); }
691
692  // find.
693  size_type find(const _Self& __s, size_type __pos = 0) const
694  { return _M_non_dbg_impl.find(__s._M_non_dbg_impl, __pos); }
695  size_type find(const _CharT* __s, size_type __pos = 0) const {
696    _STLP_FIX_LITERAL_BUG(__s)
697    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
698    return _M_non_dbg_impl.find(__s, __pos);
699  }
700  size_type find(const _CharT* __s, size_type __pos, size_type __n) const {
701    _STLP_FIX_LITERAL_BUG(__s)
702    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
703    return _M_non_dbg_impl.find(__s, __pos, __n);
704  }
705  // WIE: Versant schema compiler 5.2.2 ICE workaround
706  size_type find(_CharT __c) const { return find(__c, 0); }
707  size_type find(_CharT __c, size_type __pos /* = 0 */) const
708  { return _M_non_dbg_impl.find(__c, __pos); }
709
710  // rfind.
711  size_type rfind(const _Self& __s, size_type __pos = npos) const
712  { return _M_non_dbg_impl.rfind(__s._M_non_dbg_impl, __pos); }
713  size_type rfind(const _CharT* __s, size_type __pos = npos) const {
714    _STLP_FIX_LITERAL_BUG(__s)
715    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
716    return _M_non_dbg_impl.rfind(__s, __pos);
717  }
718  size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const {
719    _STLP_FIX_LITERAL_BUG(__s)
720    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
721    return _M_non_dbg_impl.rfind(__s, __pos, __n);
722  }
723  size_type rfind(_CharT __c, size_type __pos = npos) const
724  { return _M_non_dbg_impl.rfind(__c, __pos); }
725
726  // find_first_of
727  size_type find_first_of(const _Self& __s, size_type __pos = 0) const
728  { return _M_non_dbg_impl.find_first_of(__s._M_non_dbg_impl, __pos); }
729  size_type find_first_of(const _CharT* __s, size_type __pos = 0) const {
730    _STLP_FIX_LITERAL_BUG(__s)
731    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
732    return _M_non_dbg_impl.find_first_of(__s, __pos);
733  }
734  size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const {
735    _STLP_FIX_LITERAL_BUG(__s)
736    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
737    return _M_non_dbg_impl.find_first_of(__s, __pos, __n);
738  }
739  size_type find_first_of(_CharT __c, size_type __pos = 0) const
740  { return _M_non_dbg_impl.find_first_of(__c, __pos); }
741
742  // find_last_of
743  size_type find_last_of(const _Self& __s, size_type __pos = npos) const
744  { return _M_non_dbg_impl.find_last_of(__s._M_non_dbg_impl, __pos); }
745  size_type find_last_of(const _CharT* __s, size_type __pos = npos) const {
746    _STLP_FIX_LITERAL_BUG(__s)
747    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
748    return _M_non_dbg_impl.find_last_of(__s, __pos);
749  }
750  size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const {
751    _STLP_FIX_LITERAL_BUG(__s)
752    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
753    return _M_non_dbg_impl.find_last_of(__s, __pos, __n);
754  }
755  size_type find_last_of(_CharT __c, size_type __pos = npos) const
756  { return _M_non_dbg_impl.rfind(__c, __pos); }
757
758  // find_first_not_of
759  size_type find_first_not_of(const _Self& __s, size_type __pos = 0) const
760  { return _M_non_dbg_impl.find_first_not_of(__s._M_non_dbg_impl, __pos); }
761  size_type find_first_not_of(const _CharT* __s, size_type __pos = 0) const {
762    _STLP_FIX_LITERAL_BUG(__s)
763    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
764    return _M_non_dbg_impl.find_first_not_of(__s, __pos);
765  }
766  size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const {
767    _STLP_FIX_LITERAL_BUG(__s)
768    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
769    return _M_non_dbg_impl.find_first_not_of(__s, __pos, __n);
770  }
771  size_type find_first_not_of(_CharT __c, size_type __pos = 0) const
772  { return _M_non_dbg_impl.find_first_not_of(__c, __pos); }
773
774  // find_last_not_of
775  size_type find_last_not_of(const _Self& __s, size_type __pos = npos) const
776  { return _M_non_dbg_impl.find_last_not_of(__s._M_non_dbg_impl, __pos); }
777  size_type find_last_not_of(const _CharT* __s, size_type __pos = npos) const {
778    _STLP_FIX_LITERAL_BUG(__s)
779    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
780    return _M_non_dbg_impl.find_last_not_of(__s, __pos);
781  }
782  size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const {
783    _STLP_FIX_LITERAL_BUG(__s)
784    _STLP_VERBOSE_ASSERT((__s != 0), _StlMsg_INVALID_ARGUMENT)
785    return _M_non_dbg_impl.find_last_not_of(__s, __pos, __n);
786  }
787  size_type find_last_not_of(_CharT __c, size_type __pos = npos) const
788  { return _M_non_dbg_impl.find_last_not_of(__c, __pos); }
789
790#if defined (_STLP_USE_TEMPLATE_EXPRESSION)
791#  include <stl/debug/_string_sum_methods.h>
792#endif
793};
794
795// This is a hook to instantiate STLport exports in a designated DLL
796#if defined (_STLP_USE_TEMPLATE_EXPORT) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
797_STLP_MOVE_TO_PRIV_NAMESPACE
798_STLP_EXPORT_TEMPLATE_CLASS __construct_checker<_STLP_NON_DBG_STRING_NAME <char, char_traits<char>, allocator<char> > >;
799_STLP_MOVE_TO_STD_NAMESPACE
800_STLP_EXPORT_TEMPLATE_CLASS basic_string<char, char_traits<char>, allocator<char> >;
801#  if defined (_STLP_HAS_WCHAR_T)
802_STLP_MOVE_TO_PRIV_NAMESPACE
803_STLP_EXPORT_TEMPLATE_CLASS __construct_checker<_STLP_NON_DBG_STRING_NAME <wchar_t, char_traits<wchar_t>, allocator<wchar_t> > >;
804_STLP_MOVE_TO_STD_NAMESPACE
805_STLP_EXPORT_TEMPLATE_CLASS basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
806#  endif
807#endif
808
809#undef _STLP_NON_DBG_STRING
810#undef _STLP_NON_DBG_STRING_NAME
811
812#if defined (__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 96)
813template <class _CharT, class _Traits, class _Alloc>
814const size_t basic_string<_CharT, _Traits, _Alloc>::npos = ~(size_t) 0;
815#endif
816
817#if defined (basic_string)
818_STLP_MOVE_TO_STD_NAMESPACE
819#undef basic_string
820#endif
821
822_STLP_END_NAMESPACE
823
824#endif /* _STLP_DBG_STRING */
825
826// Local Variables:
827// mode:C++
828// End:
829