From aa2a0afcc1b36f605ebd51467f936414d1985c68 Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 15 Jun 2015 22:10:44 +0100 Subject: [PATCH] add BucketRange instead of abusing HashRange --- octa/internal/hashtable.h | 40 ++++++++++++++++++++++++++++++++++----- octa/map.h | 4 ++-- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/octa/internal/hashtable.h b/octa/internal/hashtable.h index 31db7cd..27184bf 100644 --- a/octa/internal/hashtable.h +++ b/octa/internal/hashtable.h @@ -82,6 +82,36 @@ public: T &front() const { return p_node->value; } }; +template +struct BucketRange: octa::InputRange, octa::ForwardRangeTag, T> { +private: + using Chain = octa::detail::HashChain; + Chain *p_node; +public: + BucketRange(): p_node() {} + BucketRange(Chain *node): p_node(node) {} + BucketRange(const BucketRange &v): p_node(v.p_node) {} + + BucketRange &operator=(const BucketRange &v) { + p_node = v.p_node; + return *this; + } + + bool empty() const { return !p_node; } + + bool pop_front() { + if (!p_node) return false; + p_node = p_node->next; + return true; + } + + bool equals_front(const BucketRange &v) const { + return p_node == v.p_node; + } + + T &front() const { return p_node->value; } +}; + namespace detail { template< typename B, /* contains methods specific to each ht type */ @@ -117,8 +147,8 @@ namespace detail { using Range = octa::HashRange; using ConstRange = octa::HashRange; - using LocalRange = Range; - using ConstLocalRange = ConstRange; + using LocalRange = octa::BucketRange; + using ConstLocalRange = octa::BucketRange; DataPair p_data; @@ -321,15 +351,15 @@ namespace detail { LocalRange each(octa::Size n) { if (n >= p_size) return LocalRange(); - return LocalRange(nullptr, p_data.first()[n], 0); + return LocalRange(p_data.first()[n]); } ConstLocalRange each(octa::Size n) const { if (n >= p_size) return ConstLocalRange(); - return ConstLocalRange(nullptr, p_data.first()[n], 0); + return ConstLocalRange(p_data.first()[n]); } ConstLocalRange ceach(octa::Size n) const { if (n >= p_size) return ConstLocalRange(); - return ConstLocalRange(nullptr, p_data.first()[n], 0); + return ConstLocalRange(p_data.first()[n]); } void swap(Hashtable &h) { diff --git a/octa/map.h b/octa/map.h index f3417ab..1f7e672 100644 --- a/octa/map.h +++ b/octa/map.h @@ -63,8 +63,8 @@ public: using ConstPointer = octa::AllocatorConstPointer; using Range = octa::HashRange>; using ConstRange = octa::HashRange>; - using LocalRange = Range; - using ConstLocalRange = ConstRange; + using LocalRange = octa::BucketRange>; + using ConstLocalRange = octa::BucketRange>; using Allocator = A; explicit Map(octa::Size size, const H &hf = H(),