From 6b3707c0dc47d90c48dc41678973e62247d49b22 Mon Sep 17 00:00:00 2001 From: q66 Date: Tue, 14 Feb 2017 17:39:03 +0100 Subject: [PATCH] remove PointerRange, IteratorRange completely replaces it --- ostd/array.hh | 8 +- ostd/initializer_list.hh | 8 +- ostd/range.hh | 225 +++++---------------------------------- ostd/vector.hh | 8 +- 4 files changed, 39 insertions(+), 210 deletions(-) diff --git a/ostd/array.hh b/ostd/array.hh index eb14d0d..f50a17f 100644 --- a/ostd/array.hh +++ b/ostd/array.hh @@ -14,15 +14,15 @@ namespace ostd { template struct ranged_traits> { - static PointerRange iter(std::array &v) { - return PointerRange{v.data(), v.data() + N}; + static IteratorRange iter(std::array &v) { + return IteratorRange{v.data(), v.data() + N}; } }; template struct ranged_traits const> { - static PointerRange iter(std::array const &v) { - return PointerRange{v.data(), v.data() + N}; + static IteratorRange iter(std::array const &v) { + return IteratorRange{v.data(), v.data() + N}; } }; diff --git a/ostd/initializer_list.hh b/ostd/initializer_list.hh index fa0a0dd..bc1a5a4 100644 --- a/ostd/initializer_list.hh +++ b/ostd/initializer_list.hh @@ -13,13 +13,13 @@ namespace ostd { template -PointerRange iter(std::initializer_list init) noexcept { - return PointerRange(init.begin(), init.end()); +IteratorRange iter(std::initializer_list init) noexcept { + return IteratorRange(init.begin(), init.end()); } template -PointerRange citer(std::initializer_list init) noexcept { - return PointerRange(init.begin(), init.end()); +IteratorRange citer(std::initializer_list init) noexcept { + return IteratorRange(init.begin(), init.end()); } } diff --git a/ostd/range.hh b/ostd/range.hh index f6ecc2d..54b1b64 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -1140,201 +1140,6 @@ inline NumberRange range(T v) { return NumberRange(v); } -template -struct PointerRange: InputRange> { - using Category = ContiguousRangeTag; - using Value = T; - using Reference = T &; - using Size = size_t; - using Difference = ptrdiff_t; - -private: - struct Nat {}; - -public: - PointerRange(): p_beg(nullptr), p_end(nullptr) {} - PointerRange(T *beg, T *end): p_beg(beg), p_end(end) {} - - template - >> - PointerRange(PointerRange const &v): p_beg(&v[0]), p_end(&v[v.size()]) {} - - PointerRange &operator=(PointerRange const &v) { - p_beg = v.p_beg; - p_end = v.p_end; - return *this; - } - - /* satisfy InputRange / ForwardRange */ - bool empty() const { return p_beg == p_end; } - - bool pop_front() { - if (p_beg == p_end) { - return false; - } - ++p_beg; - return true; - } - bool push_front() { - --p_beg; return true; - } - - size_t pop_front_n(size_t n) { - size_t olen = p_end - p_beg; - p_beg += n; - if (p_beg > p_end) { - p_beg = p_end; - return olen; - } - return n; - } - - size_t push_front_n(size_t n) { - p_beg -= n; return true; - } - - T &front() const { return *p_beg; } - - bool equals_front(PointerRange const &range) const { - return p_beg == range.p_beg; - } - - ptrdiff_t distance_front(PointerRange const &range) const { - return range.p_beg - p_beg; - } - - /* satisfy BidirectionalRange */ - bool pop_back() { - if (p_end == p_beg) { - return false; - } - --p_end; - return true; - } - bool push_back() { - ++p_end; return true; - } - - size_t pop_back_n(size_t n) { - size_t olen = p_end - p_beg; - p_end -= n; - if (p_end < p_beg) { - p_end = p_beg; - return olen; - } - return n; - } - - size_t push_back_n(size_t n) { - p_end += n; return true; - } - - T &back() const { return *(p_end - 1); } - - bool equals_back(PointerRange const &range) const { - return p_end == range.p_end; - } - - ptrdiff_t distance_back(PointerRange const &range) const { - return range.p_end - p_end; - } - - /* satisfy FiniteRandomAccessRange */ - size_t size() const { return p_end - p_beg; } - - PointerRange slice(size_t start, size_t end) const { - return PointerRange(p_beg + start, p_beg + end); - } - - T &operator[](size_t i) const { return p_beg[i]; } - - /* satisfy OutputRange */ - bool put(T const &v) { - if (empty()) { - return false; - } - *(p_beg++) = v; - return true; - } - bool put(T &&v) { - if (empty()) { - return false; - } - *(p_beg++) = std::move(v); - return true; - } - - template - std::enable_if_t, size_t> copy(R &&orange, size_t n = -1) { - size_t c = size(); - if (n < c) { - c = n; - } - return range_put_n(orange, p_beg, c); - } - - size_t copy(std::remove_cv_t *p, size_t n = -1) { - size_t c = size(); - if (n < c) { - c = n; - } - if constexpr(std::is_pod_v) { - memcpy(p, p_beg, c * sizeof(T)); - return c; - } - return copy(PointerRange(p, p + c), c); - } - - T *data() { return p_beg; } - T const *data() const { return p_beg; } - -private: - T *p_beg, *p_end; -}; - -template -inline size_t range_put_n(PointerRange &range, T const *p, size_t n) { - size_t ret = range.size(); - if (n < ret) { - ret = n; - } - if constexpr(std::is_pod_v) { - memcpy(&range.front(), p, ret * sizeof(T)); - range.pop_front_n(ret); - return ret; - } - for (size_t i = ret; i; --i) { - range.front() = *p++; - range.pop_front(); - } - return ret; -} - -template -struct ranged_traits { - static PointerRange iter(T (&array)[N]) { - return PointerRange(array, array + N); - } -}; - -namespace detail { - struct PtrNat {}; -} - -template -inline PointerRange iter(T *a, U b, std::enable_if_t< - (std::is_pointer_v || std::is_null_pointer_v) && - std::is_convertible_v, detail::PtrNat -> = detail::PtrNat()) { - return PointerRange(a, b); -} - -template -inline PointerRange iter(T *a, size_t b) { - return PointerRange(a, a + b); -} - template struct EnumeratedValue { S index; @@ -1902,14 +1707,14 @@ struct IteratorRange: InputRange> { Reference operator[](Size i) const { return p_beg[i]; } /* satisfy OutputRange */ - bool put(T const &v) { + bool put(Value const &v) { if (empty()) { return false; } *(p_beg++) = v; return true; } - bool put(T &&v) { + bool put(Value &&v) { if (empty()) { return false; } @@ -1964,7 +1769,7 @@ private: }; template -inline RangeSize> range_put_n( +inline auto range_put_n( IteratorRange &range, RangeValue> const *p, RangeSize> n ) { @@ -2002,6 +1807,30 @@ IteratorRange make_range(T beg, size_t n) { return IteratorRange{beg, beg + n}; } +template +struct ranged_traits { + static IteratorRange iter(T (&array)[N]) { + return IteratorRange(array, array + N); + } +}; + +namespace detail { + struct PtrNat {}; +} + +template +inline IteratorRange iter(T *a, U b, std::enable_if_t< + (std::is_pointer_v || std::is_null_pointer_v) && + std::is_convertible_v, detail::PtrNat +> = detail::PtrNat()) { + return IteratorRange(a, b); +} + +template +inline IteratorRange iter(T *a, size_t b) { + return IteratorRange(a, a + b); +} + } /* namespace ostd */ #endif diff --git a/ostd/vector.hh b/ostd/vector.hh index 34cef57..72857cb 100644 --- a/ostd/vector.hh +++ b/ostd/vector.hh @@ -16,15 +16,15 @@ namespace ostd { template struct ranged_traits> { - static PointerRange iter(std::vector &v) { - return PointerRange{v.data(), v.data() + v.size()}; + static IteratorRange iter(std::vector &v) { + return IteratorRange{v.data(), v.data() + v.size()}; } }; template struct ranged_traits const> { - static PointerRange iter(std::vector const &v) { - return PointerRange{v.data(), v.data() + v.size()}; + static IteratorRange iter(std::vector const &v) { + return IteratorRange{v.data(), v.data() + v.size()}; } };