Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++ #include "qobjectcleanuphandler.h"
++
++ QT_BEGIN_NAMESPACE
++
++ /*!
++ \class QObjectCleanupHandler
++ \inmodule QtCore
++ \brief The QObjectCleanupHandler class watches the lifetime of multiple QObjects.
++
++ \ingroup objectmodel
++
++ A QObjectCleanupHandler is useful whenever you need to know when a
++ number of \l{QObject}s that are owned by someone else have been
++ deleted. This is important, for example, when referencing memory
++ in an application that has been allocated in a shared library.
++
++ To keep track of some \l{QObject}s, create a
++ QObjectCleanupHandler, and add() the objects you are interested
++ in. If you are no longer interested in tracking a particular
++ object, use remove() to remove it from the cleanup handler. If an
++ object being tracked by the cleanup handler gets deleted by
++ someone else it will automatically be removed from the cleanup
++ handler. You can delete all the objects in the cleanup handler
++ with clear(), or by destroying the cleanup handler. isEmpty()
++ returns \c true if the QObjectCleanupHandler has no objects to keep
++ track of.
++
++ \sa QPointer
++ */
++
++ /*!
++ Constructs an empty QObjectCleanupHandler.
++ */
++ QObjectCleanupHandler::QObjectCleanupHandler()
++ {
++ }
++
++ /*!
++ Destroys the cleanup handler. All objects in this cleanup handler
++ will be deleted.
++
++ \sa clear()
++ */
++ QObjectCleanupHandler::~QObjectCleanupHandler()
++ {
++ clear();
++ }
++
++ /*!
++ Adds \a object to this cleanup handler and returns the pointer to
++ the object.
++
++ \sa remove()
++ */
++ QObject *QObjectCleanupHandler::add(QObject *object)
++ {
++ if (!object)
++ return nullptr;
++
++ connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
++ cleanupObjects.insert(0, object);
++ return object;
++ }
++
++ /*!
++ Removes the \a object from this cleanup handler. The object will
++ not be destroyed.
++
++ \sa add()
++ */
++ void QObjectCleanupHandler::remove(QObject *object)
++ {
++ qsizetype index;
++ if ((index = cleanupObjects.indexOf(object)) != -1) {
++ cleanupObjects.removeAt(index);
++ disconnect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
++ }
++ }
++
++ /*!
++ Returns \c true if this cleanup handler is empty or if all objects in
++ this cleanup handler have been destroyed; otherwise return false.
++
++ \sa add(), remove(), clear()
++ */
++ bool QObjectCleanupHandler::isEmpty() const
++ {
++ return cleanupObjects.isEmpty();
++ }
++
++ /*!
++ Deletes all objects in this cleanup handler. The cleanup handler
++ becomes empty.
++
++ \sa isEmpty()
++ */
++ void QObjectCleanupHandler::clear()
++ {
++ while (!cleanupObjects.isEmpty())
++ delete cleanupObjects.takeFirst();
++ }
++
++ void QObjectCleanupHandler::objectDestroyed(QObject *object)
++ {
++ remove(object);
++ }
++
++ QT_END_NAMESPACE
++
++ #include "moc_qobjectcleanuphandler.cpp"