epoc32/include/tools/stlport/stl/_string.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/*
williamr@4
     2
 *
williamr@4
     3
 *
williamr@4
     4
 * Copyright (c) 1994
williamr@4
     5
 * Hewlett-Packard Company
williamr@4
     6
 *
williamr@4
     7
 * Copyright (c) 1996,1997
williamr@4
     8
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     9
 *
williamr@4
    10
 * Copyright (c) 1997
williamr@4
    11
 * Moscow Center for SPARC Technology
williamr@4
    12
 *
williamr@4
    13
 * Copyright (c) 1999
williamr@4
    14
 * Boris Fomitchev
williamr@4
    15
 *
williamr@4
    16
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    17
 * or implied. Any use is at your own risk.
williamr@4
    18
 *
williamr@4
    19
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    20
 * without fee, provided the above notices are retained on all copies.
williamr@4
    21
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    22
 * provided the above notices are retained, and a notice that the code was
williamr@4
    23
 * modified is included with the above copyright notice.
williamr@4
    24
 *
williamr@4
    25
 */
williamr@4
    26
#ifndef _STLP_STRING_C
williamr@4
    27
#define _STLP_STRING_C
williamr@4
    28
williamr@4
    29
#ifndef _STLP_INTERNAL_STRING_H
williamr@4
    30
#  include <stl/_string.h>
williamr@4
    31
#endif
williamr@4
    32
williamr@4
    33
#ifndef _STLP_INTERNAL_CTRAITS_FUNCTIONS_H
williamr@4
    34
#  include <stl/_ctraits_fns.h>
williamr@4
    35
#endif
williamr@4
    36
williamr@4
    37
#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
williamr@4
    38
#  define basic_string _STLP_NO_MEM_T_NAME(str)
williamr@4
    39
#elif defined (_STLP_DEBUG)
williamr@4
    40
#  define basic_string _STLP_NON_DBG_NAME(str)
williamr@4
    41
#endif
williamr@4
    42
williamr@4
    43
#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
williamr@4
    44
#  define __size_type__ size_t
williamr@4
    45
#  define size_type size_t
williamr@4
    46
#  define iterator _CharT*
williamr@4
    47
#else
williamr@4
    48
#  define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_string<_CharT,_Traits,_Alloc>::size_type
williamr@4
    49
#endif
williamr@4
    50
williamr@4
    51
_STLP_BEGIN_NAMESPACE
williamr@4
    52
williamr@4
    53
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    54
williamr@4
    55
// A helper class to use a char_traits as a function object.
williamr@4
    56
template <class _Traits>
williamr@4
    57
struct _Not_within_traits : public unary_function<typename _Traits::char_type, bool> {
williamr@4
    58
  typedef typename _Traits::char_type _CharT;
williamr@4
    59
  const _CharT* _M_first;
williamr@4
    60
  const _CharT* _M_last;
williamr@4
    61
williamr@4
    62
  _Not_within_traits(const _CharT* __f, const _CharT* __l)
williamr@4
    63
    : _M_first(__f), _M_last(__l) {}
williamr@4
    64
williamr@4
    65
  bool operator()(const _CharT& __x) const {
williamr@4
    66
    return find_if(_M_first, _M_last,
williamr@4
    67
                   _STLP_PRIV _Eq_char_bound<_Traits>(__x)) == _M_last;
williamr@4
    68
  }
williamr@4
    69
};
williamr@4
    70
williamr@4
    71
// ------------------------------------------------------------
williamr@4
    72
// Non-inline declarations.
williamr@4
    73
williamr@4
    74
#if !defined (basic_string)
williamr@4
    75
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
    76
#endif
williamr@4
    77
williamr@4
    78
// Change the string's capacity so that it is large enough to hold
williamr@4
    79
//  at least __res_arg elements, plus the terminating _CharT().  Note that,
williamr@4
    80
//  if __res_arg < capacity(), this member function may actually decrease
williamr@4
    81
//  the string's capacity.
williamr@4
    82
template <class _CharT, class _Traits, class _Alloc>
williamr@4
    83
void basic_string<_CharT,_Traits,_Alloc>::reserve(size_type __res_arg) {
williamr@4
    84
  if (__res_arg > max_size())
williamr@4
    85
    this->_M_throw_length_error();
williamr@4
    86
williamr@4
    87
  size_type __n = (max)(__res_arg, size()) + 1;
williamr@4
    88
  if (__n <= capacity() + 1)
williamr@4
    89
    return;
williamr@4
    90
williamr@4
    91
  pointer __new_start = this->_M_end_of_storage.allocate(__n, __n);
williamr@4
    92
  pointer __new_finish = __new_start;
williamr@4
    93
williamr@4
    94
  _STLP_TRY {
williamr@4
    95
    __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), this->_M_Finish(), __new_start);
williamr@4
    96
    _M_construct_null(__new_finish);
williamr@4
    97
  }
williamr@4
    98
  _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start, __new_finish),
williamr@4
    99
                this->_M_end_of_storage.deallocate(__new_start, __n)))
williamr@4
   100
williamr@4
   101
  this->_M_destroy_range();
williamr@4
   102
  this->_M_deallocate_block();
williamr@4
   103
  this->_M_reset(__new_start, __new_finish, __new_start + __n);
williamr@4
   104
}
williamr@4
   105
williamr@4
   106
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   107
basic_string<_CharT,_Traits,_Alloc>&
williamr@4
   108
basic_string<_CharT,_Traits,_Alloc>::append(size_type __n, _CharT __c) {
williamr@4
   109
  if (__n > max_size() || size() > max_size() - __n)
williamr@4
   110
    this->_M_throw_length_error();
williamr@4
   111
  if (size() + __n > capacity())
williamr@4
   112
    reserve(size() + (max)(size(), __n));
williamr@4
   113
  if (__n > 0) {
williamr@4
   114
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   115
    if (this->_M_using_static_buf())
williamr@4
   116
      _Traits::assign(this->_M_finish + 1, __n - 1, __c);
williamr@4
   117
    else
williamr@4
   118
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   119
    _STLP_PRIV __uninitialized_fill_n(this->_M_finish + 1, __n - 1, __c);
williamr@4
   120
    _STLP_TRY {
williamr@4
   121
      _M_construct_null(this->_M_finish + __n);
williamr@4
   122
    }
williamr@4
   123
    _STLP_UNWIND(this->_M_destroy_ptr_range(this->_M_finish + 1, this->_M_finish + __n))
williamr@4
   124
    _Traits::assign(*end(), __c);
williamr@4
   125
    this->_M_finish += __n;
williamr@4
   126
  }
williamr@4
   127
  return *this;
williamr@4
   128
}
williamr@4
   129
williamr@4
   130
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   131
basic_string<_CharT, _Traits, _Alloc>&
williamr@4
   132
basic_string<_CharT, _Traits, _Alloc>::_M_append(const _CharT* __first, const _CharT* __last) {
williamr@4
   133
  if (__first != __last) {
williamr@4
   134
    const size_type __old_size = size();
williamr@4
   135
    ptrdiff_t __n = __last - __first;
williamr@4
   136
    if ((size_type)__n > max_size() || __old_size > max_size() - __n)
williamr@4
   137
      this->_M_throw_length_error();
williamr@4
   138
    if (__old_size + __n > capacity()) {
williamr@4
   139
      size_type __len = __old_size + (max)(__old_size, (size_t) __n) + 1;
williamr@4
   140
      pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
williamr@4
   141
      pointer __new_finish = __new_start;
williamr@4
   142
      _STLP_TRY {
williamr@4
   143
        __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), this->_M_Finish(), __new_start);
williamr@4
   144
        __new_finish = _STLP_PRIV __ucopy(__first, __last, __new_finish);
williamr@4
   145
        _M_construct_null(__new_finish);
williamr@4
   146
      }
williamr@4
   147
      _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
williamr@4
   148
                    this->_M_end_of_storage.deallocate(__new_start,__len)))
williamr@4
   149
      this->_M_destroy_range();
williamr@4
   150
      this->_M_deallocate_block();
williamr@4
   151
      this->_M_reset(__new_start, __new_finish, __new_start + __len);
williamr@4
   152
    }
williamr@4
   153
    else {
williamr@4
   154
      const _CharT* __f1 = __first;
williamr@4
   155
      ++__f1;
williamr@4
   156
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   157
      if (this->_M_using_static_buf())
williamr@4
   158
        _M_copy(__f1, __last, this->_M_Finish() + 1);
williamr@4
   159
      else
williamr@4
   160
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   161
      _STLP_PRIV __ucopy(__f1, __last, this->_M_finish + 1);
williamr@4
   162
      _STLP_TRY {
williamr@4
   163
        _M_construct_null(this->_M_finish + __n);
williamr@4
   164
      }
williamr@4
   165
      _STLP_UNWIND(this->_M_destroy_ptr_range(this->_M_finish + 1, this->_M_finish + __n))
williamr@4
   166
      _Traits::assign(*end(), *__first);
williamr@4
   167
      this->_M_finish += __n;
williamr@4
   168
    }
williamr@4
   169
  }
williamr@4
   170
  return *this;
williamr@4
   171
}
williamr@4
   172
williamr@4
   173
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   174
basic_string<_CharT,_Traits,_Alloc>&
williamr@4
   175
basic_string<_CharT,_Traits,_Alloc>::assign(size_type __n, _CharT __c) {
williamr@4
   176
  if (__n <= size()) {
williamr@4
   177
    _Traits::assign(this->_M_Start(), __n, __c);
williamr@4
   178
    erase(begin() + __n, end());
williamr@4
   179
  }
williamr@4
   180
  else {
williamr@4
   181
    if (__n < capacity()) {
williamr@4
   182
      _Traits::assign(this->_M_Start(), size(), __c);
williamr@4
   183
      append(__n - size(), __c);
williamr@4
   184
    }
williamr@4
   185
    else {
williamr@4
   186
      _Self __str(__n, __c);
williamr@4
   187
      this->swap(__str);
williamr@4
   188
    }
williamr@4
   189
  }
williamr@4
   190
  return *this;
williamr@4
   191
}
williamr@4
   192
williamr@4
   193
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   194
basic_string<_CharT,_Traits,_Alloc>&
williamr@4
   195
basic_string<_CharT,_Traits,_Alloc>::_M_assign(const _CharT* __f, const _CharT* __l) {
williamr@4
   196
  ptrdiff_t __n = __l - __f;
williamr@4
   197
  if (__STATIC_CAST(size_type, __n) <= size()) {
williamr@4
   198
    _Traits::copy(this->_M_Start(), __f, __n);
williamr@4
   199
    erase(begin() + __n, end());
williamr@4
   200
  }
williamr@4
   201
  else {
williamr@4
   202
    _Traits::copy(this->_M_Start(), __f, size());
williamr@4
   203
    _M_append(__f + size(), __l);
williamr@4
   204
  }
williamr@4
   205
  return *this;
williamr@4
   206
}
williamr@4
   207
williamr@4
   208
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   209
_CharT* basic_string<_CharT,_Traits,_Alloc> ::_M_insert_aux(_CharT* __p,
williamr@4
   210
                                                            _CharT __c) {
williamr@4
   211
  pointer __new_pos = __p;
williamr@4
   212
  if (this->_M_finish + 1 < this->_M_end_of_storage._M_data) {
williamr@4
   213
    _M_construct_null(this->_M_finish + 1);
williamr@4
   214
    _Traits::move(__p + 1, __p, this->_M_finish - __p);
williamr@4
   215
    _Traits::assign(*__p, __c);
williamr@4
   216
    ++this->_M_finish;
williamr@4
   217
  }
williamr@4
   218
  else {
williamr@4
   219
    const size_type __old_len = size();
williamr@4
   220
    size_type __len = __old_len + (max)(__old_len, __STATIC_CAST(size_type,1)) + 1;
williamr@4
   221
    pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
williamr@4
   222
    pointer __new_finish = __new_start;
williamr@4
   223
    _STLP_TRY {
williamr@4
   224
      __new_pos = _STLP_PRIV __ucopy(this->_M_Start(), __p, __new_start);
williamr@4
   225
      _Copy_Construct(__new_pos, __c);
williamr@4
   226
      __new_finish = __new_pos + 1;
williamr@4
   227
      __new_finish = _STLP_PRIV __ucopy(__p, this->_M_finish, __new_finish);
williamr@4
   228
      _M_construct_null(__new_finish);
williamr@4
   229
    }
williamr@4
   230
    _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
williamr@4
   231
                  this->_M_end_of_storage.deallocate(__new_start,__len)))
williamr@4
   232
    this->_M_destroy_range();
williamr@4
   233
    this->_M_deallocate_block();
williamr@4
   234
    this->_M_reset(__new_start, __new_finish, __new_start + __len);
williamr@4
   235
  }
williamr@4
   236
  return __new_pos;
williamr@4
   237
}
williamr@4
   238
williamr@4
   239
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   240
void basic_string<_CharT,_Traits,_Alloc>::insert(iterator __pos,
williamr@4
   241
                                                 size_t __n, _CharT __c) {
williamr@4
   242
  if (__n != 0) {
williamr@4
   243
    if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n + 1) {
williamr@4
   244
      const size_type __elems_after = this->_M_finish - __pos;
williamr@4
   245
      pointer __old_finish = this->_M_finish;
williamr@4
   246
      if (__elems_after >= __n) {
williamr@4
   247
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   248
        if (this->_M_using_static_buf())
williamr@4
   249
          _M_copy((this->_M_finish - __n) + 1, this->_M_finish + 1, this->_M_finish + 1);
williamr@4
   250
        else
williamr@4
   251
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   252
        _STLP_PRIV __ucopy((this->_M_finish - __n) + 1, this->_M_finish + 1,
williamr@4
   253
                           this->_M_finish + 1);
williamr@4
   254
        this->_M_finish += __n;
williamr@4
   255
        _Traits::move(__pos + __n, __pos, (__elems_after - __n) + 1);
williamr@4
   256
        _Traits::assign(__pos, __n, __c);
williamr@4
   257
      }
williamr@4
   258
      else {
williamr@4
   259
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   260
        if (this->_M_using_static_buf())
williamr@4
   261
          _Traits::assign(this->_M_finish + 1, __n - __elems_after - 1, __c);
williamr@4
   262
        else
williamr@4
   263
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   264
        _STLP_PRIV __uninitialized_fill_n(this->_M_finish + 1, __n - __elems_after - 1, __c);
williamr@4
   265
        this->_M_finish += __n - __elems_after;
williamr@4
   266
        _STLP_TRY {
williamr@4
   267
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   268
          if (this->_M_using_static_buf())
williamr@4
   269
            _M_copy(__pos, __old_finish + 1, this->_M_finish);
williamr@4
   270
          else
williamr@4
   271
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   272
          _STLP_PRIV __ucopy(__pos, __old_finish + 1, this->_M_finish);
williamr@4
   273
          this->_M_finish += __elems_after;
williamr@4
   274
        }
williamr@4
   275
        _STLP_UNWIND((_STLP_STD::_Destroy_Range(__old_finish + 1, this->_M_finish),
williamr@4
   276
                      this->_M_finish = __old_finish))
williamr@4
   277
        _Traits::assign(__pos, __elems_after + 1, __c);
williamr@4
   278
      }
williamr@4
   279
    }
williamr@4
   280
    else {
williamr@4
   281
      const size_type __old_size = size();
williamr@4
   282
      size_type __len = __old_size + (max)(__old_size, __n) + 1;
williamr@4
   283
      pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
williamr@4
   284
      pointer __new_finish = __new_start;
williamr@4
   285
      _STLP_TRY {
williamr@4
   286
        __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), __pos, __new_start);
williamr@4
   287
        __new_finish = _STLP_PRIV __uninitialized_fill_n(__new_finish, __n, __c);
williamr@4
   288
        __new_finish = _STLP_PRIV __ucopy(__pos, this->_M_finish, __new_finish);
williamr@4
   289
        _M_construct_null(__new_finish);
williamr@4
   290
      }
williamr@4
   291
      _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
williamr@4
   292
                    this->_M_end_of_storage.deallocate(__new_start,__len)))
williamr@4
   293
      this->_M_destroy_range();
williamr@4
   294
      this->_M_deallocate_block();
williamr@4
   295
      this->_M_reset(__new_start, __new_finish, __new_start + __len);
williamr@4
   296
    }
williamr@4
   297
  }
williamr@4
   298
}
williamr@4
   299
williamr@4
   300
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   301
void basic_string<_CharT,_Traits,_Alloc>::_M_insert(iterator __pos,
williamr@4
   302
                                                    const _CharT* __first, const _CharT* __last,
williamr@4
   303
                                                    bool __self_ref) {
williamr@4
   304
  //this version has to take care about the auto referencing
williamr@4
   305
  if (__first != __last) {
williamr@4
   306
    const ptrdiff_t __n = __last - __first;
williamr@4
   307
    if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) {
williamr@4
   308
      const ptrdiff_t __elems_after = this->_M_finish - __pos;
williamr@4
   309
      pointer __old_finish = this->_M_finish;
williamr@4
   310
      if (__elems_after >= __n) {
williamr@4
   311
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   312
        if (this->_M_using_static_buf())
williamr@4
   313
          _M_copy((this->_M_finish - __n) + 1, this->_M_finish + 1, this->_M_finish + 1);
williamr@4
   314
        else
williamr@4
   315
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   316
        _STLP_PRIV __ucopy((this->_M_finish - __n) + 1, this->_M_finish + 1, this->_M_finish + 1);
williamr@4
   317
        this->_M_finish += __n;
williamr@4
   318
        _Traits::move(__pos + __n, __pos, (__elems_after - __n) + 1);
williamr@4
   319
        if (!__self_ref || __last < __pos) {
williamr@4
   320
          _M_copy(__first, __last, __pos);
williamr@4
   321
        }
williamr@4
   322
        else {
williamr@4
   323
          //We have to check that the source buffer hasn't move
williamr@4
   324
          if (__first >= __pos) {
williamr@4
   325
            //The source buffer has move
williamr@4
   326
            __first += __n;
williamr@4
   327
            __last += __n;
williamr@4
   328
            _M_copy(__first, __last, __pos);
williamr@4
   329
          }
williamr@4
   330
          else {
williamr@4
   331
            //The source buffer hasn't move, it has been duplicated
williamr@4
   332
            _M_move(__first, __last, __pos);
williamr@4
   333
          }
williamr@4
   334
        }
williamr@4
   335
      }
williamr@4
   336
      else {
williamr@4
   337
        const_iterator __mid = __first;
williamr@4
   338
        __mid += __elems_after + 1;
williamr@4
   339
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   340
        if (this->_M_using_static_buf())
williamr@4
   341
          _M_copy(__mid, __last, this->_M_finish + 1);
williamr@4
   342
        else
williamr@4
   343
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   344
        _STLP_PRIV __ucopy(__mid, __last, this->_M_finish + 1);
williamr@4
   345
        this->_M_finish += __n - __elems_after;
williamr@4
   346
        _STLP_TRY {
williamr@4
   347
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   348
          if (this->_M_using_static_buf())
williamr@4
   349
            _M_copy(__pos, __old_finish + 1, this->_M_finish);
williamr@4
   350
          else
williamr@4
   351
#endif /* _STLP_USE_SHORT_STRING_OPTIM */
williamr@4
   352
          _STLP_PRIV __ucopy(__pos, __old_finish + 1, this->_M_finish);
williamr@4
   353
          this->_M_finish += __elems_after;
williamr@4
   354
        }
williamr@4
   355
        _STLP_UNWIND((_STLP_STD::_Destroy_Range(__old_finish + 1, this->_M_finish),
williamr@4
   356
                      this->_M_finish = __old_finish))
williamr@4
   357
        if (!__self_ref)
williamr@4
   358
          _M_copy(__first, __mid, __pos);
williamr@4
   359
        else
williamr@4
   360
          _M_move(__first, __mid, __pos);
williamr@4
   361
      }
williamr@4
   362
    }
williamr@4
   363
    else {
williamr@4
   364
      const size_type __old_size = size();
williamr@4
   365
      size_type __len = __old_size + (max)(__old_size, __STATIC_CAST(const size_type,__n)) + 1;
williamr@4
   366
      pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
williamr@4
   367
      pointer __new_finish = __new_start;
williamr@4
   368
      _STLP_TRY {
williamr@4
   369
        __new_finish = _STLP_PRIV __ucopy(this->_M_Start(), __pos, __new_start);
williamr@4
   370
        __new_finish = _STLP_PRIV __ucopy(__first, __last, __new_finish);
williamr@4
   371
        __new_finish = _STLP_PRIV __ucopy(__pos, this->_M_finish, __new_finish);
williamr@4
   372
        _M_construct_null(__new_finish);
williamr@4
   373
      }
williamr@4
   374
      _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
williamr@4
   375
                    this->_M_end_of_storage.deallocate(__new_start,__len)))
williamr@4
   376
      this->_M_destroy_range();
williamr@4
   377
      this->_M_deallocate_block();
williamr@4
   378
      this->_M_reset(__new_start, __new_finish, __new_start + __len);
williamr@4
   379
    }
williamr@4
   380
  }
williamr@4
   381
}
williamr@4
   382
williamr@4
   383
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   384
basic_string<_CharT,_Traits,_Alloc>&
williamr@4
   385
basic_string<_CharT,_Traits,_Alloc> ::replace(iterator __first, iterator __last,
williamr@4
   386
                                              size_type __n, _CharT __c) {
williamr@4
   387
  size_type __len = (size_type)(__last - __first);
williamr@4
   388
williamr@4
   389
  if (__len >= __n) {
williamr@4
   390
    _Traits::assign(__first, __n, __c);
williamr@4
   391
    erase(__first + __n, __last);
williamr@4
   392
  }
williamr@4
   393
  else {
williamr@4
   394
    _Traits::assign(__first, __len, __c);
williamr@4
   395
    insert(__last, __n - __len, __c);
williamr@4
   396
  }
williamr@4
   397
  return *this;
williamr@4
   398
}
williamr@4
   399
williamr@4
   400
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   401
basic_string<_CharT,_Traits,_Alloc>&
williamr@4
   402
basic_string<_CharT,_Traits,_Alloc> ::_M_replace(iterator __first, iterator __last,
williamr@4
   403
                                                 const _CharT* __f, const _CharT* __l,
williamr@4
   404
                                                 bool __self_ref) {
williamr@4
   405
  const ptrdiff_t       __n = __l - __f;
williamr@4
   406
  const difference_type __len = __last - __first;
williamr@4
   407
  if (__len >= __n) {
williamr@4
   408
    if (!__self_ref || __l < __first || __f >= __last)
williamr@4
   409
      _M_copy(__f, __l, __first);
williamr@4
   410
    else
williamr@4
   411
      _M_move(__f, __l, __first);
williamr@4
   412
    erase(__first + __n, __last);
williamr@4
   413
  }
williamr@4
   414
  else {
williamr@4
   415
    if (!__self_ref || (__f >= __last) || (__l <= __first)) {
williamr@4
   416
      //no overlap:
williamr@4
   417
      const_iterator __m = __f + __len;
williamr@4
   418
      _M_copy(__f, __m, __first);
williamr@4
   419
      _M_insert(__last, __m, __l, false );
williamr@4
   420
    }
williamr@4
   421
    else {
williamr@4
   422
      //we have to take care of overlaping
williamr@4
   423
      if (__f < __first) {
williamr@4
   424
        const_iterator __m = __f + __len;
williamr@4
   425
        //We have to deal with possible reallocation because we do insert first.
williamr@4
   426
        const difference_type __off_dest = __first - this->begin();
williamr@4
   427
        const difference_type __off_src = __f - this->begin();
williamr@4
   428
        _M_insert(__last, __m, __l, true);
williamr@4
   429
        _Traits::move(begin() + __off_dest, begin() + __off_src, __len);
williamr@4
   430
      }
williamr@4
   431
      else {
williamr@4
   432
        const_iterator __m = __f + __len;
williamr@4
   433
        _Traits::move(__first, __f, __len);
williamr@4
   434
        _M_insert(__last, __m, __l, true);
williamr@4
   435
      }
williamr@4
   436
    }
williamr@4
   437
  }
williamr@4
   438
  return *this;
williamr@4
   439
}
williamr@4
   440
williamr@4
   441
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   442
basic_string<_CharT,_Traits,_Alloc> ::find(const _CharT* __s, size_type __pos,
williamr@4
   443
                                           size_type __n) const {
williamr@4
   444
  const size_t __len = size();
williamr@4
   445
  if (__pos >= __len || __pos + __n > __len)
williamr@4
   446
    return npos;
williamr@4
   447
  else {
williamr@4
   448
    const_pointer __result =
williamr@4
   449
      _STLP_STD::search(this->_M_Start() + __pos, this->_M_Finish(),
williamr@4
   450
                        __s, __s + __n, _STLP_PRIV _Eq_traits<_Traits>());
williamr@4
   451
    return __result != this->_M_Finish() ? __result - this->_M_Start() : npos;
williamr@4
   452
  }
williamr@4
   453
}
williamr@4
   454
williamr@4
   455
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   456
basic_string<_CharT,_Traits,_Alloc> ::find(_CharT __c, size_type __pos) const {
williamr@4
   457
  if (__pos >= size()) /*__pos + 1 > size()*/
williamr@4
   458
    return npos;
williamr@4
   459
  else {
williamr@4
   460
    const_pointer __result =
williamr@4
   461
      _STLP_STD::find_if(this->_M_Start() + __pos, this->_M_Finish(),
williamr@4
   462
                         _STLP_PRIV _Eq_char_bound<_Traits>(__c));
williamr@4
   463
    return __result != this->_M_Finish() ? __result - this->_M_Start() : npos;
williamr@4
   464
  }
williamr@4
   465
}
williamr@4
   466
williamr@4
   467
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   468
basic_string<_CharT,_Traits,_Alloc> ::rfind(const _CharT* __s, size_type __pos,
williamr@4
   469
                                            size_type __n) const {
williamr@4
   470
  const size_t __len = size();
williamr@4
   471
  if (__n > __len || __pos < __n)
williamr@4
   472
    return npos;
williamr@4
   473
  else if (__n == 0)
williamr@4
   474
    return (min) (__len, __pos);
williamr@4
   475
  else {
williamr@4
   476
    const_pointer __last = this->_M_Start() + (min) (__len - __n, __pos) + __n;
williamr@4
   477
    const_pointer __result = _STLP_PRIV __find_end(this->_M_Start(), __last,
williamr@4
   478
                                                   __s, __s + __n,
williamr@4
   479
                                                   bidirectional_iterator_tag(), bidirectional_iterator_tag(),
williamr@4
   480
                                                   _STLP_PRIV _Eq_traits<_Traits>());
williamr@4
   481
    return __result != __last ? __result - this->_M_Start() : npos;
williamr@4
   482
  }
williamr@4
   483
}
williamr@4
   484
williamr@4
   485
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   486
basic_string<_CharT,_Traits,_Alloc> ::rfind(_CharT __c, size_type __pos) const {
williamr@4
   487
  const size_type __len = size();
williamr@4
   488
  if (1 > __len || __pos < 1)
williamr@4
   489
    return npos;
williamr@4
   490
  else {
williamr@4
   491
    const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
williamr@4
   492
    const_reverse_iterator __rresult =
williamr@4
   493
      _STLP_STD::find_if(const_reverse_iterator(__last), rend(),
williamr@4
   494
                         _STLP_PRIV _Eq_char_bound<_Traits>(__c));
williamr@4
   495
    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
williamr@4
   496
  }
williamr@4
   497
}
williamr@4
   498
williamr@4
   499
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   500
basic_string<_CharT,_Traits,_Alloc> ::find_first_of(const _CharT* __s, size_type __pos,
williamr@4
   501
                                                    size_type __n) const {
williamr@4
   502
  if (__pos >= size()) /*__pos + 1 > size()*/
williamr@4
   503
    return npos;
williamr@4
   504
  else {
williamr@4
   505
    const_iterator __result = _STLP_PRIV __find_first_of(begin() + __pos, end(),
williamr@4
   506
                                                         __s, __s + __n,
williamr@4
   507
                                                         _STLP_PRIV _Eq_traits<_Traits>());
williamr@4
   508
    return __result != end() ? __result - begin() : npos;
williamr@4
   509
  }
williamr@4
   510
}
williamr@4
   511
williamr@4
   512
williamr@4
   513
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   514
basic_string<_CharT,_Traits,_Alloc> ::find_last_of(const _CharT* __s, size_type __pos,
williamr@4
   515
                                                   size_type __n) const {
williamr@4
   516
  const size_type __len = size();
williamr@4
   517
  if (1 > __len || __pos < 1)
williamr@4
   518
    return npos;
williamr@4
   519
  else {
williamr@4
   520
    const const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
williamr@4
   521
    const const_reverse_iterator __rresult =
williamr@4
   522
      _STLP_PRIV __find_first_of(const_reverse_iterator(__last), rend(),
williamr@4
   523
                                 __s, __s + __n,
williamr@4
   524
                                 _STLP_PRIV _Eq_traits<_Traits>());
williamr@4
   525
    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
williamr@4
   526
  }
williamr@4
   527
}
williamr@4
   528
williamr@4
   529
williamr@4
   530
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   531
basic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(const _CharT* __s, size_type __pos,
williamr@4
   532
                                                        size_type __n) const {
williamr@4
   533
  typedef typename _Traits::char_type _CharType;
williamr@4
   534
  if (__pos >= size()) /*__pos + 1 >= size()*/
williamr@4
   535
    return npos;
williamr@4
   536
  else {
williamr@4
   537
    const_pointer __result = _STLP_STD::find_if(this->_M_Start() + __pos, this->_M_Finish(),
williamr@4
   538
                                                _STLP_PRIV _Not_within_traits<_Traits>(__CONST_CAST(const _CharType*, __s),
williamr@4
   539
                                                                                        __CONST_CAST(const _CharType*, __s) + __n));
williamr@4
   540
    return __result != this->_M_finish ? __result - this->_M_Start() : npos;
williamr@4
   541
  }
williamr@4
   542
}
williamr@4
   543
williamr@4
   544
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   545
basic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(_CharT __c, size_type __pos) const {
williamr@4
   546
  if (1 > size())
williamr@4
   547
    return npos;
williamr@4
   548
  else {
williamr@4
   549
    const_pointer __result = _STLP_STD::find_if(this->_M_Start() + __pos, this->_M_Finish(),
williamr@4
   550
                                                _STLP_PRIV _Neq_char_bound<_Traits>(__c));
williamr@4
   551
    return __result != this->_M_finish ? __result - this->_M_Start() : npos;
williamr@4
   552
  }
williamr@4
   553
}
williamr@4
   554
williamr@4
   555
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   556
basic_string<_CharT,_Traits,_Alloc> ::find_last_not_of(const _CharT* __s, size_type __pos,
williamr@4
   557
                                                       size_type __n) const {
williamr@4
   558
  typedef typename _Traits::char_type _CharType;
williamr@4
   559
  const size_type __len = size();
williamr@4
   560
  if (1 > __len || __pos < 1)
williamr@4
   561
    return npos;
williamr@4
   562
  else {
williamr@4
   563
    const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
williamr@4
   564
    const_reverse_iterator __rlast = const_reverse_iterator(__last);
williamr@4
   565
    const_reverse_iterator __rresult =
williamr@4
   566
      _STLP_STD::find_if(__rlast, rend(),
williamr@4
   567
                         _STLP_PRIV _Not_within_traits<_Traits>((const _CharType*)__s,
williamr@4
   568
                                                                 (const _CharType*)__s + __n));
williamr@4
   569
    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
williamr@4
   570
  }
williamr@4
   571
}
williamr@4
   572
williamr@4
   573
template <class _CharT, class _Traits, class _Alloc> __size_type__
williamr@4
   574
basic_string<_CharT, _Traits, _Alloc> ::find_last_not_of(_CharT __c, size_type __pos) const {
williamr@4
   575
  const size_type __len = size();
williamr@4
   576
  if (1 > __len || __pos < 1)
williamr@4
   577
    return npos;
williamr@4
   578
  else {
williamr@4
   579
    const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
williamr@4
   580
    const_reverse_iterator __rlast = const_reverse_iterator(__last);
williamr@4
   581
    const_reverse_iterator __rresult =
williamr@4
   582
      _STLP_STD::find_if(__rlast, rend(),
williamr@4
   583
                         _STLP_PRIV _Neq_char_bound<_Traits>(__c));
williamr@4
   584
    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
williamr@4
   585
  }
williamr@4
   586
}
williamr@4
   587
williamr@4
   588
#if !defined (basic_string)
williamr@4
   589
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   590
#endif
williamr@4
   591
williamr@4
   592
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   593
void _STLP_CALL _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@4
   594
                               _CharT* __buf, size_t __n) {
williamr@4
   595
  if (__n > 0) {
williamr@4
   596
    __n = (min) (__n - 1, __s.size());
williamr@4
   597
    _STLP_STD::copy(__s.begin(), __s.begin() + __n, __buf);
williamr@4
   598
    __buf[__n] = _CharT();
williamr@4
   599
  }
williamr@4
   600
}
williamr@4
   601
williamr@4
   602
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   603
williamr@4
   604
_STLP_END_NAMESPACE
williamr@4
   605
williamr@4
   606
#include <stl/_range_errors.h>
williamr@4
   607
williamr@4
   608
_STLP_BEGIN_NAMESPACE
williamr@4
   609
williamr@4
   610
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   611
williamr@4
   612
// _String_base methods
williamr@4
   613
template <class _Tp, class _Alloc>
williamr@4
   614
void _String_base<_Tp,_Alloc>::_M_throw_length_error() const
williamr@4
   615
{ __stl_throw_length_error("basic_string"); }
williamr@4
   616
williamr@4
   617
template <class _Tp, class _Alloc>
williamr@4
   618
void _String_base<_Tp, _Alloc>::_M_throw_out_of_range() const
williamr@4
   619
{ __stl_throw_out_of_range("basic_string"); }
williamr@4
   620
williamr@4
   621
template <class _Tp, class _Alloc>
williamr@4
   622
void _String_base<_Tp, _Alloc>::_M_allocate_block(size_t __n) {
williamr@4
   623
  if ((__n <= (max_size() + 1)) && (__n > 0)) {
williamr@4
   624
#if defined (_STLP_USE_SHORT_STRING_OPTIM)
williamr@4
   625
    if (__n > _DEFAULT_SIZE) {
williamr@4
   626
      this->_M_buffers._M_dynamic_buf = _M_end_of_storage.allocate(__n, __n);
williamr@4
   627
      this->_M_finish = this->_M_buffers._M_dynamic_buf;
williamr@4
   628
      this->_M_end_of_storage._M_data = this->_M_finish + __n;
williamr@4
   629
    }
williamr@4
   630
#else
williamr@4
   631
    this->_M_start  = _M_end_of_storage.allocate(__n, __n);
williamr@4
   632
    this->_M_finish = this->_M_start;
williamr@4
   633
    this->_M_end_of_storage._M_data = this->_M_finish + __n;
williamr@4
   634
#endif /*_STLP_USE_SHORT_STRING_OPTIM  */
williamr@4
   635
  } else {
williamr@4
   636
    this->_M_throw_length_error();
williamr@4
   637
  }
williamr@4
   638
}
williamr@4
   639
williamr@4
   640
#if !defined (basic_string)
williamr@4
   641
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   642
#endif
williamr@4
   643
williamr@4
   644
#if defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   645
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   646
basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT* __s)
williamr@4
   647
  : _STLP_PRIV _String_base<_CharT,_Alloc>(allocator_type()) {
williamr@4
   648
  _STLP_FIX_LITERAL_BUG(__s)
williamr@4
   649
  _M_range_initialize(__s, __s + traits_type::length(__s));
williamr@4
   650
}
williamr@4
   651
#endif
williamr@4
   652
williamr@4
   653
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   654
basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT* __s,
williamr@4
   655
                                                    const allocator_type& __a)
williamr@4
   656
  : _STLP_PRIV _String_base<_CharT,_Alloc>(__a) {
williamr@4
   657
  _STLP_FIX_LITERAL_BUG(__s)
williamr@4
   658
  _M_range_initialize(__s, __s + traits_type::length(__s));
williamr@4
   659
}
williamr@4
   660
williamr@4
   661
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   662
basic_string<_CharT, _Traits, _Alloc>::basic_string(const basic_string<_CharT, _Traits, _Alloc> & __s)
williamr@4
   663
  : _STLP_PRIV _String_base<_CharT,_Alloc>(__s.get_allocator())
williamr@4
   664
{ _M_range_initialize(__s._M_Start(), __s._M_Finish()); }
williamr@4
   665
williamr@4
   666
#if defined (basic_string)
williamr@4
   667
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   668
#  undef basic_string
williamr@4
   669
#else
williamr@4
   670
/* If basic_string is defined it means that it won't be the basic_string class
williamr@4
   671
 * exposed to STLport users so npos do not need external linkage.
williamr@4
   672
 */
williamr@4
   673
#  if !defined (_STLP_STATIC_CONST_INIT_BUG)
williamr@4
   674
#    if !defined (__GNUC__) || (__GNUC__ != 2) || (__GNUC_MINOR__ != 96)
williamr@4
   675
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   676
const size_t basic_string<_CharT, _Traits, _Alloc>::npos;
williamr@4
   677
#    endif
williamr@4
   678
#  endif
williamr@4
   679
#endif
williamr@4
   680
williamr@4
   681
_STLP_END_NAMESPACE
williamr@4
   682
williamr@4
   683
#undef __size_type__
williamr@4
   684
#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
williamr@4
   685
#  undef size_type
williamr@4
   686
#  undef iterator
williamr@4
   687
#endif
williamr@4
   688
williamr@4
   689
#endif /*  _STLP_STRING_C */
williamr@4
   690
williamr@4
   691
// Local Variables:
williamr@4
   692
// mode:C++
williamr@4
   693
// End: