diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2001-12-18 13:06:01 +0100 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2001-12-18 12:06:01 +0000 |
commit | c448ca845ca776fc88e45e340370d6e479881f1d (patch) | |
tree | 6b55135c18fbb681b1d52c6bf644558f301470c7 /libstdc++-v3 | |
parent | ea50ad828ceb9027061c957d442f4eff7b6cf91b (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 25 |
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; } } |