tst_qsharedpointer: don't inherit from QSharedPointer
QSharedPointer is about to be made final. Instead of inheriting from it to gain access to the d-pointer, cast it to a layout-compatible struct and access the pointer from there. Assert liberally to ensure layout compatibility. Change-Id: Ifc0fa6a6608e861469286673844325663f4f7fcc Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
9848c8b92c
commit
e5ef496b5b
|
|
@ -114,15 +114,19 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
template <typename Base>
|
||||
class RefCountHack: public Base
|
||||
template<typename T> static inline
|
||||
QtSharedPointer::ExternalRefCountData *refCountData(const QtSharedPointer::ExternalRefCount<T> &b)
|
||||
{
|
||||
public:
|
||||
using Base::d;
|
||||
};
|
||||
template<typename Base> static inline
|
||||
QtSharedPointer::ExternalRefCountData *refCountData(const Base &b)
|
||||
{ return static_cast<const RefCountHack<Base> *>(&b)->d; }
|
||||
// access d-pointer:
|
||||
struct Dummy {
|
||||
void* value;
|
||||
QtSharedPointer::ExternalRefCountData* data;
|
||||
};
|
||||
// sanity checks:
|
||||
Q_STATIC_ASSERT(sizeof(QtSharedPointer::ExternalRefCount<T>) == sizeof(Dummy));
|
||||
Q_ASSERT(static_cast<const Dummy*>(static_cast<const void*>(&b))->value == b.data());
|
||||
return static_cast<const Dummy*>(static_cast<const void*>(&b))->data;
|
||||
}
|
||||
|
||||
class Data
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue