18#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qhashfunctions.h>
27 enum : size_t {
Value = Q_ALIGNOF(T) };
31 enum : size_t {
Value = ~size_t(0) };
36
38
39
40
41
42
43
44
45template<
typename T,
typename T2>
55 void swap(
QBiPointer &other)
noexcept { std::swap(ptr_value, other.ptr_value); }
84 return !(ptr1 == ptr2);
94 return qHash(ptr
.isNull() ? quintptr(0) : ptr.ptr_value, seed);
98 quintptr ptr_value = 0;
100 static const quintptr FlagBit = 0x1;
101 static const quintptr Flag2Bit = 0x2;
102 static const quintptr FlagsMask = FlagBit | Flag2Bit;
105template <
typename...Ts>
108template<
typename T,
typename T2>
110: ptr_value(quintptr(v))
113 "Type T does not have sufficient alignment");
114 Q_ASSERT((quintptr(v) & FlagsMask) == 0);
117template<
typename T,
typename T2>
119: ptr_value(quintptr(v) | Flag2Bit)
122 "Type T2 does not have sufficient alignment");
123 Q_ASSERT((quintptr(v) & FlagsMask) == 0);
126template<
typename T,
typename T2>
129 return 0 == (ptr_value & (~FlagsMask));
132template<
typename T,
typename T2>
135 return !(ptr_value & Flag2Bit);
138template<
typename T,
typename T2>
141 return ptr_value & Flag2Bit;
144template<
typename T,
typename T2>
147 return ptr_value & FlagBit;
150template<
typename T,
typename T2>
153 ptr_value |= FlagBit;
156template<
typename T,
typename T2>
159 ptr_value &= ~FlagBit;
162template<
typename T,
typename T2>
169template<
typename T,
typename T2>
172 Q_ASSERT((quintptr(o) & FlagsMask) == 0);
174 ptr_value = quintptr(o) | (ptr_value & FlagBit);
178template<
typename T,
typename T2>
181 Q_ASSERT((quintptr(o) & FlagsMask) == 0);
183 ptr_value = quintptr(o) | (ptr_value & FlagBit) | Flag2Bit;
187template<
typename T,
typename T2>
191 return (T *)(ptr_value & ~FlagsMask);
194template<
typename T,
typename T2>
198 return (T2 *)(ptr_value & ~FlagsMask);
friend bool operator!=(QBiPointer< T, T2 > ptr1, QBiPointer< T, T2 > ptr2)
~QBiPointer() noexcept=default
QBiPointer< T, T2 > & operator=(T *)
QBiPointer< T, T2 > & operator=(QBiPointer< T, T2 > &&o) noexcept=default
friend bool operator==(QBiPointer< T, T2 > ptr1, QBiPointer< T, T2 > ptr2)
QBiPointer< T, T2 > & operator=(T2 *)
void swap(QBiPointer &other) noexcept
friend void swap(QBiPointer &lhs, QBiPointer &rhs) noexcept
friend size_t qHash(const QBiPointer< T, T2 > &ptr, size_t seed=0)
QBiPointer< T, T2 > & operator=(const QBiPointer< T, T2 > &o) noexcept=default
Q_DECLARE_TYPEINFO_BODY(QBiPointer< Ts... >, Q_PRIMITIVE_TYPE)