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
00030 #ifndef _STREAM_ITERATOR_H
00031 #define _STREAM_ITERATOR_H 1
00032
00033 #pragma GCC system_header
00034
00035 #include <debug/debug.h>
00036
00037 namespace std _GLIBCXX_VISIBILITY(default)
00038 {
00039 _GLIBCXX_BEGIN_NAMESPACE_VERSION
00040
00041
00042
00043
00044
00045
00046
00047 template<typename _Tp, typename _CharT = char,
00048 typename _Traits = char_traits<_CharT>, typename _Dist = ptrdiff_t>
00049 class istream_iterator
00050 : public iterator<input_iterator_tag, _Tp, _Dist, const _Tp*, const _Tp&>
00051 {
00052 public:
00053 typedef _CharT char_type;
00054 typedef _Traits traits_type;
00055 typedef basic_istream<_CharT, _Traits> istream_type;
00056
00057 private:
00058 istream_type* _M_stream;
00059 _Tp _M_value;
00060 bool _M_ok;
00061
00062 public:
00063
00064 _GLIBCXX_CONSTEXPR istream_iterator()
00065 : _M_stream(0), _M_value(), _M_ok(false) {}
00066
00067
00068 istream_iterator(istream_type& __s)
00069 : _M_stream(&__s)
00070 { _M_read(); }
00071
00072 istream_iterator(const istream_iterator& __obj)
00073 : _M_stream(__obj._M_stream), _M_value(__obj._M_value),
00074 _M_ok(__obj._M_ok)
00075 { }
00076
00077 const _Tp&
00078 operator*() const
00079 {
00080 __glibcxx_requires_cond(_M_ok,
00081 _M_message(__gnu_debug::__msg_deref_istream)
00082 ._M_iterator(*this));
00083 return _M_value;
00084 }
00085
00086 const _Tp*
00087 operator->() const { return &(operator*()); }
00088
00089 istream_iterator&
00090 operator++()
00091 {
00092 __glibcxx_requires_cond(_M_ok,
00093 _M_message(__gnu_debug::__msg_inc_istream)
00094 ._M_iterator(*this));
00095 _M_read();
00096 return *this;
00097 }
00098
00099 istream_iterator
00100 operator++(int)
00101 {
00102 __glibcxx_requires_cond(_M_ok,
00103 _M_message(__gnu_debug::__msg_inc_istream)
00104 ._M_iterator(*this));
00105 istream_iterator __tmp = *this;
00106 _M_read();
00107 return __tmp;
00108 }
00109
00110 bool
00111 _M_equal(const istream_iterator& __x) const
00112 { return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); }
00113
00114 private:
00115 void
00116 _M_read()
00117 {
00118 _M_ok = (_M_stream && *_M_stream) ? true : false;
00119 if (_M_ok)
00120 {
00121 *_M_stream >> _M_value;
00122 _M_ok = *_M_stream ? true : false;
00123 }
00124 }
00125 };
00126
00127
00128 template<typename _Tp, typename _CharT, typename _Traits, typename _Dist>
00129 inline bool
00130 operator==(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x,
00131 const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y)
00132 { return __x._M_equal(__y); }
00133
00134
00135 template <class _Tp, class _CharT, class _Traits, class _Dist>
00136 inline bool
00137 operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __x,
00138 const istream_iterator<_Tp, _CharT, _Traits, _Dist>& __y)
00139 { return !__x._M_equal(__y); }
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 template<typename _Tp, typename _CharT = char,
00153 typename _Traits = char_traits<_CharT> >
00154 class ostream_iterator
00155 : public iterator<output_iterator_tag, void, void, void, void>
00156 {
00157 public:
00158
00159
00160 typedef _CharT char_type;
00161 typedef _Traits traits_type;
00162 typedef basic_ostream<_CharT, _Traits> ostream_type;
00163
00164
00165 private:
00166 ostream_type* _M_stream;
00167 const _CharT* _M_string;
00168
00169 public:
00170
00171 ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {}
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 ostream_iterator(ostream_type& __s, const _CharT* __c)
00184 : _M_stream(&__s), _M_string(__c) { }
00185
00186
00187 ostream_iterator(const ostream_iterator& __obj)
00188 : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { }
00189
00190
00191
00192 ostream_iterator&
00193 operator=(const _Tp& __value)
00194 {
00195 __glibcxx_requires_cond(_M_stream != 0,
00196 _M_message(__gnu_debug::__msg_output_ostream)
00197 ._M_iterator(*this));
00198 *_M_stream << __value;
00199 if (_M_string) *_M_stream << _M_string;
00200 return *this;
00201 }
00202
00203 ostream_iterator&
00204 operator*()
00205 { return *this; }
00206
00207 ostream_iterator&
00208 operator++()
00209 { return *this; }
00210
00211 ostream_iterator&
00212 operator++(int)
00213 { return *this; }
00214 };
00215
00216
00217
00218 _GLIBCXX_END_NAMESPACE_VERSION
00219 }
00220
00221 #endif