forked from OctaForge/libostd
get const right on ranges
parent
26f83b9efb
commit
a54db37a9c
|
@ -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);
|
||||||
|
|
48
octa/range.h
48
octa/range.h
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue