forked from OctaForge/libostd
add optional pop_first_n and pop_last_n methods on ranges
This commit is contained in:
parent
56d8e481c8
commit
9c3486903d
66
octa/range.h
66
octa/range.h
|
@ -43,6 +43,24 @@ namespace octa {
|
||||||
T p_range;
|
T p_range;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename R>
|
||||||
|
RangeSize<R> __octa_pop_first_n(R &range, RangeSize<R> n) {
|
||||||
|
for (RangeSize<R> i = 0; i < n; ++i) {
|
||||||
|
if (range.empty()) return i;
|
||||||
|
range.pop_first();
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename R>
|
||||||
|
RangeSize<R> __octa_pop_last_n(R &range, RangeSize<R> n) {
|
||||||
|
for (RangeSize<R> i = 0; i < n; ++i) {
|
||||||
|
if (range.empty()) return i;
|
||||||
|
range.pop_last();
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename B, typename C, typename V, typename R = V &,
|
template<typename B, typename C, typename V, typename R = V &,
|
||||||
typename S = size_t
|
typename S = size_t
|
||||||
> struct InputRange {
|
> struct InputRange {
|
||||||
|
@ -57,6 +75,14 @@ namespace octa {
|
||||||
__OctaRangeIterator<B> end() {
|
__OctaRangeIterator<B> end() {
|
||||||
return __OctaRangeIterator<B>();
|
return __OctaRangeIterator<B>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SizeType pop_first_n(SizeType n) {
|
||||||
|
return __octa_pop_first_n<B>(*((B *)this), n);
|
||||||
|
}
|
||||||
|
|
||||||
|
SizeType pop_last_n(SizeType n) {
|
||||||
|
return __octa_pop_last_n<B>(*((B *)this), n);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename V, typename R = V &, typename S = size_t>
|
template<typename V, typename R = V &, typename S = size_t>
|
||||||
|
@ -118,6 +144,13 @@ namespace octa {
|
||||||
p_range.pop_first();
|
p_range.pop_first();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r_size pop_first_n(r_size n) {
|
||||||
|
return p_range.pop_first_n(n);
|
||||||
|
}
|
||||||
|
r_size pop_last_n(r_size n) {
|
||||||
|
return p_range.pop_last_n(n);
|
||||||
|
}
|
||||||
|
|
||||||
bool operator==(const ReverseRange &v) const {
|
bool operator==(const ReverseRange &v) const {
|
||||||
return p_range == v.p_range;
|
return p_range == v.p_range;
|
||||||
}
|
}
|
||||||
|
@ -208,6 +241,13 @@ namespace octa {
|
||||||
p_range.pop_last();
|
p_range.pop_last();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r_size pop_first_n(r_size n) {
|
||||||
|
return p_range.pop_first_n(n);
|
||||||
|
}
|
||||||
|
r_size pop_last_n(r_size n) {
|
||||||
|
return p_range.pop_last_n(n);
|
||||||
|
}
|
||||||
|
|
||||||
bool operator==(const MoveRange &v) const {
|
bool operator==(const MoveRange &v) const {
|
||||||
return p_range == v.p_range;
|
return p_range == v.p_range;
|
||||||
}
|
}
|
||||||
|
@ -306,6 +346,17 @@ namespace octa {
|
||||||
if (++p_beg == p_end) p_beg = p_end = nullptr;
|
if (++p_beg == p_end) p_beg = p_end = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t pop_first_n(size_t n) {
|
||||||
|
T *obeg = p_beg;
|
||||||
|
size_t olen = p_end - p_beg;
|
||||||
|
p_beg += n;
|
||||||
|
if (p_beg >= p_end) {
|
||||||
|
p_beg = p_end = nullptr;
|
||||||
|
return olen;
|
||||||
|
}
|
||||||
|
return p_beg - obeg;
|
||||||
|
}
|
||||||
|
|
||||||
T &first() { return *p_beg; }
|
T &first() { return *p_beg; }
|
||||||
const T &first() const { return *p_beg; }
|
const T &first() const { return *p_beg; }
|
||||||
|
|
||||||
|
@ -315,6 +366,17 @@ namespace octa {
|
||||||
if (p_end == p_beg) p_beg = p_end = nullptr;
|
if (p_end == p_beg) p_beg = p_end = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t pop_last_n(size_t n) {
|
||||||
|
T *oend = p_end;
|
||||||
|
size_t olen = p_end - p_beg;
|
||||||
|
p_end -= n;
|
||||||
|
if (p_end <= (p_beg + 1)) {
|
||||||
|
p_beg = p_end = nullptr;
|
||||||
|
return olen;
|
||||||
|
}
|
||||||
|
return oend - p_end;
|
||||||
|
}
|
||||||
|
|
||||||
T &last() { return *(p_end - 1); }
|
T &last() { return *(p_end - 1); }
|
||||||
const T &last() const { return *(p_end - 1); }
|
const T &last() const { return *(p_end - 1); }
|
||||||
|
|
||||||
|
@ -399,6 +461,10 @@ namespace octa {
|
||||||
++p_index; p_range.pop_first();
|
++p_index; p_range.pop_first();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r_size pop_first_n(r_size n) {
|
||||||
|
return p_range.pop_first_n(n);
|
||||||
|
}
|
||||||
|
|
||||||
EnumeratedValue<r_ref, r_size> first() {
|
EnumeratedValue<r_ref, r_size> first() {
|
||||||
return EnumeratedValue<r_ref, r_size> { p_index, p_range.first() };
|
return EnumeratedValue<r_ref, r_size> { p_index, p_range.first() };
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue