#include "python.h" namespace python { template SeqBase::iterator::~iterator () {} template SeqBase::iterator::iterator () { seq = 0; count = 0; } template SeqBase::iterator::iterator (SeqBase* s, int where) :seq(s), count(where) {} template SeqBase::iterator::iterator (const iterator& other) { seq = other.seq; count = other.count; } template bool SeqBase::iterator::operator== (const iterator& other) { return (seq == other.seq) && (count == other.count); } template bool SeqBase::iterator::operator!= (const iterator& other) { return (seq != other.seq) || (count != other.count); } template bool SeqBase::iterator::operator< (const iterator& other) { return (count < other.count); } template bool SeqBase::iterator::operator> (const iterator& other) { return (count > other.count); } template bool SeqBase::iterator::operator<= (const iterator& other) { return (count <= other.count); } template bool SeqBase::iterator::operator>= (const iterator& other) { return (count >= other.count); } template seqref SeqBase::iterator::operator*() { return seqref(*seq, count); } template seqref SeqBase::iterator::operator[] (sequence_index_type i) { return seqref(*seq, count + i); } template typename SeqBase::iterator& SeqBase::iterator::operator=(const iterator& other) { if (this == &other) return *this; seq = other.seq; count = other.count; return *this; } template typename SeqBase::iterator SeqBase::iterator::operator+(int n) const { return iterator(seq, count + n); } template typename SeqBase::iterator SeqBase::iterator::operator-(int n) const { return iterator(seq, count - n); } template typename SeqBase::iterator& SeqBase::iterator::operator+=(int n) { count = count + n; return *this; } template typename SeqBase::iterator& SeqBase::iterator::operator-=(int n) { count = count - n; return *this; } template int SeqBase::iterator::operator-(const iterator& other) const { if (seq != other.seq) throw RuntimeError ("SeqBase::iterator comparison error"); return count - other.count; } // prefix ++ template typename SeqBase::iterator& SeqBase::iterator::operator++ () { count++; return *this;} // postfix ++ template typename SeqBase::iterator SeqBase::iterator::operator++ (int) { return iterator(seq, count++);} // prefix -- template typename SeqBase::iterator& SeqBase::iterator::operator-- () { count--; return *this;} // postfix -- template typename SeqBase::iterator SeqBase::iterator::operator-- (int) { return iterator(seq, count--);} template std::string SeqBase::iterator::diagnose() const { std::ostringstream oss; //std::ostrstream oss; oss << "iterator diagnosis " << seq << ", " << count << std::ends; return std::string(oss.str()); } }