#include "python.h"

namespace python {

   template<class T>
      SeqBase<T>::iterator::~iterator () {}

   template<class T>
      SeqBase<T>::iterator::iterator () {
         seq = 0;
         count = 0;
      }

   template<class T>
      SeqBase<T>::iterator::iterator (SeqBase<T>* s, int where) 
      :seq(s), count(where) {} 

   template<class T>
      SeqBase<T>::iterator::iterator (const iterator& other) {
         seq = other.seq;
         count = other.count;
      }

   template<class T>
      bool  SeqBase<T>::iterator::operator== (const iterator& other) {
         return (seq == other.seq) && (count == other.count);
      }

   template<class T>
      bool  SeqBase<T>::iterator::operator!= (const iterator& other) {
         return (seq != other.seq) || (count != other.count);
      }

   template<class T>
      bool  SeqBase<T>::iterator::operator< (const iterator& other) {
         return (count < other.count);
      }

   template<class T>
      bool  SeqBase<T>::iterator::operator> (const iterator& other) {
         return (count > other.count);
      }

   template<class T>
      bool  SeqBase<T>::iterator::operator<= (const iterator& other) {
         return (count <= other.count);
      }

   template<class T>
      bool  SeqBase<T>::iterator::operator>= (const iterator& other) {
         return (count >= other.count);
      }

   template<class T>
      seqref<T>  SeqBase<T>::iterator::operator*() {
         return seqref<T>(*seq, count);
      }

   template<class T>
      seqref<T>  SeqBase<T>::iterator::operator[] (sequence_index_type i) {
         return seqref<T>(*seq, count + i);
      }

   template<class T> typename
      SeqBase<T>::iterator&  SeqBase<T>::iterator::operator=(const iterator& other) {
         if (this == &other) return *this;
         seq = other.seq;
         count = other.count;
         return *this;
      }

   template<class T> typename
      SeqBase<T>::iterator  SeqBase<T>::iterator::operator+(int n) const {
         return iterator(seq, count + n);
      }

   template<class T> typename
      SeqBase<T>::iterator  SeqBase<T>::iterator::operator-(int n) const {
         return iterator(seq, count - n);
      }

   template<class T> typename
      SeqBase<T>::iterator&  SeqBase<T>::iterator::operator+=(int n) {
         count = count + n;
         return *this;
      }

   template<class T> typename
      SeqBase<T>::iterator&  SeqBase<T>::iterator::operator-=(int n) {
         count = count - n;
         return *this;
      }

   template<class T>
      int  SeqBase<T>::iterator::operator-(const iterator& other) const {
         if (seq != other.seq) 
            throw RuntimeError ("SeqBase<T>::iterator comparison error");
         return count - other.count;
      }

   // prefix ++
   template<class T> typename
      SeqBase<T>::iterator&  SeqBase<T>::iterator::operator++ () { count++; return *this;}
   // postfix ++
   template<class T> typename
      SeqBase<T>::iterator  SeqBase<T>::iterator::operator++ (int) { return iterator(seq, count++);}
   // prefix --
   template<class T> typename
      SeqBase<T>::iterator&  SeqBase<T>::iterator::operator-- () { count--; return *this;}
   // postfix --
   template<class T> typename
      SeqBase<T>::iterator SeqBase<T>::iterator::operator-- (int) { return iterator(seq, count--);}

   template<class T>
      std::string  SeqBase<T>::iterator::diagnose() const {
         std::ostringstream oss;
         //std::ostrstream oss;
         oss << "iterator diagnosis " << seq << ", " << count << std::ends;
         return std::string(oss.str());
      }
}


syntax highlighted by Code2HTML, v. 0.9.1