19#include <QtCore/private/qglobal_p.h>
21#include <QtCore/qhashfunctions.h>
28 enum : size_t {
Value = Q_ALIGNOF(T) };
32 enum : size_t {
Value = ~size_t(0) };
37
39
40
41
42
43
44
45
46template<
typename T,
typename T2>
56 void swap(
QBiPointer &other)
noexcept { std::swap(ptr_value, other.ptr_value); }
85 return !(ptr1 == ptr2);
95 return qHash(ptr
.isNull() ? quintptr(0) : ptr.ptr_value, seed);
99 quintptr ptr_value = 0;
101 static const quintptr FlagBit = 0x1;
102 static const quintptr Flag2Bit = 0x2;
103 static const quintptr FlagsMask = FlagBit | Flag2Bit;
106template <
typename...Ts>
109template<
typename T,
typename T2>
111: ptr_value(quintptr(v))
114 "Type T does not have sufficient alignment");
115 Q_ASSERT((quintptr(v) & FlagsMask) == 0);
118template<
typename T,
typename T2>
120: ptr_value(quintptr(v) | Flag2Bit)
123 "Type T2 does not have sufficient alignment");
124 Q_ASSERT((quintptr(v) & FlagsMask) == 0);
127template<
typename T,
typename T2>
130 return 0 == (ptr_value & (~FlagsMask));
133template<
typename T,
typename T2>
136 return !(ptr_value & Flag2Bit);
139template<
typename T,
typename T2>
142 return ptr_value & Flag2Bit;
145template<
typename T,
typename T2>
148 return ptr_value & FlagBit;
151template<
typename T,
typename T2>
154 ptr_value |= FlagBit;
157template<
typename T,
typename T2>
160 ptr_value &= ~FlagBit;
163template<
typename T,
typename T2>
170template<
typename T,
typename T2>
173 Q_ASSERT((quintptr(o) & FlagsMask) == 0);
175 ptr_value = quintptr(o) | (ptr_value & FlagBit);
179template<
typename T,
typename T2>
182 Q_ASSERT((quintptr(o) & FlagsMask) == 0);
184 ptr_value = quintptr(o) | (ptr_value & FlagBit) | Flag2Bit;
188template<
typename T,
typename T2>
192 return (T *)(ptr_value & ~FlagsMask);
195template<
typename T,
typename T2>
199 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)