From 07881f2a4fac1c6d399ce359b80d4bbe21f27c48 Mon Sep 17 00:00:00 2001 From: q66 Date: Wed, 27 May 2015 20:56:44 +0100 Subject: [PATCH] octa::chunks --- octa/range.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/octa/range.h b/octa/range.h index 069fe60..cbd6724 100644 --- a/octa/range.h +++ b/octa/range.h @@ -651,6 +651,51 @@ namespace octa { return TakeRange(it, n); } + template + struct ChunksRange: InputRange, + CommonType, ForwardRangeTag>, + TakeRange, TakeRange, RangeSize + > { + private: + T p_range; + RangeSize p_chunksize; + public: + ChunksRange(): p_range(), p_chunksize(0) {} + ChunksRange(const T &range, RangeSize chs): p_range(range), + p_chunksize(chs) {} + ChunksRange(const ChunksRange &it): p_range(it.p_range), + p_chunksize(it.p_chunksize) {} + ChunksRange(ChunksRange &&it): p_range(move(it.p_range)), + p_chunksize(it.p_chunksize) {} + + ChunksRange &operator=(const ChunksRange &v) { + p_range = v.p_range; p_chunksize = v.p_chunksize; return *this; + } + ChunksRange &operator=(ChunksRange &&v) { + p_range = move(v.p_range); p_chunksize = v.p_chunksize; return *this; + } + + bool empty() const { return p_range.empty(); } + void pop_first() { p_range.pop_first_n(p_chunksize); } + RangeSize pop_first_n(RangeSize n) { + return p_range.pop_first_n(p_chunksize * n); + } + + TakeRange first() { return take(p_range, p_chunksize); } + + bool operator==(const ChunksRange &v) const { + return p_chunksize == v.p_chunksize && p_range == v.p_range; + } + bool operator!=(const ChunksRange &v) const { + return p_chunksize != v.p_chunksize || p_range != v.p_range; + } + }; + + template + ChunksRange chunks(const T &it, RangeSize chs) { + return ChunksRange(it, chs); + } + template auto each(T &r) -> decltype(r.each()) { return r.each();