From 05b5de9e3756ca2131bef6af1fb89ad2de921a06 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 5 Nov 2024 19:37:50 -0800 Subject: [PATCH] QMetaType: compute the type's flags in a function instead Makes it easier to read, moves them closer to the other getters and the user, plus it will make it easier to update later when we have more flags. Change-Id: I37a911aed25c38bbd467fffda935862b4dc3004b Reviewed-by: Ivan Solovev --- src/corelib/kernel/qmetatype.h | 63 ++++++++++++------- .../corelib/kernel/qvariant/tst_qvariant.cpp | 2 +- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index e5bb6966130..beac877a1f2 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1275,28 +1275,6 @@ namespace QtPrivate { template constexpr bool IsUnsignedEnum = !std::is_signed_v>; - template - struct QMetaTypeTypeFlags - { - enum { Flags = (QTypeInfo::isRelocatable ? QMetaType::RelocatableType : 0) - | ((!std::is_default_constructible_v || !QTypeInfo::isValueInitializationBitwiseZero) ? QMetaType::NeedsConstruction : 0) - | (!std::is_trivially_destructible_v ? QMetaType::NeedsDestruction : 0) - | (!std::is_trivially_copy_constructible_v ? QMetaType::NeedsCopyConstruction : 0) - | (!std::is_trivially_move_constructible_v ? QMetaType::NeedsMoveConstruction : 0) - | (IsPointerToTypeDerivedFromQObject::Value ? QMetaType::PointerToQObject : 0) - | (IsSharedPointerToTypeDerivedFromQObject::Value ? QMetaType::SharedPointerToQObject : 0) - | (IsWeakPointerToTypeDerivedFromQObject::Value ? QMetaType::WeakPointerToQObject : 0) - | (IsTrackingPointerToTypeDerivedFromQObject::Value ? QMetaType::TrackingPointerToQObject : 0) - | (IsEnumOrFlags::value ? QMetaType::IsEnumeration : 0) - | (IsGadgetHelper::IsGadgetOrDerivedFrom ? QMetaType::IsGadget : 0) - | (IsPointerToGadgetHelper::IsGadgetOrDerivedFrom ? QMetaType::PointerToGadget : 0) - | (std::is_pointer_v ? QMetaType::IsPointer : 0) - | (IsUnsignedEnum ? QMetaType::IsUnsignedEnumeration : 0) - | (IsQmlListType ? QMetaType::IsQmlList : 0) - | (std::is_const_v> ? QMetaType::IsConst : 0) - }; - }; - template struct MetaTypeDefinedHelper { @@ -2427,7 +2405,44 @@ class QMetaTypeForType { public: static constexpr decltype(typenameHelper()) name = typenameHelper(); - static constexpr unsigned Flags = QMetaTypeTypeFlags::Flags; + + static constexpr unsigned flags() + { + uint flags = 0; + if constexpr (QTypeInfo::isRelocatable) + flags |= QMetaType::RelocatableType; + if constexpr (!std::is_default_constructible_v || !QTypeInfo::isValueInitializationBitwiseZero) + flags |= QMetaType::NeedsConstruction; + if constexpr (!std::is_trivially_destructible_v) + flags |= QMetaType::NeedsDestruction; + if constexpr (!std::is_trivially_copy_constructible_v) + flags |= QMetaType::NeedsCopyConstruction; + if constexpr (!std::is_trivially_move_constructible_v) + flags |= QMetaType::NeedsMoveConstruction; + if constexpr (IsPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::PointerToQObject; + if constexpr (IsSharedPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::SharedPointerToQObject; + if constexpr (IsWeakPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::WeakPointerToQObject; + if constexpr (IsTrackingPointerToTypeDerivedFromQObject::Value) + flags |= QMetaType::TrackingPointerToQObject; + if constexpr (IsEnumOrFlags::value) + flags |= QMetaType::IsEnumeration; + if constexpr (IsGadgetHelper::IsGadgetOrDerivedFrom) + flags |= QMetaType::IsGadget; + if constexpr (IsPointerToGadgetHelper::IsGadgetOrDerivedFrom) + flags |= QMetaType::PointerToGadget; + if constexpr (std::is_pointer_v) + flags |= QMetaType::IsPointer; + if constexpr (IsUnsignedEnum) + flags |= QMetaType::IsUnsignedEnumeration; + if constexpr (IsQmlListType) + flags |= QMetaType::IsQmlList; + if constexpr (std::is_const_v>) + flags |= QMetaType::IsConst; + return flags; + } static constexpr QMetaTypeInterface::DefaultCtrFn getDefaultCtr() { @@ -2502,7 +2517,7 @@ struct QMetaTypeInterfaceWrapper /*.revision=*/ QMetaTypeInterface::CurrentRevision, /*.alignment=*/ alignof(T), /*.size=*/ sizeof(T), - /*.flags=*/ QMetaTypeForType::Flags, + /*.flags=*/ QMetaTypeForType::flags(), /*.typeId=*/ BuiltinMetaType::value, /*.metaObjectFn=*/ MetaObjectForType::metaObjectFunction, /*.name=*/ QMetaTypeForType::getName(), diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index a510a0a680c..a36f5c6fc80 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -5874,7 +5874,7 @@ void tst_QVariant::equalsWithoutMetaObject() /*.revision=*/ 0, /*.alignment=*/ alignof(T), /*.size=*/ sizeof(T), - /*.flags=*/ QtPrivate::QMetaTypeTypeFlags::Flags, + /*.flags=*/ QtPrivate::QMetaTypeForType::flags(), /*.typeId=*/ 0, /*.metaObject=*/ nullptr, // on purpose. /*.name=*/ "NoMetaObject*",