From 54232d6ea98a313390ee8f36bbadadce49ff97f3 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 29 Sep 2020 18:11:23 +0200 Subject: [PATCH] Streamline the template specialization of QESDP's dtor Declaring and implementing out of line a specialization for QESDP's destructor is needed if we have an implicitly shared type and we want to provide an inline move constructor for it. The code is however a bit heavy on the eyes, and the full implementation for the destructor must be provided (read: copy and pasted) -- the specialization destructor cannot just "reuse" the one from the primary template. This patch adds a few macros to streamline the above, so that we can start using the same pattern in more places. These macros are completely private for the moment being; we don't want to push this solution for our users. Port QPixmap to the new macros. Change-Id: Ia6a51ad988483e44c9d97c0eca2fb003b6bd21e3 Reviewed-by: Thiago Macieira --- bin/syncqt.pl | 1 + src/corelib/tools/qshareddata.h | 26 ++++++++++++++++++++++++++ src/gui/image/qpixmap.cpp | 5 ++--- src/gui/image/qpixmap.h | 2 +- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/bin/syncqt.pl b/bin/syncqt.pl index 3c8ccf9374d..c22cbfa8d09 100755 --- a/bin/syncqt.pl +++ b/bin/syncqt.pl @@ -233,6 +233,7 @@ sub classNames { $line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE(_[A-Z]+)*[\r\n]*$/); #qt macro $line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro $line .= ";" if($line =~ m/^QT_WARNING_(PUSH|POP|DISABLE_\w+\(.*\))[\r\n]*$/); # qt macros + $line .= ";" if($line =~ m/^QT_DECLARE_QE?SDP_SPECIALIZATION_DTOR(_WITH_EXPORT)?\(.*\)[\r\n]*$/); # qt macros $$requires = $1 if ($line =~ m/^QT_REQUIRE_CONFIG\((.*)\);[\r\n]*$/); $parsable .= " " . $line; } diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h index 71f2e177992..ffd4d4cf0bf 100644 --- a/src/corelib/tools/qshareddata.h +++ b/src/corelib/tools/qshareddata.h @@ -304,6 +304,32 @@ Q_INLINE_TEMPLATE size_t qHash(const QExplicitlySharedDataPointer &ptr, size_ template Q_DECLARE_TYPEINFO_BODY(QSharedDataPointer, Q_MOVABLE_TYPE); template Q_DECLARE_TYPEINFO_BODY(QExplicitlySharedDataPointer, Q_MOVABLE_TYPE); +#define QT_DECLARE_QSDP_SPECIALIZATION_DTOR(Class) \ + template<> QSharedDataPointer::~QSharedDataPointer(); + +#define QT_DECLARE_QSDP_SPECIALIZATION_DTOR_WITH_EXPORT(Class, ExportMacro) \ + template<> ExportMacro QSharedDataPointer::~QSharedDataPointer(); + +#define QT_DEFINE_QSDP_SPECIALIZATION_DTOR(Class) \ + template<> QSharedDataPointer::~QSharedDataPointer() \ + { \ + if (d && !d->ref.deref()) \ + delete d; \ + } + +#define QT_DECLARE_QESDP_SPECIALIZATION_DTOR(Class) \ + template<> QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer(); + +#define QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(Class, ExportMacro) \ + template<> ExportMacro QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer(); + +#define QT_DEFINE_QESDP_SPECIALIZATION_DTOR(Class) \ + template<> QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer() \ + { \ + if (d && !d->ref.deref()) \ + delete d; \ + } + QT_END_NAMESPACE #endif // QSHAREDDATA_H diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp index c3ae8537956..d8473001aad 100644 --- a/src/gui/image/qpixmap.cpp +++ b/src/gui/image/qpixmap.cpp @@ -229,9 +229,8 @@ QPixmap::QPixmap(const QPixmap &pixmap) \sa swap() operator=(QPixmap&&) */ -template<> -QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer() -{ if (d && !d->ref.deref()) delete d; } + +QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QPlatformPixmap) /*! Constructs a pixmap from the given \a xpm data, which must be a diff --git a/src/gui/image/qpixmap.h b/src/gui/image/qpixmap.h index e7315976594..42d4e271026 100644 --- a/src/gui/image/qpixmap.h +++ b/src/gui/image/qpixmap.h @@ -57,7 +57,7 @@ class QImageReader; class QColor; class QVariant; class QPlatformPixmap; -template<> Q_GUI_EXPORT QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer(); +QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QPlatformPixmap, Q_GUI_EXPORT) class Q_GUI_EXPORT QPixmap : public QPaintDevice {