forked from OctaForge/libostd
use friends to handle copy constructors correctly
parent
ddb18b9d0d
commit
a4d33c5cd7
|
@ -42,6 +42,9 @@ namespace detail {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct HashRange: octa::InputRange<HashRange<T>, octa::ForwardRangeTag, T> {
|
struct HashRange: octa::InputRange<HashRange<T>, octa::ForwardRangeTag, T> {
|
||||||
private:
|
private:
|
||||||
|
template<typename U>
|
||||||
|
friend struct HashRange;
|
||||||
|
|
||||||
using Chain = octa::detail::HashChain<T>;
|
using Chain = octa::detail::HashChain<T>;
|
||||||
|
|
||||||
Chain **p_beg;
|
Chain **p_beg;
|
||||||
|
@ -70,8 +73,8 @@ public:
|
||||||
HashRange(const HashRange<U> &v, octa::EnableIf<
|
HashRange(const HashRange<U> &v, octa::EnableIf<
|
||||||
octa::IsSame<RemoveCv<T>, RemoveCv<U>>::value &&
|
octa::IsSame<RemoveCv<T>, RemoveCv<U>>::value &&
|
||||||
octa::IsConvertible<U *, T *>::value, bool
|
octa::IsConvertible<U *, T *>::value, bool
|
||||||
> = true): p_beg(*((Chain ***)&v)), p_end(*(((Chain ***)&v) + 1)),
|
> = true): p_beg((Chain **)v.p_beg), p_end((Chain **)v.p_end),
|
||||||
p_node(*(((Chain **)&v) + 2)) {}
|
p_node((Chain *)v.p_node) {}
|
||||||
|
|
||||||
HashRange &operator=(const HashRange &v) {
|
HashRange &operator=(const HashRange &v) {
|
||||||
p_beg = v.p_beg;
|
p_beg = v.p_beg;
|
||||||
|
@ -100,6 +103,9 @@ public:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct BucketRange: octa::InputRange<BucketRange<T>, octa::ForwardRangeTag, T> {
|
struct BucketRange: octa::InputRange<BucketRange<T>, octa::ForwardRangeTag, T> {
|
||||||
private:
|
private:
|
||||||
|
template<typename U>
|
||||||
|
friend struct BucketRange;
|
||||||
|
|
||||||
using Chain = octa::detail::HashChain<T>;
|
using Chain = octa::detail::HashChain<T>;
|
||||||
Chain *p_node;
|
Chain *p_node;
|
||||||
public:
|
public:
|
||||||
|
@ -111,7 +117,7 @@ public:
|
||||||
BucketRange(const BucketRange<U> &v, octa::EnableIf<
|
BucketRange(const BucketRange<U> &v, octa::EnableIf<
|
||||||
octa::IsSame<RemoveCv<T>, RemoveCv<U>>::value &&
|
octa::IsSame<RemoveCv<T>, RemoveCv<U>>::value &&
|
||||||
octa::IsConvertible<U *, T *>::value, bool
|
octa::IsConvertible<U *, T *>::value, bool
|
||||||
> = true): p_node(*((Chain **)&v)) {}
|
> = true): p_node((Chain *)v.p_node) {}
|
||||||
|
|
||||||
BucketRange &operator=(const BucketRange &v) {
|
BucketRange &operator=(const BucketRange &v) {
|
||||||
p_node = v.p_node;
|
p_node = v.p_node;
|
||||||
|
|
Loading…
Reference in New Issue