From 68c4449d2fc9bd18499b885e3a04d0464ba51d6c Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 10 Jul 2020 14:36:58 +0200 Subject: [PATCH] Cleanup v_construct and friends Streamline code using if constexpr and remove some unused code paths. Change-Id: I602acffab4b3e53fab9e2433856f6b7e8210cc60 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qvariant_p.h | 82 ++++----------------------------- 1 file changed, 9 insertions(+), 73 deletions(-) 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();