From f9adf08ef9315dcdd8d4b06f76eab0d9d01ddc30 Mon Sep 17 00:00:00 2001 From: q66 Date: Wed, 10 Jun 2015 00:12:52 +0100 Subject: [PATCH] turn make_move_range into .movable() on any range, and make_half_range(h1, h2) into h1.each(h2) --- octa/range.h | 190 +++++++++++++++++++++++++-------------------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/octa/range.h b/octa/range.h index 8a81bba..62af657 100644 --- a/octa/range.h +++ b/octa/range.h @@ -141,6 +141,8 @@ namespace detail { // range half +template struct HalfRange; + template struct RangeHalf { private: @@ -247,6 +249,10 @@ public: else prev_n(n); return *this; } + + HalfRange each(const RangeHalf &other) const { + return HalfRange(*this, other); + } }; template @@ -285,6 +291,7 @@ namespace detail { } template struct ReverseRange; +template struct MoveRange; template half() const { - return RangeHalf(*((B *)this)); + return RangeHalf(each()); + } + + MoveRange movable() const { + return MoveRange(each()); } }; @@ -371,6 +382,89 @@ template +struct HalfRange: InputRange, + RangeCategory, RangeValue, RangeReference, RangeSize, + RangeDifference +> { +private: + T p_beg; + T p_end; +public: + HalfRange(): p_beg(), p_end() {} + HalfRange(const HalfRange &range): p_beg(range.p_beg), + p_end(range.p_end) {} + HalfRange(HalfRange &&range): p_beg(octa::move(range.p_beg)), + p_end(octa::move(range.p_end)) {} + HalfRange(const T &beg, const T &end): p_beg(beg), + p_end(end) {} + HalfRange(T &&beg, T &&end): p_beg(octa::move(beg)), + p_end(octa::move(end)) {} + + HalfRange &operator=(const HalfRange &range) { + p_beg = range.p_beg; + p_end = range.p_end; + return *this; + } + + HalfRange &operator=(HalfRange &&range) { + p_beg = octa::move(range.p_beg); + p_end = octa::move(range.p_end); + return *this; + } + + bool empty() const { return p_beg == p_end; } + + bool pop_front() { + if (empty()) return false; + return p_beg.next(); + } + bool push_front() { + return p_beg.prev(); + } + bool pop_back() { + if (empty()) return false; + return p_end.prev(); + } + bool push_back() { + return p_end.next(); + } + + RangeReference front() const { return *p_beg; } + RangeReference back() const { return *(p_end - 1); } + + bool equals_front(const HalfRange &range) const { + return p_beg == range.p_beg; + } + bool equals_back(const HalfRange &range) const { + return p_end == range.p_end; + } + + RangeDifference distance_front(const HalfRange &range) const { + return range.p_beg - p_beg; + } + RangeDifference distance_back(const HalfRange &range) const { + return range.p_end - p_end; + } + + RangeSize size() const { return p_end - p_beg; } + + HalfRange slice(RangeSize start, RangeSize p_end) const { + return HalfRange(p_beg + start, p_beg + p_end); + } + + RangeReference operator[](RangeSize idx) const { + return p_beg[idx]; + } + + void put(const RangeValue &v) { + p_beg.range().put(v); + } + void put(RangeValue &&v) { + p_beg.range().put(octa::move(v)); + } +}; + template struct ReverseRange: InputRange, RangeCategory, RangeValue, RangeReference, RangeSize, @@ -528,11 +622,6 @@ public: void put(Rval &&v) { p_range.put(octa::move(v)); } }; -template -MoveRange make_move_range(const T &it) { - return MoveRange(it); -} - template struct NumberRange: InputRange, ForwardRangeTag, T, T> { NumberRange(): p_a(0), p_b(0), p_step(0) {} @@ -902,95 +991,6 @@ ChunksRange chunks(const T &it, RangeSize chs) { // range of template using RangeOf = decltype(octa::each(octa::declval())); -template -struct HalfRange: InputRange, - RangeCategory, RangeValue, RangeReference, RangeSize, - RangeDifference -> { -private: - T p_beg; - T p_end; -public: - HalfRange(): p_beg(), p_end() {} - HalfRange(const HalfRange &range): p_beg(range.p_beg), - p_end(range.p_end) {} - HalfRange(HalfRange &&range): p_beg(octa::move(range.p_beg)), - p_end(octa::move(range.p_end)) {} - HalfRange(const T &beg, const T &end): p_beg(beg), - p_end(end) {} - HalfRange(T &&beg, T &&end): p_beg(octa::move(beg)), - p_end(octa::move(end)) {} - - HalfRange &operator=(const HalfRange &range) { - p_beg = range.p_beg; - p_end = range.p_end; - return *this; - } - - HalfRange &operator=(HalfRange &&range) { - p_beg = octa::move(range.p_beg); - p_end = octa::move(range.p_end); - return *this; - } - - bool empty() const { return p_beg == p_end; } - - bool pop_front() { - if (empty()) return false; - return p_beg.next(); - } - bool push_front() { - return p_beg.prev(); - } - bool pop_back() { - if (empty()) return false; - return p_end.prev(); - } - bool push_back() { - return p_end.next(); - } - - RangeReference front() const { return *p_beg; } - RangeReference back() const { return *(p_end - 1); } - - bool equals_front(const HalfRange &range) const { - return p_beg == range.p_beg; - } - bool equals_back(const HalfRange &range) const { - return p_end == range.p_end; - } - - RangeDifference distance_front(const HalfRange &range) const { - return range.p_beg - p_beg; - } - RangeDifference distance_back(const HalfRange &range) const { - return range.p_end - p_end; - } - - RangeSize size() const { return p_end - p_beg; } - - HalfRange slice(RangeSize start, RangeSize p_end) const { - return HalfRange(p_beg + start, p_beg + p_end); - } - - RangeReference operator[](RangeSize idx) const { - return p_beg[idx]; - } - - void put(const RangeValue &v) { - p_beg.range().put(v); - } - void put(RangeValue &&v) { - p_beg.range().put(octa::move(v)); - } -}; - -template -HalfRange> -make_half_range(const RangeHalf &a, const RangeHalf &b) { - return HalfRange>(a, b); -} - } /* namespace octa */ #endif \ No newline at end of file