aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/bits/streambuf_iterator.h
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/bits/streambuf_iterator.h')
-rw-r--r--libstdc++-v3/include/bits/streambuf_iterator.h184
1 files changed, 93 insertions, 91 deletions
diff --git a/libstdc++-v3/include/bits/streambuf_iterator.h b/libstdc++-v3/include/bits/streambuf_iterator.h
index 88ae25eab18..152df9c6e4b 100644
--- a/libstdc++-v3/include/bits/streambuf_iterator.h
+++ b/libstdc++-v3/include/bits/streambuf_iterator.h
@@ -1,6 +1,7 @@
// Streambuf iterators
-// Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
+// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -41,60 +42,6 @@
namespace std
{
- template<typename _CharT, typename _Traits>
- class ostreambuf_iterator
- : public iterator<output_iterator_tag, void, void, void, void>
- {
- public:
- // Types:
- typedef _CharT char_type;
- typedef _Traits traits_type;
- typedef basic_streambuf<_CharT, _Traits> streambuf_type;
- typedef basic_ostream<_CharT, _Traits> ostream_type;
-
- private:
- streambuf_type* _M_sbuf;
- bool _M_failed;
-
- public:
- inline
- ostreambuf_iterator(ostream_type& __s) throw ()
- : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
-
- ostreambuf_iterator(streambuf_type* __s) throw ()
- : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
-
- ostreambuf_iterator&
- operator=(_CharT __c);
-
- ostreambuf_iterator&
- operator*() throw()
- { return *this; }
-
- ostreambuf_iterator&
- operator++(int) throw()
- { return *this; }
-
- ostreambuf_iterator&
- operator++() throw()
- { return *this; }
-
- bool
- failed() const throw()
- { return _M_failed; }
- };
-
- template<typename _CharT, typename _Traits>
- inline ostreambuf_iterator<_CharT, _Traits>&
- ostreambuf_iterator<_CharT, _Traits>::operator=(_CharT __c)
- {
- if (!_M_failed &&
- _Traits::eq_int_type(_M_sbuf->sputc(__c),_Traits::eof()))
- _M_failed = true;
- return *this;
- }
-
-
// 24.5.3 Template class istreambuf_iterator
template<typename _CharT, typename _Traits>
class istreambuf_iterator
@@ -117,76 +64,78 @@ namespace std
// the "end of stream" iterator value.
// NB: This implementation assumes the "end of stream" value
// is EOF, or -1.
- streambuf_type* _M_sbuf;
+ mutable streambuf_type* _M_sbuf;
int_type _M_c;
public:
istreambuf_iterator() throw()
- : _M_sbuf(NULL), _M_c(-2) { }
+ : _M_sbuf(0), _M_c(traits_type::eof()) { }
istreambuf_iterator(istream_type& __s) throw()
- : _M_sbuf(__s.rdbuf()), _M_c(-2) { }
+ : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
istreambuf_iterator(streambuf_type* __s) throw()
- : _M_sbuf(__s), _M_c(-2) { }
+ : _M_sbuf(__s), _M_c(traits_type::eof()) { }
- // 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.
- char_type __ret;
- if (_M_sbuf && _M_c != static_cast<int_type>(-2))
- __ret = _M_c;
- else if (_M_sbuf)
- __ret = traits_type::to_char_type(_M_sbuf->sgetc());
- else
- __ret = static_cast<char_type>(traits_type::eof());
- return __ret;
- }
+ { return traits_type::to_char_type(_M_get()); }
istreambuf_iterator&
operator++()
{
- if (_M_sbuf)
- _M_sbuf->sbumpc();
- _M_c = -2;
+ const int_type __eof = traits_type::eof();
+ if (_M_sbuf && traits_type::eq_int_type(_M_sbuf->sbumpc(), __eof))
+ _M_sbuf = 0;
+ else
+ _M_c = __eof;
return *this;
}
istreambuf_iterator
operator++(int)
{
+ const int_type __eof = traits_type::eof();
istreambuf_iterator __old = *this;
- if (_M_sbuf)
- __old._M_c = _M_sbuf->sbumpc();
- _M_c = -2;
+ if (_M_sbuf
+ && traits_type::eq_int_type((__old._M_c = _M_sbuf->sbumpc()),
+ __eof))
+ _M_sbuf = 0;
+ else
+ _M_c = __eof;
return __old;
}
- bool
- equal(const istreambuf_iterator& __b)
- {
- int_type __eof = traits_type::eof();
- bool __thiseof = !_M_sbuf || _M_sbuf->sgetc() == __eof;
- bool __beof = !__b._M_sbuf || __b._M_sbuf->sgetc() == __eof;
- return (__thiseof && __beof || (!__thiseof && !__beof));
- }
-
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
// 110 istreambuf_iterator::equal not const
// NB: there is also number 111 (NAD, Future) pending on this function.
bool
equal(const istreambuf_iterator& __b) const
{
- int_type __eof = traits_type::eof();
- bool __thiseof = !_M_sbuf || _M_sbuf->sgetc() == __eof;
- bool __beof = !__b._M_sbuf || __b._M_sbuf->sgetc() == __eof;
+ const int_type __eof = traits_type::eof();
+ bool __thiseof = traits_type::eq_int_type(_M_get(), __eof);
+ bool __beof = traits_type::eq_int_type(__b._M_get(), __eof);
return (__thiseof && __beof || (!__thiseof && !__beof));
}
#endif
+
+ private:
+ int_type
+ _M_get() const
+ {
+ const int_type __eof = traits_type::eof();
+ int_type __ret = __eof;
+ if (_M_sbuf)
+ {
+ if (!traits_type::eq_int_type(_M_c, __eof))
+ __ret = _M_c;
+ else
+ if (traits_type::eq_int_type((__ret = _M_sbuf->sgetc()), __eof))
+ _M_sbuf = 0;
+ }
+ return __ret;
+ }
};
template<typename _CharT, typename _Traits>
@@ -200,5 +149,58 @@ namespace std
operator!=(const istreambuf_iterator<_CharT, _Traits>& __a,
const istreambuf_iterator<_CharT, _Traits>& __b)
{ return !__a.equal(__b); }
+
+ template<typename _CharT, typename _Traits>
+ class ostreambuf_iterator
+ : public iterator<output_iterator_tag, void, void, void, void>
+ {
+ public:
+ // Types:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+ typedef basic_ostream<_CharT, _Traits> ostream_type;
+
+ private:
+ streambuf_type* _M_sbuf;
+ bool _M_failed;
+
+ public:
+ inline
+ ostreambuf_iterator(ostream_type& __s) throw ()
+ : _M_sbuf(__s.rdbuf()), _M_failed(!_M_sbuf) { }
+
+ ostreambuf_iterator(streambuf_type* __s) throw ()
+ : _M_sbuf(__s), _M_failed(!_M_sbuf) { }
+
+ ostreambuf_iterator&
+ operator=(_CharT __c);
+
+ ostreambuf_iterator&
+ operator*() throw()
+ { return *this; }
+
+ ostreambuf_iterator&
+ operator++(int) throw()
+ { return *this; }
+
+ ostreambuf_iterator&
+ operator++() throw()
+ { return *this; }
+
+ bool
+ failed() const throw()
+ { return _M_failed; }
+ };
+
+ template<typename _CharT, typename _Traits>
+ inline ostreambuf_iterator<_CharT, _Traits>&
+ ostreambuf_iterator<_CharT, _Traits>::operator=(_CharT __c)
+ {
+ if (!_M_failed &&
+ _Traits::eq_int_type(_M_sbuf->sputc(__c), _Traits::eof()))
+ _M_failed = true;
+ return *this;
+ }
} // namespace std
#endif