From 690495b0fcc31e412ab64b68e5e8cf9d97c0f670 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 30 Jan 2004 09:58:45 +0000 Subject: [PATCH] basic_string.tcc (_S_construct(_InIterator, _InIterator, const _Alloc&, input_iterator_tag)): Simplify the double loop, streamline. 2004-01-30 Paolo Carlini * include/bits/basic_string.tcc (_S_construct(_InIterator, _InIterator, const _Alloc&, input_iterator_tag)): Simplify the double loop, streamline. * include/bits/basic_string.tcc: Very minor tweaks. From-SVN: r76937 --- libstdc++-v3/ChangeLog | 8 +++ libstdc++-v3/include/bits/basic_string.tcc | 64 ++++++++-------------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2baf9852bb2..e13c44a07c7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2004-01-30 Paolo Carlini + + * include/bits/basic_string.tcc (_S_construct(_InIterator, + _InIterator, const _Alloc&, input_iterator_tag)): Simplify + the double loop, streamline. + + * include/bits/basic_string.tcc: Very minor tweaks. + 2004-01-30 Loren J. Rittle * scripts/check_performance: Only compile with $THREAD_FLAG diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index 80ee2455703..a478a4cf248 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -92,45 +92,29 @@ namespace std return _S_empty_rep()._M_refdata(); // Avoid reallocation for common case. _CharT __buf[100]; - size_type __i = 0; - while (__beg != __end && __i < sizeof(__buf) / sizeof(_CharT)) + size_type __len = 0; + while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT)) { - __buf[__i++] = *__beg; - ++__beg; + __buf[__len++] = *__beg; + ++__beg; } - _Rep* __r = _Rep::_S_create(__i, size_type(0), __a); - traits_type::copy(__r->_M_refdata(), __buf, __i); - __r->_M_length = __i; + _Rep* __r = _Rep::_S_create(__len, size_type(0), __a); + traits_type::copy(__r->_M_refdata(), __buf, __len); try { - // NB: this loop looks precisely this way because - // it avoids comparing __beg != __end any more - // than strictly necessary; != might be expensive! - for (;;) + while (__beg != __end) { - _CharT* __p = __r->_M_refdata() + __r->_M_length; - _CharT* __last = __r->_M_refdata() + __r->_M_capacity; - for (;;) + if (__len == __r->_M_capacity) { - if (__beg == __end) - { - __r->_M_length = __p - __r->_M_refdata(); - *__p = _Rep::_S_terminal; // grrr. - return __r->_M_refdata(); - } - if (__p == __last) - break; - *__p++ = *__beg; - ++__beg; + // Allocate more space. + _Rep* __another = _Rep::_S_create(__len + 1, __len, __a); + traits_type::copy(__another->_M_refdata(), + __r->_M_refdata(), __len); + __r->_M_destroy(__a); + __r = __another; } - // Allocate more space. - const size_type __len = __r->_M_capacity; - _Rep* __another = _Rep::_S_create(__len + 1, __len, __a); - traits_type::copy(__another->_M_refdata(), - __r->_M_refdata(), __len); - __r->_M_destroy(__a); - __r = __another; - __r->_M_length = __len; + __r->_M_refdata()[__len++] = *__beg; + ++__beg; } } catch(...) @@ -138,7 +122,9 @@ namespace std __r->_M_destroy(__a); __throw_exception_again; } - return 0; + __r->_M_length = __len; + __r->_M_refdata()[__len] = _Rep::_S_terminal; // grrr. + return __r->_M_refdata(); } template @@ -167,7 +153,6 @@ namespace std __throw_exception_again; } __r->_M_length = __dnew; - __r->_M_refdata()[__dnew] = _Rep::_S_terminal; // grrr. return __r->_M_refdata(); } @@ -209,9 +194,8 @@ namespace std : _M_dataplus(_S_construct(__str._M_data() + __str._M_check(__pos, "basic_string::basic_string"), - __str._M_data() + __pos - + __str._M_limit(__pos, __n), - _Alloc()), _Alloc()) + __str._M_data() + __str._M_limit(__pos, __n) + + __pos, _Alloc()), _Alloc()) { } template @@ -221,8 +205,8 @@ namespace std : _M_dataplus(_S_construct(__str._M_data() + __str._M_check(__pos, "basic_string::basic_string"), - __str._M_data() + __pos - + __str._M_limit(__pos, __n), __a), __a) + __str._M_data() + __str._M_limit(__pos, __n) + + __pos, __a), __a) { } // TBD: DPG annotate @@ -262,7 +246,7 @@ namespace std if (_M_rep() != __str._M_rep()) { // XXX MT - allocator_type __a = this->get_allocator(); + const allocator_type __a = this->get_allocator(); _CharT* __tmp = __str._M_rep()->_M_grab(__a, __str.get_allocator()); _M_rep()->_M_dispose(__a); _M_data(__tmp);