00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00035
#ifndef _CPP_BITS_STREAM_ITERATOR_H
00036
#define _CPP_BITS_STREAM_ITERATOR_H 1
00037
00038
#pragma GCC system_header
00039
00040
namespace std
00041 {
00042
template<
typename _Tp,
typename _CharT =
char,
00043
typename _Traits = char_traits<_CharT>,
typename _Dist = ptrdiff_t>
00044
class istream_iterator
00045 :
public iterator<input_iterator_tag, _Tp, _Dist, const _Tp*, const _Tp&>
00046 {
00047
public:
00048
typedef _CharT char_type;
00049
typedef _Traits traits_type;
00050
typedef basic_istream<_CharT, _Traits> istream_type;
00051
00052
private:
00053 istream_type* _M_stream;
00054 _Tp _M_value;
00055
bool _M_ok;
00056
00057
public:
00058 istream_iterator() : _M_stream(0), _M_ok(false) {}
00059
00060 istream_iterator(istream_type& __s) : _M_stream(&__s) { _M_read(); }
00061
00062 istream_iterator(
const istream_iterator& __obj)
00063 : _M_stream(__obj._M_stream), _M_value(__obj._M_value),
00064 _M_ok(__obj._M_ok)
00065 { }
00066
00067
const _Tp&
00068 operator*()
const {
return _M_value; }
00069
00070
const _Tp*
00071 operator->()
const {
return &(operator*()); }
00072
00073 istream_iterator&
00074 operator++()
00075 { _M_read();
return *
this; }
00076
00077 istream_iterator
00078 operator++(
int)
00079 {
00080 istream_iterator __tmp = *
this;
00081 _M_read();
00082
return __tmp;
00083 }
00084
00085
bool
00086 _M_equal(
const istream_iterator& __x)
const
00087
{
return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream);}
00088
00089
private:
00090
void
00091 _M_read()
00092 {
00093 _M_ok = (_M_stream && *_M_stream) ?
true :
false;
00094
if (_M_ok)
00095 {
00096 *_M_stream >> _M_value;
00097 _M_ok = *_M_stream ?
true :
false;
00098 }
00099 }
00100 };
00101
00102
template<
typename _Tp,
typename _CharT,
typename _Traits,
typename _Dist>
00103
inline bool
00104
operator==(
const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x,
00105
const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y)
00106 {
return __x._M_equal(__y); }
00107
00108
template <
class _Tp,
class _CharT,
class _Traits,
class _Dist>
00109
inline bool
00110
operator!=(
const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x,
00111
const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y)
00112 {
return !__x._M_equal(__y); }
00113
00114
00115
template<
typename _Tp,
typename _CharT =
char,
00116
typename _Traits = char_traits<_CharT> >
00117
class ostream_iterator
00118 :
public iterator<output_iterator_tag, void, void, void, void>
00119 {
00120
public:
00121
typedef _CharT char_type;
00122
typedef _Traits traits_type;
00123
typedef basic_ostream<_CharT, _Traits> ostream_type;
00124
00125
private:
00126 ostream_type* _M_stream;
00127
const _CharT* _M_string;
00128
00129
public:
00130 ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {}
00131
00132 ostream_iterator(ostream_type& __s,
const _CharT* __c)
00133 : _M_stream(&__s), _M_string(__c) { }
00134
00135 ostream_iterator(
const ostream_iterator& __obj)
00136 : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { }
00137
00138 ostream_iterator&
00139 operator=(
const _Tp& __value)
00140 {
00141 *_M_stream << __value;
00142
if (_M_string) *_M_stream << _M_string;
00143
return *
this;
00144 }
00145
00146 ostream_iterator&
00147 operator*() {
return *
this; }
00148
00149 ostream_iterator&
00150 operator++() {
return *
this; }
00151
00152 ostream_iterator&
00153 operator++(
int) {
return *
this; }
00154 };
00155 }
00156
#endif