diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index 833e1c6adb..1094ee6c2b 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -63,34 +63,19 @@ QT_BEGIN_NAMESPACE template struct QVariantIntegrator { - static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data); + static constexpr bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data); typedef std::integral_constant CanUseInternalSpace_t; }; static_assert(QVariantIntegrator::CanUseInternalSpace); static_assert(QVariantIntegrator::CanUseInternalSpace); static_assert(QVariantIntegrator::CanUseInternalSpace); -#ifdef Q_CC_SUN // Sun CC picks the wrong overload, so introduce awful hack - -// takes a type, returns the internal void* pointer cast -// to a pointer of the input type -template -inline T *v_cast(const QVariant::Private *nd, T * = 0) -{ - QVariant::Private *d = const_cast(nd); - return !QVariantIntegrator::CanUseInternalSpace - ? static_cast(d->data.shared->ptr) - : static_cast(static_cast(&d->data.c)); -} - -#else // every other compiler in this world - template inline const T *v_cast(const QVariant::Private *d, T * = nullptr) { return !QVariantIntegrator::CanUseInternalSpace ? static_cast(d->data.shared->data()) - : static_cast(static_cast(&d->data.c)); + : static_cast(static_cast(&d->data)); } template @@ -98,69 +83,20 @@ inline T *v_cast(QVariant::Private *d, T * = nullptr) { return !QVariantIntegrator::CanUseInternalSpace ? static_cast(d->data.shared->data()) - : static_cast(static_cast(&d->data.c)); -} - -#endif - -template -inline void v_construct_helper(QVariant::Private *x, const T &t, std::true_type) -{ - new (&x->data) T(t); - x->is_shared = false; -} - -template -inline void v_construct_helper(QVariant::Private *x, const T &t, std::false_type) -{ - x->data.shared = QVariant::PrivateShared::create(QMetaType::fromType()); - new (x->data.shared->data()) T(t); - x->is_shared = true; -} - -template -inline void v_construct_helper(QVariant::Private *x, std::true_type) -{ - new (&x->data) T(); - x->is_shared = false; -} - -template -inline void v_construct_helper(QVariant::Private *x, std::false_type) -{ - x->data.shared = QVariant::PrivateShared::create(QMetaType::fromType()); - new (x->data.shared->data()) T(); - x->is_shared = true; + : static_cast(static_cast(&d->data)); } template inline void v_construct(QVariant::Private *x, const T &t) { - // dispatch - v_construct_helper(x, t, typename QVariantIntegrator::CanUseInternalSpace_t()); -} - -// constructs a new variant if copy is 0, otherwise copy-constructs -template -inline void v_construct(QVariant::Private *x, const void *copy, T * = nullptr) -{ - if (copy) - v_construct(x, *static_cast(copy)); - else - v_construct_helper(x, typename QVariantIntegrator::CanUseInternalSpace_t()); -} - -// deletes the internal structures -template -inline void v_clear(QVariant::Private *d, T* = nullptr) -{ - - if (!QVariantIntegrator::CanUseInternalSpace) { - delete static_cast(d->data.shared->data()); + if constexpr (QVariantIntegrator::CanUseInternalSpace) { + new (&x->data) T(t); + x->is_shared = false; } else { - v_cast(d)->~T(); + x->data.shared = QVariant::PrivateShared::create(QMetaType::fromType()); + new (x->data.shared->data()) T(t); + x->is_shared = true; } - } Q_CORE_EXPORT const QVariant::Handler *qcoreVariantHandler();