From a4d33c5cd78ab13a47be8201203c50f6b0a9caab Mon Sep 17 00:00:00 2001 From: q66 Date: Thu, 25 Jun 2015 01:16:19 +0100 Subject: [PATCH] use friends to handle copy constructors correctly --- octa/internal/hashtable.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/octa/internal/hashtable.h b/octa/internal/hashtable.h index 652deec..e9af01b 100644 --- a/octa/internal/hashtable.h +++ b/octa/internal/hashtable.h @@ -42,6 +42,9 @@ namespace detail { template struct HashRange: octa::InputRange, octa::ForwardRangeTag, T> { private: + template + friend struct HashRange; + using Chain = octa::detail::HashChain; Chain **p_beg; @@ -70,8 +73,8 @@ public: HashRange(const HashRange &v, octa::EnableIf< octa::IsSame, RemoveCv>::value && octa::IsConvertible::value, bool - > = true): p_beg(*((Chain ***)&v)), p_end(*(((Chain ***)&v) + 1)), - p_node(*(((Chain **)&v) + 2)) {} + > = true): p_beg((Chain **)v.p_beg), p_end((Chain **)v.p_end), + p_node((Chain *)v.p_node) {} HashRange &operator=(const HashRange &v) { p_beg = v.p_beg; @@ -100,6 +103,9 @@ public: template struct BucketRange: octa::InputRange, octa::ForwardRangeTag, T> { private: + template + friend struct BucketRange; + using Chain = octa::detail::HashChain; Chain *p_node; public: @@ -111,7 +117,7 @@ public: BucketRange(const BucketRange &v, octa::EnableIf< octa::IsSame, RemoveCv>::value && octa::IsConvertible::value, bool - > = true): p_node(*((Chain **)&v)) {} + > = true): p_node((Chain *)v.p_node) {} BucketRange &operator=(const BucketRange &v) { p_node = v.p_node;