Add copy(SlotObjUniquePtr), use it in QHostInfoResult & SlotObjSharedPtr
It's a free function, because a) it rhymes with move(ptr) and, of course, SlotObjUniquePtr being a std::unique_ptr, b) we can't add member functions to it (and no, inheriting from a type whose dtor is neither protected nor virtual is nothing you will catch yours truly doing). Pick-to: 6.6 6.5 Change-Id: I2026126857a7bba204d683bad118e8a2c5cb2924 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
This commit is contained in:
parent
5bb4020cbe
commit
a9982a3b63
@ -452,6 +452,12 @@ namespace QtPrivate {
|
||||
|
||||
using SlotObjUniquePtr = std::unique_ptr<QSlotObjectBase,
|
||||
QSlotObjectBase::Deleter>;
|
||||
inline SlotObjUniquePtr copy(const SlotObjUniquePtr &other) noexcept
|
||||
{
|
||||
if (other)
|
||||
other->ref();
|
||||
return SlotObjUniquePtr{other.get()};
|
||||
}
|
||||
|
||||
class SlotObjSharedPtr {
|
||||
SlotObjUniquePtr obj;
|
||||
@ -465,11 +471,7 @@ namespace QtPrivate {
|
||||
// (that's why (QSlotObjectBase*) ctor doesn't exisit: don't know whether that one _should_)
|
||||
}
|
||||
Q_NODISCARD_CTOR SlotObjSharedPtr(const SlotObjSharedPtr &other) noexcept
|
||||
: obj(other.obj.get())
|
||||
{
|
||||
if (obj)
|
||||
obj->ref();
|
||||
}
|
||||
: obj{copy(other.obj)} {}
|
||||
SlotObjSharedPtr &operator=(const SlotObjSharedPtr &other) noexcept
|
||||
{ auto copy = other; swap(copy); return *this; }
|
||||
|
||||
|
@ -61,11 +61,9 @@ protected:
|
||||
|
||||
private:
|
||||
QHostInfoResult(const QHostInfoResult *other)
|
||||
: receiver(other->receiver), slotObj(other->slotObj.get()), // ugly, but copy the pointer...
|
||||
: receiver(other->receiver), slotObj{copy(other->slotObj)},
|
||||
withContextObject(other->withContextObject)
|
||||
{
|
||||
if (slotObj)
|
||||
slotObj->ref(); // ... and ref it here
|
||||
// cleanup if the application terminates before results are delivered
|
||||
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit,
|
||||
this, &QObject::deleteLater);
|
||||
|
Loading…
Reference in New Issue
Block a user