simplify ranges a bit

master
Daniel Kolesa 2015-04-16 01:18:18 +01:00
parent c27a77b611
commit cb68ada121
2 changed files with 20 additions and 12 deletions

View File

@ -86,10 +86,24 @@ namespace octa {
}
};
template<typename T>
template<template<typename> class T, typename U>
struct Range {
RangeIterator<T> begin() { return RangeIterator<T>((const T &)*this); }
RangeIterator<T> end() { return RangeIterator<T>(); }
RangeIterator<T<U>> begin() {
return RangeIterator<T<U>>((const T<U> &)*this);
}
RangeIterator<T<U>> end() {
return RangeIterator<T<U>>();
}
template<typename V>
friend bool operator==(const T<U> &a, const T<V> &b) {
return a.equals(b);
}
template<typename V>
friend bool operator!=(const T<U> &a, const T<V> &b) {
return !a.equals(b);
}
};
}

View File

@ -16,7 +16,7 @@
namespace octa {
template<typename T>
struct VectorRange: Range<VectorRange<T> > {
struct VectorRange: Range<VectorRange, T> {
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<typename U>
friend bool operator==(const VectorRange &a, const VectorRange<U> &b) {
return a.p_beg == b.p_beg && a.p_end == b.p_end;
}
template<typename U>
friend bool operator!=(const VectorRange &a, const VectorRange<U> &b) {
return a.p_beg != b.p_beg || a.p_end != b.p_end;
template<typename U> bool equals(const VectorRange<U> &v) const {
return p_beg == v.p_beg && p_end == v.p_end;
}
/* satisfy ForwardRange */