From ff5fc7368dc2a9aee79b4b0b174c201326b08ba9 Mon Sep 17 00:00:00 2001 From: q66 Date: Tue, 21 Apr 2015 17:58:36 +0100 Subject: [PATCH] add EnumeratedRange + octa::enumerate --- octa/range.h | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/octa/range.h b/octa/range.h index 70e940c..d206392 100644 --- a/octa/range.h +++ b/octa/range.h @@ -285,6 +285,77 @@ namespace octa { private: T *p_beg, *p_end; }; + + template + struct EnumeratedValue { + size_t index; + T value; + }; + + template + struct EnumeratedRange: InputRangeBase, + InputRange, typename RangeTraits::value, + EnumeratedValue::reference> + > { + EnumeratedRange(): p_range(), p_index(0) {} + EnumeratedRange(const T &range): p_range(range), p_index(0) {} + EnumeratedRange(const EnumeratedRange &it): p_range(it.p_range), + p_index(it.p_index) {} + EnumeratedRange(EnumeratedRange &&it): p_range(move(it.p_range)), + p_index(it.p_index) {} + + EnumeratedRange &operator=(const EnumeratedRange &v) { + p_range = v.p_range; + p_index = v.p_index; + return *this; + } + EnumeratedRange &operator=(EnumeratedRange &&v) { + p_range = move(v.p_range); + p_index = v.p_index; + return *this; + } + EnumeratedRange &operator=(const T &v) { + p_range = v; + p_index = 0; + return *this; + } + EnumeratedRange &operator=(T &&v) { + p_range = forward(v); + p_index = 0; + return *this; + } + + bool empty() const { return p_range.empty(); } + + void pop_first() { ++p_index; p_range.pop_first(); } + + EnumeratedValue::reference> first() { + return EnumeratedValue::reference> { + p_index, p_range.first() + }; + } + EnumeratedValue::reference> first() const { + return EnumeratedValue::reference> { + p_index, p_range.first() + }; + } + + bool operator==(const EnumeratedRange &v) const { + return p_range == v.p_range; + } + bool operator!=(const EnumeratedRange &v) const { + return p_range != v.p_range; + } + + private: + T p_range; + size_t p_index; + }; + + template + EnumeratedRange enumerate(const T &it) { + return EnumeratedRange(it); + } } #endif \ No newline at end of file