1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
template <class T>
class dbg_iter_mixin : public virtual T
{
public:
int offset;
dbg_iter_mixin(const T& t) : T(t)
{}
T& operator=(const T& t)
{
return T::operator=(t);
}
dbg_iter_mixin& operator++ ()
{
++offset;
T::operator++();
return *this;
}
dbg_iter_mixin operator++ (int i)
{
++offset;
return T::operator++(i);
}
char operator *() const
{
T::value_type c=T::operator*();
std::cerr<<offset<<":"<<c<<std::endl;
return c;
}
};
template <class T>
class dbg_iter : public dbg_iter_mixin<T>
{
public:
dbg_iter(const T& t) : dbg_iter_mixin<T>(t)
{}
};
template<class T>
class dbg_iter<std::istreambuf_iterator<T> > :
public virtual std::istreambuf_iterator<T>,
public dbg_iter_mixin<std::istreambuf_iterator<T> >
{
public:
dbg_iter(std::basic_streambuf<T> *buf) : std::istreambuf_iterator<T>(buf)
{}
};
|