// Listing 1 - Sample Iterator Implementation
#include <iostream.h>
#include <list.h>

template<class T> class C {
    list<T> c;
  public:
    class I { // iterator class
        friend class C<T>;
        typedef list<T>::iterator LI;
        typedef list<T>::const_iterator cLI;
        typedef const void * const_void;
        const C<T> *pC;// container pointer
        cLI i;
        size_t n;
      public:
        I() : pC(0), n(0) { }
        I(const C<T>* p_, cLI i_) : pC(p_), i(i_), n(0) { }
        I(const I& i_) : pC(i_.pC), i(i_.i), n(i_.n) { }
        I& operator++() {
            if (pC)
               if (++n < pC->c.size())
                     ++i;
                  else 
                     pC = 0;
            return *this;
        }
      operator const void*() {return pC;}
      T& operator*() { return (T&)(*i); }
    };
    I begin() { return I(this,c.begin()); }
    I end()   { return I(); }
    void push_back(const T& x) { c.push_back(x); return; }
    friend class I;
};

using namespace std;

int main( void ) {
   C<int> myC;
   for (int i=0; i<5; ++i)
        myC.push_back(i);
   C<int>::I i = myC.begin();
   for (; i != myC.end(); ++i)
        cout << *i << " ";
   cout << endl;
    return 0;
}