From 0c7643bcd5bdb26c8cf11357c4234d35b7ac48ac Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 12 Jan 2023 09:42:34 +0100 Subject: [PATCH] QPermission: fight template bloat in data() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extract the type-independent code into an out-of-line data_impl() private method, leaving data() containing only the QMetaType::fromType() call as well as T copy- and default-constructor calls. As a drive-by, use categorized logging (consistency with the rest of the permissions code) and printf-style qWarning() (expands to less code). Change-Id: Ie23b83cb3fc537c9cff15f853ceee2888bf63124 Reviewed-by: Tor Arne Vestbø (cherry picked from commit 66235481043d85e4f51a216cf2ad3bb895ea7842) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qpermissions.cpp | 16 ++++++++++++++++ src/corelib/kernel/qpermissions.h | 11 +++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qpermissions.cpp b/src/corelib/kernel/qpermissions.cpp index 0f168452491..4d268463474 100644 --- a/src/corelib/kernel/qpermissions.cpp +++ b/src/corelib/kernel/qpermissions.cpp @@ -257,6 +257,22 @@ Q_LOGGING_CATEGORY(lcPermissions, "qt.permissions", QtWarningMsg); Returns the type of the permission. */ +/* + \internal +*/ +const void *QPermission::data(QMetaType requestedType) const +{ + const auto actualType = type(); + if (requestedType != actualType) { + qCWarning(lcPermissions, "Cannot convert from %s to %s", + actualType.name(), requestedType.name()); + return nullptr; + } + return m_data.data(); +} + + + #define QT_DEFINE_PERMISSION_SPECIAL_FUNCTIONS(ClassName) \ ClassName::ClassName() : d(new ClassName##Private) {} \ ClassName::ClassName(const ClassName &other) noexcept = default; \ diff --git a/src/corelib/kernel/qpermissions.h b/src/corelib/kernel/qpermissions.h index 7c1cd3678ec..2a23412a221 100644 --- a/src/corelib/kernel/qpermissions.h +++ b/src/corelib/kernel/qpermissions.h @@ -61,13 +61,10 @@ public: template ::value, bool> = true> T data() const { - auto requestedType = QMetaType::fromType(); - if (type() != requestedType) { - qWarning() << "Can not convert from" << type().name() - << "to" << requestedType.name(); + if (auto p = data(QMetaType::fromType())) + return *static_cast(p); + else return T{}; - } - return m_data.value(); } #endif @@ -76,6 +73,8 @@ public: #endif private: + Q_CORE_EXPORT const void *data(QMetaType id) const; + Qt::PermissionStatus m_status = Qt::PermissionStatus::Undetermined; QVariant m_data;