re PR libstdc++/6533 (libstdc++ broken on unsigned char platforms)

2002-05-01  Benjamin Kosnik  <bkoz@redhat.com>

	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
This commit is contained in:
Benjamin Kosnik 2002-05-01 22:40:27 +00:00 committed by Benjamin Kosnik
parent ea619b46b1
commit 9875ea057d
2 changed files with 27 additions and 18 deletions

View File

@ -1,3 +1,10 @@
2002-05-01 Benjamin Kosnik <bkoz@redhat.com>
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 <pcarlini@unitus.it>
PR libstdc++/6513

View File

@ -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<int_type>(-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<int_type>(-2))
__ret = _M_c;
else
if ((__ret = _M_sbuf->sgetc()) == traits_type::eof())
_M_sbuf = 0;
}
return __ret;
}
};
template<typename _CharT, typename _Traits>