Make QMetaTypeInterface POD.
QMetaTypeInterface has to be POD because it is constructed in a static array. Constructors in POD types are not allowed so we will use a macro instead. Change-Id: Iab9ae776dfe4dcd7148558f02d6181c5917aa5c3 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
e75e4421cd
commit
31d8ecfe3b
@ -297,6 +297,14 @@ public:
|
|||||||
int alias;
|
int alias;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
union CheckThatItIsPod
|
||||||
|
{ // This should break if QMetaTypeInterface is not a POD type
|
||||||
|
QMetaTypeInterface iface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
Q_DECLARE_TYPEINFO(QCustomTypeInfo, Q_MOVABLE_TYPE);
|
Q_DECLARE_TYPEINFO(QCustomTypeInfo, Q_MOVABLE_TYPE);
|
||||||
Q_GLOBAL_STATIC(QVector<QCustomTypeInfo>, customTypes)
|
Q_GLOBAL_STATIC(QVector<QCustomTypeInfo>, customTypes)
|
||||||
Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock)
|
Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock)
|
||||||
@ -454,6 +462,10 @@ int QMetaType::registerType(const char *typeName, Deleter deleter,
|
|||||||
inf.typeName = normalizedTypeName;
|
inf.typeName = normalizedTypeName;
|
||||||
inf.creator = creator;
|
inf.creator = creator;
|
||||||
inf.deleter = deleter;
|
inf.deleter = deleter;
|
||||||
|
#ifndef QT_NO_DATASTREAM
|
||||||
|
inf.loadOp = 0;
|
||||||
|
inf.saveOp = 0;
|
||||||
|
#endif
|
||||||
inf.alias = -1;
|
inf.alias = -1;
|
||||||
inf.constructor = constructor;
|
inf.constructor = constructor;
|
||||||
inf.destructor = destructor;
|
inf.destructor = destructor;
|
||||||
|
@ -113,7 +113,7 @@ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER)
|
|||||||
|
|
||||||
class QMetaTypeInterface
|
class QMetaTypeInterface
|
||||||
{
|
{
|
||||||
private:
|
public:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct Impl {
|
struct Impl {
|
||||||
static void *creator(const T *t)
|
static void *creator(const T *t)
|
||||||
@ -140,31 +140,6 @@ private:
|
|||||||
return new (where) T;
|
return new (where) T;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
public:
|
|
||||||
template<typename T>
|
|
||||||
explicit QMetaTypeInterface(T *)
|
|
||||||
: creator(reinterpret_cast<QMetaType::Creator>(Impl<T>::creator))
|
|
||||||
, deleter(reinterpret_cast<QMetaType::Deleter>(Impl<T>::deleter))
|
|
||||||
#ifndef QT_NO_DATASTREAM
|
|
||||||
, saveOp(reinterpret_cast<QMetaType::SaveOperator>(Impl<T>::saver))
|
|
||||||
, loadOp(reinterpret_cast<QMetaType::LoadOperator>(Impl<T>::loader))
|
|
||||||
#endif
|
|
||||||
, constructor(reinterpret_cast<QMetaType::Constructor>(Impl<T>::constructor))
|
|
||||||
, destructor(reinterpret_cast<QMetaType::Destructor>(Impl<T>::destructor))
|
|
||||||
, size(sizeof(T))
|
|
||||||
{}
|
|
||||||
|
|
||||||
QMetaTypeInterface()
|
|
||||||
: creator(0)
|
|
||||||
, deleter(0)
|
|
||||||
#ifndef QT_NO_DATASTREAM
|
|
||||||
, saveOp(0)
|
|
||||||
, loadOp(0)
|
|
||||||
#endif
|
|
||||||
, constructor(0)
|
|
||||||
, destructor(0)
|
|
||||||
, size(0)
|
|
||||||
{}
|
|
||||||
|
|
||||||
QMetaType::Creator creator;
|
QMetaType::Creator creator;
|
||||||
QMetaType::Deleter deleter;
|
QMetaType::Deleter deleter;
|
||||||
@ -177,6 +152,24 @@ public:
|
|||||||
int size;
|
int size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef QT_NO_DATASTREAM
|
||||||
|
# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
|
||||||
|
/*saveOp*/(reinterpret_cast<QMetaType::SaveOperator>(QMetaTypeInterface::Impl<Type>::saver)), \
|
||||||
|
/*loadOp*/(reinterpret_cast<QMetaType::LoadOperator>(QMetaTypeInterface::Impl<Type>::loader)),
|
||||||
|
#else
|
||||||
|
# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define QT_METATYPE_INTERFACE_INIT(Type) \
|
||||||
|
{ \
|
||||||
|
/*creator*/(reinterpret_cast<QMetaType::Creator>(QMetaTypeInterface::Impl<Type>::creator)), \
|
||||||
|
/*deleter*/(reinterpret_cast<QMetaType::Deleter>(QMetaTypeInterface::Impl<Type>::deleter)), \
|
||||||
|
QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
|
||||||
|
/*constructor*/(reinterpret_cast<QMetaType::Constructor>(QMetaTypeInterface::Impl<Type>::constructor)), \
|
||||||
|
/*destructor*/(reinterpret_cast<QMetaType::Destructor>(QMetaTypeInterface::Impl<Type>::destructor)), \
|
||||||
|
/*size*/(sizeof(Type)) \
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QMETATYPE_P_H
|
#endif // QMETATYPE_P_H
|
||||||
|
@ -477,7 +477,7 @@ const QVariant::Handler qt_gui_variant_handler = {
|
|||||||
extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper;
|
extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper;
|
||||||
|
|
||||||
#define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \
|
#define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \
|
||||||
QMetaTypeInterface(static_cast<RealName*>(0)),
|
QT_METATYPE_INTERFACE_INIT(RealName),
|
||||||
|
|
||||||
static const QMetaTypeInterface qVariantGuiHelper[] = {
|
static const QMetaTypeInterface qVariantGuiHelper[] = {
|
||||||
QT_FOR_EACH_STATIC_GUI_CLASS(QT_IMPL_METATYPEINTERFACE_GUI_TYPES)
|
QT_FOR_EACH_STATIC_GUI_CLASS(QT_IMPL_METATYPEINTERFACE_GUI_TYPES)
|
||||||
|
@ -141,7 +141,7 @@ static const QVariant::Handler widgets_handler = {
|
|||||||
extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper;
|
extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper;
|
||||||
|
|
||||||
#define QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES(MetaTypeName, MetaTypeId, RealName) \
|
#define QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES(MetaTypeName, MetaTypeId, RealName) \
|
||||||
QMetaTypeInterface(static_cast<RealName*>(0)),
|
QT_METATYPE_INTERFACE_INIT(RealName),
|
||||||
|
|
||||||
static const QMetaTypeInterface qVariantWidgetsHelper[] = {
|
static const QMetaTypeInterface qVariantWidgetsHelper[] = {
|
||||||
QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES)
|
QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES)
|
||||||
|
Loading…
Reference in New Issue
Block a user