aboutsummaryrefslogtreecommitdiff
path: root/lib/mxcreply.cpp
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-01-02 06:03:26 +0100
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-01-02 06:09:38 +0100
commit7d37d296f942ac993d041b4576ed52265170c4a8 (patch)
treebf36eca388b7fdc363ef21f4defa8ac9c449141d /lib/mxcreply.cpp
parentd516280a2b38ccb060e4f7502b873e19b1559ed1 (diff)
downloadlibquotient-7d37d296f942ac993d041b4576ed52265170c4a8.tar.gz
libquotient-7d37d296f942ac993d041b4576ed52265170c4a8.zip
Add ImplPtr and makeImpl
The original (more complex and comprehensive) solution belongs to https://oliora.github.io/2015/12/29/pimpl-and-rule-of-zero.html - this commit only provides a small wrapper for non-copyable Private class implementations common throughout libQuotient. Unlike the original, default initialisation is made explicit - you have to pass ZeroImpl<Private>() instead (and I firmly believe it's a good thing: normally pointers to Private should not remain nullptr). The reason ZeroImpl<> is not a template variable is quite simple: unique_ptr is non-copyable and so cannot be initialised from; while a template function will initialise the value in-place thanks to copy elision.
Diffstat (limited to 'lib/mxcreply.cpp')
-rw-r--r--lib/mxcreply.cpp7
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/mxcreply.cpp b/lib/mxcreply.cpp
index fb16c79f..d3cc3c37 100644
--- a/lib/mxcreply.cpp
+++ b/lib/mxcreply.cpp
@@ -17,7 +17,7 @@ public:
};
MxcReply::MxcReply(QNetworkReply* reply)
- : d(std::make_unique<Private>(reply))
+ : d(makeImpl<Private>(reply))
{
reply->setParent(this);
connect(d->m_reply, &QNetworkReply::finished, this, [this]() {
@@ -28,7 +28,7 @@ MxcReply::MxcReply(QNetworkReply* reply)
}
MxcReply::MxcReply(QNetworkReply* reply, Room* room, const QString &eventId)
- : d(std::make_unique<Private>(reply))
+ : d(makeImpl<Private>(reply))
{
reply->setParent(this);
connect(d->m_reply, &QNetworkReply::finished, this, [this, room, eventId]() {
@@ -38,8 +38,6 @@ MxcReply::MxcReply(QNetworkReply* reply, Room* room, const QString &eventId)
});
}
-MxcReply::~MxcReply() = default;
-
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
#define ERROR_SIGNAL errorOccurred
#else
@@ -47,6 +45,7 @@ MxcReply::~MxcReply() = default;
#endif
MxcReply::MxcReply()
+ : d(ZeroImpl<Private>())
{
static const auto BadRequestPhrase = tr("Bad Request");
QMetaObject::invokeMethod(this, [this]() {