diff options
author | Paolo Carlini <pcarlini@suse.de> | 2004-04-25 15:45:13 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2004-04-25 15:45:13 +0000 |
commit | 247791f5d179ac6fd5a437a1acd342af7f8c1640 (patch) | |
tree | d5b3c279153b532f4dde8653e2d3be4b297e66e4 | |
parent | c26fa757dc8e41cdc141aac1cb54aaf4549c6bc1 (diff) | |
download | gcc-247791f5d179ac6fd5a437a1acd342af7f8c1640.zip gcc-247791f5d179ac6fd5a437a1acd342af7f8c1640.tar.gz gcc-247791f5d179ac6fd5a437a1acd342af7f8c1640.tar.bz2 |
PR libstdc++/15002 (continued again)
2004-04-25 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/15002 (continued again)
* include/bits/istream.tcc (getline(basic_istream<>&,
basic_string<>&, _CharT)): Use a temporary buffer, thus
avoiding reallocation for common case.
* include/bits/basic_string.tcc (_S_construct(_InIterator,
_InIterator, const _Alloc&, input_iterator_tag)): Tweak size
of temporary buffer to a power of two.
* testsuite/27_io/basic_istream/getline/char/4.cc: Add comment.
From-SVN: r81163
-rw-r--r-- | libstdc++-v3/ChangeLog | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.tcc | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/istream.tcc | 14 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/basic_istream/getline/char/4.cc | 2 |
4 files changed, 28 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0b728ee..df302fa 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,18 @@ 2004-04-25 Paolo Carlini <pcarlini@suse.de> + PR libstdc++/15002 (continued again) + * include/bits/istream.tcc (getline(basic_istream<>&, + basic_string<>&, _CharT)): Use a temporary buffer, thus + avoiding reallocation for common case. + + * include/bits/basic_string.tcc (_S_construct(_InIterator, + _InIterator, const _Alloc&, input_iterator_tag)): Tweak size + of temporary buffer to a power of two. + + * testsuite/27_io/basic_istream/getline/char/4.cc: Add comment. + +2004-04-25 Paolo Carlini <pcarlini@suse.de> + * testsuite/21_strings/basic_string/inserters_extractors/char/10.cc: New. * testsuite/21_strings/basic_string/inserters_extractors/wchar_t/10.cc: diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index 8f60abe..7034778 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -91,7 +91,7 @@ namespace std if (__beg == __end && __a == _Alloc()) return _S_empty_rep()._M_refdata(); // Avoid reallocation for common case. - _CharT __buf[100]; + _CharT __buf[128]; size_type __len = 0; while (__beg != __end && __len < sizeof(__buf) / sizeof(_CharT)) { diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index a7cf61e..ddd0c03 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -1102,7 +1102,10 @@ namespace std { try { + // Avoid reallocation for common case. __str.erase(); + _CharT __buf[128]; + __size_type __len = 0; const __int_type __idelim = _Traits::to_int_type(__delim); const __int_type __eof = _Traits::eof(); __streambuf_type* __sb = __in.rdbuf(); @@ -1112,10 +1115,17 @@ namespace std && !_Traits::eq_int_type(__c, __eof) && !_Traits::eq_int_type(__c, __idelim)) { - __str += _Traits::to_char_type(__c); - __c = __sb->snextc(); + if (__len == sizeof(__buf) / sizeof(_CharT)) + { + __str.append(__buf, sizeof(__buf) / sizeof(_CharT)); + __len = 0; + } + __buf[__len++] = _Traits::to_char_type(__c); ++__extracted; + __c = __sb->snextc(); } + __str.append(__buf, __len); + if (_Traits::eq_int_type(__c, __eof)) __err |= ios_base::eofbit; else if (_Traits::eq_int_type(__c, __idelim)) diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/getline/char/4.cc b/libstdc++-v3/testsuite/27_io/basic_istream/getline/char/4.cc index 0c53187..2734c60 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/getline/char/4.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/getline/char/4.cc @@ -25,6 +25,8 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. +// 27.6.1.3 unformatted input functions + #include <cstring> // for strlen #include <istream> #include <testsuite_hooks.h> |