From: Benjamin Kosnik Date: Wed, 1 May 2002 22:40:27 +0000 (+0000) Subject: re PR libstdc++/6533 (libstdc++ broken on unsigned char platforms) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9875ea057d92d0efcc232b6e1595d7c4c48974e4;p=gcc.git re PR libstdc++/6533 (libstdc++ broken on unsigned char platforms) 2002-05-01 Benjamin Kosnik PR libstdc++/6533 * include/bits/streambuf_iterator.h (istreambuf_iterator::_M_get): New. (istreambuf_iterator::equal): Use it. (istreambuf_iterator::operator*): Use it. From-SVN: r53024 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ab097808f54..7eba269f7cf 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2002-05-01 Benjamin Kosnik + + PR libstdc++/6533 + * include/bits/streambuf_iterator.h (istreambuf_iterator::_M_get): New. + (istreambuf_iterator::equal): Use it. + (istreambuf_iterator::operator*): Use it. + 2002-05-01 Paolo Carlini PR libstdc++/6513 diff --git a/libstdc++-v3/include/bits/streambuf_iterator.h b/libstdc++-v3/include/bits/streambuf_iterator.h index f7317b2e481..659caecb2af 100644 --- a/libstdc++-v3/include/bits/streambuf_iterator.h +++ b/libstdc++-v3/include/bits/streambuf_iterator.h @@ -77,24 +77,10 @@ namespace std istreambuf_iterator(streambuf_type* __s) throw() : _M_sbuf(__s), _M_c(-2) { } - // NB: This should really have an int_type return - // value, so "end of stream" postion can be checked without - // hacking. + // NB: The result of operator*() on an end of stream is undefined. char_type operator*() const - { - // The result of operator*() on an end of stream is undefined. - int_type __ret = traits_type::eof(); - if (_M_sbuf) - { - if (_M_c != static_cast(-2)) - __ret = _M_c; - else - if ((__ret = _M_sbuf->sgetc()) == traits_type::eof()) - _M_sbuf = 0; - } - return traits_type::to_char_type(__ret); - } + { return traits_type::to_char_type(_M_get()); } istreambuf_iterator& operator++() @@ -124,11 +110,27 @@ namespace std equal(const istreambuf_iterator& __b) const { const int_type __eof = traits_type::eof(); - bool __thiseof = traits_type::eq_int_type(this->operator*(), __eof); - bool __beof = traits_type::eq_int_type(__b.operator*(), __eof); + bool __thiseof = _M_get() == __eof; + bool __beof = __b._M_get() == __eof; return (__thiseof && __beof || (!__thiseof && !__beof)); } #endif + + private: + int_type + _M_get() const + { + int_type __ret = traits_type::eof(); + if (_M_sbuf) + { + if (_M_c != static_cast(-2)) + __ret = _M_c; + else + if ((__ret = _M_sbuf->sgetc()) == traits_type::eof()) + _M_sbuf = 0; + } + return __ret; + } }; template