basic_string.tcc (append(const basic_string&)): Revert previous change.
authorPaolo Carlini <pcarlini@suse.de>
Wed, 21 Jan 2004 15:43:45 +0000 (15:43 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 21 Jan 2004 15:43:45 +0000 (15:43 +0000)
2004-01-21  Paolo Carlini  <pcarlini@suse.de>

* include/bits/basic_string.tcc (append(const basic_string&)):
Revert previous change.
(append(const basic_string&, size_type, size_type)): Revert
previous change, use _M_check and _M_limit.

From-SVN: r76282

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.tcc

index 3c078e98a5832a1f2ee2caa0e2e165600ffff28d..a8c0074b0a0392a3d09d8fc46e262da763cbdce6 100644 (file)
@@ -1,3 +1,10 @@
+2004-01-21  Paolo Carlini  <pcarlini@suse.de>
+
+       * include/bits/basic_string.tcc (append(const basic_string&)):
+       Revert previous change.
+       (append(const basic_string&, size_type, size_type)): Revert
+       previous change, use _M_check and _M_limit.
+
 2004-01-21  Paolo Carlini  <pcarlini@suse.de>
 
        * include/bits/basic_string.h (_M_check): Change to return
index 070cd12235c79b2b8913cbc2ebb629e4d09e208c..ac886774536dc2bae26f4fbf0b5d481c39b5f6f5 100644 (file)
@@ -676,16 +676,33 @@ namespace std
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     append(const basic_string& __str)
-    { return this->append(__str._M_data(), __str.size()); }
+    {
+      // Iff appending itself, string needs to pre-reserve the
+      // correct size so that _M_mutate does not clobber the
+      // iterators formed here.
+      const size_type __size = __str.size();
+      const size_type __len = __size + this->size();
+      if (__len > this->capacity())
+       this->reserve(__len);
+      return _M_replace_safe(_M_iend(), _M_iend(), __str._M_ibegin(),
+                            __str._M_iend());
+    }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
     basic_string<_CharT, _Traits, _Alloc>&
     basic_string<_CharT, _Traits, _Alloc>::
     append(const basic_string& __str, size_type __pos, size_type __n)
     {
-      return this->append(__str._M_data()
-                         + __str._M_check(__pos, "basic_string::append"),
-                         __str._M_limit(__pos, __n));
+      // Iff appending itself, string needs to pre-reserve the
+      // correct size so that _M_mutate does not clobber the
+      // iterators formed here.
+      __pos = __str._M_check(__pos, "basic_string::append");
+      __n = __str._M_limit(__pos, __n);
+      const size_type __len = __n + this->size();
+      if (__len > this->capacity())
+       this->reserve(__len);
+      return _M_replace_safe(_M_iend(), _M_iend(), __str._M_ibegin()
+                            + __pos, __str._M_ibegin() + __pos + __n);
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
@@ -693,9 +710,6 @@ namespace std
     basic_string<_CharT, _Traits, _Alloc>::
     append(const _CharT* __s, size_type __n)
     {
-      // Iff appending itself, string needs to pre-reserve the
-      // correct size so that _M_mutate does not clobber the
-      // iterators formed here.
       __glibcxx_requires_string_len(__s, __n);
       const size_type __len = __n + this->size();
       if (__len > this->capacity())