File indexing completed on 2024-05-05 04:38:46

0001 /*
0002     SPDX-FileCopyrightText: 2014 Kevin Funk <kfunk@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "objectlist.h"
0008 
0009 using namespace KDevelop;
0010 
0011 class KDevelop::ObjectListTrackerPrivate
0012 {
0013 public:
0014     /// List of tracked objects (contains unique items only)
0015     QList<QObject*> m_list;
0016     ObjectListTracker::CleanupBehavior m_cleanupBehavior;
0017 };
0018 
0019 ObjectListTracker::ObjectListTracker(CleanupBehavior behavior, QObject* parent)
0020     : QObject(parent)
0021     , d_ptr(new ObjectListTrackerPrivate {{}, behavior})
0022 {
0023 }
0024 
0025 ObjectListTracker::~ObjectListTracker()
0026 {
0027     Q_D(ObjectListTracker);
0028 
0029     if (d->m_cleanupBehavior == CleanupWhenDone) {
0030         deleteAll();
0031     }
0032 }
0033 
0034 const QList<QObject*>& ObjectListTracker::data() const
0035 {
0036     Q_D(const ObjectListTracker);
0037 
0038     return d->m_list;
0039 }
0040 
0041 void ObjectListTracker::objectDestroyed(QObject* object)
0042 {
0043     Q_D(ObjectListTracker);
0044 
0045     bool success = d->m_list.removeOne(object);
0046     Q_ASSERT(success);
0047     Q_UNUSED(success);
0048 }
0049 
0050 void ObjectListTracker::append(QObject* object)
0051 {
0052     Q_D(ObjectListTracker);
0053 
0054     if (!object || d->m_list.contains(object)) {
0055         return;
0056     }
0057 
0058     d->m_list.append(object);
0059     connect(object, &QObject::destroyed, this, &ObjectListTracker::objectDestroyed);
0060 }
0061 
0062 bool ObjectListTracker::remove(QObject* object)
0063 {
0064     Q_D(ObjectListTracker);
0065 
0066     if (!object) {
0067         return false;
0068     }
0069 
0070     disconnect(object, &QObject::destroyed, this, &ObjectListTracker::objectDestroyed);
0071     return d->m_list.removeOne(object);
0072 }
0073 
0074 void ObjectListTracker::deleteAll()
0075 {
0076     Q_D(ObjectListTracker);
0077 
0078     qDeleteAll(d->m_list);
0079     d->m_list.clear();
0080 }
0081 
0082 #include "moc_objectlist.cpp"