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
Marc Mutz 2012-03-06 08:33:32 +01:00 committed by Qt by Nokia
parent 9848c8b92c
commit e5ef496b5b
1 changed files with 12 additions and 8 deletions

View File

@ -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
{