diff options
author | Paolo Carlini <pcarlini@suse.de> | 2004-01-30 09:58:45 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2004-01-30 09:58:45 +0000 |
commit | 690495b0fcc31e412ab64b68e5e8cf9d97c0f670 (patch) | |
tree | 8232ed7ad46cbb79d3d4643161d559067bc30372 /libstdc++-v3 | |
parent | 57116d8d9f851d4844479d6a999c2f1d1a54303b (diff) | |
download | gcc-690495b0fcc31e412ab64b68e5e8cf9d97c0f670.zip gcc-690495b0fcc31e412ab64b68e5e8cf9d97c0f670.tar.gz gcc-690495b0fcc31e412ab64b68e5e8cf9d97c0f670.tar.bz2 |
basic_string.tcc (_S_construct(_InIterator, _InIterator, const _Alloc&, input_iterator_tag)): Simplify the double loop, streamline.
2004-01-30 Paolo Carlini <pcarlini@suse.de>
* 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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | 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 2baf985..e13c44a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2004-01-30 Paolo Carlini <pcarlini@suse.de> + + * 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 <ljrittle@acm.org> * 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 80ee245..a478a4c 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<typename _CharT, typename _Traits, typename _Alloc> @@ -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<typename _CharT, typename _Traits, typename _Alloc> @@ -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); |