get const right on ranges

master
Daniel Kolesa 2015-05-29 20:21:35 +01:00
parent 26f83b9efb
commit a54db37a9c
2 changed files with 14 additions and 41 deletions

View File

@ -455,15 +455,9 @@ namespace octa {
R first() const { return p_func(p_range.first()); } R first() const { return p_func(p_range.first()); }
R last() const { return p_func(p_range.last()); } R last() const { return p_func(p_range.last()); }
R first() { return p_func(p_range.first()); }
R last() { return p_func(p_range.last()); }
R operator[](RangeSize<T> idx) const { R operator[](RangeSize<T> idx) const {
return p_func(p_range[idx]); return p_func(p_range[idx]);
} }
R operator[](RangeSize<T> idx) {
return p_func(p_range[idx]);
}
MapRange<T, R> slice(RangeSize<T> start, RangeSize<T> end) { MapRange<T, R> slice(RangeSize<T> start, RangeSize<T> end) {
return MapRange<T, R>(p_range.slice(start, end), p_func); return MapRange<T, R>(p_range.slice(start, end), p_func);
@ -546,7 +540,6 @@ namespace octa {
} }
RangeReference<T> first() const { return p_range.first(); } RangeReference<T> first() const { return p_range.first(); }
RangeReference<T> first() { return p_range.first(); }
bool operator==(const FilterRange &v) const { bool operator==(const FilterRange &v) const {
return (p_range == v.p_range) && (p_pred == v.p_pred); return (p_range == v.p_range) && (p_pred == v.p_pred);

View File

@ -107,9 +107,6 @@ namespace octa {
p_range.pop_first(); p_range.pop_first();
return *this; return *this;
} }
RangeReference<T> operator*() {
return p_range.first();
}
RangeReference<T> operator*() const { RangeReference<T> operator*() const {
return p_range.first(); return p_range.first();
} }
@ -252,16 +249,12 @@ namespace octa {
return p_range != v.p_range; return p_range != v.p_range;
} }
r_ref first() { return p_range.last(); }
r_ref first() const { return p_range.last(); } r_ref first() const { return p_range.last(); }
r_ref last() { return p_range.first(); }
r_ref last() const { return p_range.first(); } r_ref last() const { return p_range.first(); }
r_ref operator[](r_size i) { return p_range[size() - i - 1]; }
r_ref operator[](r_size i) const { return p_range[size() - i - 1]; } r_ref operator[](r_size i) const { return p_range[size() - i - 1]; }
ReverseRange<T> slice(r_size start, r_size end) { ReverseRange<T> slice(r_size start, r_size end) const {
r_size len = p_range.size(); r_size len = p_range.size();
return ReverseRange<T>(p_range.slice(len - end, len - start)); return ReverseRange<T>(p_range.slice(len - end, len - start));
} }
@ -331,12 +324,12 @@ namespace octa {
return p_range != v.p_range; return p_range != v.p_range;
} }
r_ref first() { return move(p_range.first()); } r_ref first() const { return move(p_range.first()); }
r_ref last() { return move(p_range.last()); } r_ref last() const { return move(p_range.last()); }
r_ref operator[](r_size i) { return move(p_range[i]); } r_ref operator[](r_size i) const { return move(p_range[i]); }
MoveRange<T> slice(r_size start, r_size end) { MoveRange<T> slice(r_size start, r_size end) const {
return MoveRange<T>(p_range.slice(start, end)); return MoveRange<T>(p_range.slice(start, end));
} }
@ -350,7 +343,7 @@ namespace octa {
} }
template<typename T> template<typename T>
struct NumberRange: InputRange<NumberRange<T>, ForwardRangeTag, T> { struct NumberRange: InputRange<NumberRange<T>, ForwardRangeTag, T, T> {
NumberRange(): p_a(0), p_b(0), p_step(0) {} NumberRange(): p_a(0), p_b(0), p_step(0) {}
NumberRange(const NumberRange &it): p_a(it.p_a), p_b(it.p_b), NumberRange(const NumberRange &it): p_a(it.p_a), p_b(it.p_b),
p_step(it.p_step) {} p_step(it.p_step) {}
@ -368,7 +361,7 @@ namespace octa {
bool empty() const { return p_a * p_step >= p_b * p_step; } bool empty() const { return p_a * p_step >= p_b * p_step; }
bool pop_first() { p_a += p_step; return true; } bool pop_first() { p_a += p_step; return true; }
bool push_first() { p_a -= p_step; return true; } bool push_first() { p_a -= p_step; return true; }
T &first() { return p_a; } T first() const { return p_a; }
private: private:
T p_a, p_b, p_step; T p_a, p_b, p_step;
@ -432,8 +425,7 @@ namespace octa {
p_beg -= n; return true; p_beg -= n; return true;
} }
T &first() { return *p_beg; } T &first() const { return *p_beg; }
const T &first() const { return *p_beg; }
/* satisfy BidirectionalRange */ /* satisfy BidirectionalRange */
bool pop_last() { bool pop_last() {
@ -460,18 +452,16 @@ namespace octa {
p_end += n; return true; p_end += n; return true;
} }
T &last() { return *(p_end - 1); } T &last() const { return *(p_end - 1); }
const T &last() const { return *(p_end - 1); }
/* satisfy FiniteRandomAccessRange */ /* satisfy FiniteRandomAccessRange */
size_t size() const { return p_end - p_beg; } size_t size() const { return p_end - p_beg; }
PointerRange slice(size_t start, size_t end) { PointerRange slice(size_t start, size_t end) const {
return PointerRange(p_beg + start, p_beg + end); return PointerRange(p_beg + start, p_beg + end);
} }
T &operator[](size_t i) { return p_beg[i]; } T &operator[](size_t i) const { return p_beg[i]; }
const T &operator[](size_t i) const { return p_beg[i]; }
/* satisfy OutputRange */ /* satisfy OutputRange */
void put(const T &v) { void put(const T &v) {
@ -552,9 +542,6 @@ namespace octa {
return ret; return ret;
} }
EnumeratedValue<r_ref, r_size> first() {
return EnumeratedValue<r_ref, r_size> { p_index, p_range.first() };
}
EnumeratedValue<r_ref, r_size> first() const { EnumeratedValue<r_ref, r_size> first() const {
return EnumeratedValue<r_ref, r_size> { p_index, p_range.first() }; return EnumeratedValue<r_ref, r_size> { p_index, p_range.first() };
} }
@ -627,7 +614,6 @@ namespace octa {
return ret; return ret;
} }
RangeReference<T> first() { return p_range.first(); }
RangeReference<T> first() const { return p_range.first(); } RangeReference<T> first() const { return p_range.first(); }
RangeSize<T> size() const { RangeSize<T> size() const {
@ -660,21 +646,15 @@ namespace octa {
return psize; return psize;
} }
RangeReference<T> last() {
static_assert(IsRandomAccessRange<T>::value,
"last() only available for random access ranges");
return p_range[size() - 1];
}
RangeReference<T> last() const { RangeReference<T> last() const {
static_assert(IsRandomAccessRange<T>::value, static_assert(IsRandomAccessRange<T>::value,
"last() only available for random access ranges"); "last() only available for random access ranges");
return p_range[size() - 1]; return p_range[size() - 1];
} }
RangeReference<T> operator[](RangeSize<T> idx) {
return p_range[idx];
}
RangeReference<T> operator[](RangeSize<T> idx) const { RangeReference<T> operator[](RangeSize<T> idx) const {
static_assert(IsRandomAccessRange<T>::value,
"operator[] only available for random access ranges");
return p_range[idx]; return p_range[idx];
} }
@ -739,7 +719,7 @@ namespace octa {
return p_range.push_first_n(p_chunksize * an) / p_chunksize; return p_range.push_first_n(p_chunksize * an) / p_chunksize;
} }
TakeRange<T> first() { return take(p_range, p_chunksize); } TakeRange<T> first() const { return take(p_range, p_chunksize); }
bool operator==(const ChunksRange &v) const { bool operator==(const ChunksRange &v) const {
return p_chunksize == v.p_chunksize && p_range == v.p_range; return p_chunksize == v.p_chunksize && p_range == v.p_range;