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:
Marc Mutz 2023-07-21 12:32:53 +02:00
parent 5bb4020cbe
commit a9982a3b63
2 changed files with 8 additions and 8 deletions

View File

@ -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; }

View File

@ -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);