basic_string.h (assign(__str, __pos, __n)): Call assign(__s, __n).
authorPaolo Carlini <pcarlini@unitus.it>
Tue, 18 Dec 2001 12:06:01 +0000 (13:06 +0100)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 18 Dec 2001 12:06:01 +0000 (12:06 +0000)
2001-12-18  Paolo Carlini  <pcarlini@unitus.it>
            Nathan Myers  <ncm@cantrip.org>

* include/bits/basic_string.h (assign(__str, __pos, __n)):
Call assign(__s, __n).
(assign(__s, __n)): Terminate the string with _S_terminal.

Co-Authored-By: Nathan Myers <ncm@cantrip.org>
From-SVN: r48151

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

index 7de1b084e790fc194fc44e676ddd456563b9bcbc..6ca82cd284830cce146177b43b1a921f772ce643 100644 (file)
@@ -1,3 +1,10 @@
+2001-12-18  Paolo Carlini  <pcarlini@unitus.it>
+            Nathan Myers  <ncm@cantrip.org>
+       
+       * include/bits/basic_string.h (assign(__str, __pos, __n)):
+       Call assign(__s, __n).
+       (assign(__s, __n)): Terminate the string with _S_terminal.
+
 2001-12-17  Benjamin Kosnik  <bkoz@redhat.com>
 
        * include/bits/std_limits.h (__glibcpp_long_double_is_bounded):
index af550c9a01bbd3524ac1b6a88c048c3ff0b92417..170fdcdebf6e86beded39be72d562bbbbe169b0e 100644 (file)
@@ -478,26 +478,12 @@ namespace std
       basic_string& 
       assign(const basic_string& __str, size_type __pos, size_type __n)
       {
-       if (__pos > __str.size())
+       const size_type __strsize = __str.size();
+       if (__pos > __strsize)
          __throw_out_of_range("basic_string::assign");
-       if (_M_rep()->_M_is_shared() || _M_rep() != __str._M_rep())
-         return _M_replace_safe(_M_ibegin(), _M_iend(), 
-                                __str._M_check(__pos),
-                                __str._M_fold(__pos, __n));
-       else
-         {
-           // Work in-place.
-           bool __testn = __n < __str.size() - __pos;
-           const size_type __newsize = __testn ? __n : __str.size() - __pos;
-           // Avoid move, if possible.
-           if (__pos >= __newsize)
-             traits_type::copy(_M_data(), __str._M_data() + __pos, __newsize);
-           else if (__pos)           
-             traits_type::move(_M_data(), __str._M_data() + __pos, __newsize);
-           // else nothing (avoid calling move unnecessarily)
-           _M_rep()->_M_length = __newsize;
-           return *this;
-         }
+       const bool __testn = __n < __strsize - __pos;
+       const size_type __newsize = __testn ? __n : __strsize - __pos;
+       return this->assign(__str._M_data() + __pos, __newsize);
       }
 
       basic_string& 
@@ -517,6 +503,7 @@ namespace std
            else if (__pos)
              traits_type::move(_M_data(), __s, __n);
            _M_rep()->_M_length = __n;
+           _M_data()[__n] = _Rep::_S_terminal;
            return *this;
          }
       }