// TEMPLATE CLASS istream_iterator
template<class T, class Dist = ptrdiff_t>
class istream_iterator : public input_iterator<T, Dist> {
public:
istream_iterator()
: Istr(0) {}
istream_iterator(istream& is)
: Istr(&is) {_Getval(); }
const T& operator*() const
{return (Val); }
const T *operator->() const
{return (&**this); }
istream_iterator<T, Dist>& operator++()
{_Getval();
return (*this); }
istream_iterator<T, Dist> operator++(int)
{istream_iterator<T, Dist> tmp = *this;
_Getval();
return (tmp); }
bool Equal(const istream_iterator<T, Dist>& x) const
{return (Istr == x.Istr); }
protected:
void _Getval()
{if (Istr != 0 && !(*Istr >> Val))
Istr = 0; }
istream *Istr;
T Val;
};
// istream_iterator OPERATORS
template<class T, class Dist> inline
bool operator==(const istream_iterator<T, Dist>& x,
const istream_iterator<T, Dist>& y)
{return (x.Equal(y)); }
// TEMPLATE CLASS ostream_iterator
template<class T>
class ostream_iterator : public output_iterator {
public:
ostream_iterator(ostream& os, const char *Dist = 0)
: Ostr(&os), Delim(Dist) {}
ostream_iterator<T>& operator=(const T& x)
{*Ostr << x;
if (Delim != 0)
*Ostr << Delim;
return (*this); }
ostream_iterator<T>& operator*()
{return (*this); }
ostream_iterator<T>& operator++()
{return (*this); }
ostream_iterator<T> operator++(int)
{return (*this); }
protected:
const char *Delim;
ostream *Ostr;
};
/* End of File */