aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2001-12-18 13:06:01 +0100
committerPaolo Carlini <paolo@gcc.gnu.org>2001-12-18 12:06:01 +0000
commitc448ca845ca776fc88e45e340370d6e479881f1d (patch)
tree6b55135c18fbb681b1d52c6bf644558f301470c7 /libstdc++-v3
parentea50ad828ceb9027061c957d442f4eff7b6cf91b (diff)
downloadgcc-c448ca845ca776fc88e45e340370d6e479881f1d.zip
gcc-c448ca845ca776fc88e45e340370d6e479881f1d.tar.gz
gcc-c448ca845ca776fc88e45e340370d6e479881f1d.tar.bz2
basic_string.h (assign(__str, __pos, __n)): Call assign(__s, __n).
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/basic_string.h25
2 files changed, 13 insertions, 19 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7de1b08..6ca82cd 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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):
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index af550c9..170fdcd 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -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;
}
}