QPermission: fight template bloat in data()
Extract the type-independent code into an out-of-line data_impl() private method, leaving data() containing only the QMetaType::fromType<T>() 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ø <tor.arne.vestbo@qt.io> (cherry picked from commit 66235481043d85e4f51a216cf2ad3bb895ea7842) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
b2f0931359
commit
0c7643bcd5
@ -257,6 +257,22 @@ Q_LOGGING_CATEGORY(lcPermissions, "qt.permissions", QtWarningMsg);
|
|||||||
Returns the type of the permission.
|
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) \
|
#define QT_DEFINE_PERMISSION_SPECIAL_FUNCTIONS(ClassName) \
|
||||||
ClassName::ClassName() : d(new ClassName##Private) {} \
|
ClassName::ClassName() : d(new ClassName##Private) {} \
|
||||||
ClassName::ClassName(const ClassName &other) noexcept = default; \
|
ClassName::ClassName(const ClassName &other) noexcept = default; \
|
||||||
|
@ -61,14 +61,11 @@ public:
|
|||||||
template <typename T, std::enable_if_t<is_permission<T>::value, bool> = true>
|
template <typename T, std::enable_if_t<is_permission<T>::value, bool> = true>
|
||||||
T data() const
|
T data() const
|
||||||
{
|
{
|
||||||
auto requestedType = QMetaType::fromType<T>();
|
if (auto p = data(QMetaType::fromType<T>()))
|
||||||
if (type() != requestedType) {
|
return *static_cast<const T *>(p);
|
||||||
qWarning() << "Can not convert from" << type().name()
|
else
|
||||||
<< "to" << requestedType.name();
|
|
||||||
return T{};
|
return T{};
|
||||||
}
|
}
|
||||||
return m_data.value<T>();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef QT_NO_DEBUG_STREAM
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
@ -76,6 +73,8 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Q_CORE_EXPORT const void *data(QMetaType id) const;
|
||||||
|
|
||||||
Qt::PermissionStatus m_status = Qt::PermissionStatus::Undetermined;
|
Qt::PermissionStatus m_status = Qt::PermissionStatus::Undetermined;
|
||||||
QVariant m_data;
|
QVariant m_data;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user