diff --git a/octa/range.h b/octa/range.h index dc62dc9..f151b93 100644 --- a/octa/range.h +++ b/octa/range.h @@ -86,10 +86,24 @@ namespace octa { } }; - template + template class T, typename U> struct Range { - RangeIterator begin() { return RangeIterator((const T &)*this); } - RangeIterator end() { return RangeIterator(); } + RangeIterator> begin() { + return RangeIterator>((const T &)*this); + } + RangeIterator> end() { + return RangeIterator>(); + } + + template + friend bool operator==(const T &a, const T &b) { + return a.equals(b); + } + + template + friend bool operator!=(const T &a, const T &b) { + return !a.equals(b); + } }; } diff --git a/octa/vector.h b/octa/vector.h index a5a6aa9..af0f1dd 100644 --- a/octa/vector.h +++ b/octa/vector.h @@ -16,7 +16,7 @@ namespace octa { template - struct VectorRange: Range > { + struct VectorRange: Range { struct type { typedef ptrdiff_t difference; typedef T value; @@ -40,14 +40,8 @@ namespace octa { if (++p_beg == p_end) p_beg = p_end = nullptr; } - template - friend bool operator==(const VectorRange &a, const VectorRange &b) { - return a.p_beg == b.p_beg && a.p_end == b.p_end; - } - - template - friend bool operator!=(const VectorRange &a, const VectorRange &b) { - return a.p_beg != b.p_beg || a.p_end != b.p_end; + template bool equals(const VectorRange &v) const { + return p_beg == v.p_beg && p_end == v.p_end; } /* satisfy ForwardRange */