PluginManager: Introduce a getObjects() function taking a predicate

Change-Id: I8a822d76a3dc358de48e96801e4e531f3bbb8669
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
This commit is contained in:
Daniel Teske
2014-05-06 18:33:10 +02:00
parent 248964789a
commit ce1a691abe
3 changed files with 69 additions and 1 deletions

View File

@@ -220,7 +220,21 @@ enum { debugLeaks = 0 };
This function uses \c qobject_cast to determine the type of an object. This function uses \c qobject_cast to determine the type of an object.
If there are more than one object of the given type in If there are more than one object of the given type in
the object pool, this function will choose an arbitrary one of them. the object pool, this function will arbitrarily choose one of them.
\sa addObject()
*/
/*!
\fn T *PluginManager::getObject(Predicate predicate)
Retrieves the object of a given type from the object pool that matches
the \a predicate.
This function uses \c qobject_cast to determine the type of an object.
The predicate must be a function taking T * and returning a bool.
If there is more than one object matching the type and predicate,
this function will arbitrarily choose one of them.
\sa addObject() \sa addObject()
*/ */
@@ -235,6 +249,20 @@ enum { debugLeaks = 0 };
\sa addObject() \sa addObject()
*/ */
/*!
\fn QList<T *> PluginManager::getObjects(Predicate predicate)
Retrieves all objects of a given type from the object pool that
match the \a predicate.
This function uses \c qobject_cast to determine the type of an object.
The predicate should be a unary function taking a T* parameter and
returning a bool.
\sa addObject()
*/
using namespace ExtensionSystem; using namespace ExtensionSystem;
using namespace ExtensionSystem::Internal; using namespace ExtensionSystem::Internal;

View File

@@ -75,6 +75,19 @@ public:
} }
return results; return results;
} }
template <typename T, typename Predicate>
static QList<T *> getObjects(Predicate predicate)
{
QReadLocker lock(listLock());
QList<T *> results;
QList<QObject *> all = allObjects();
foreach (QObject *obj, all) {
T *result = qobject_cast<T *>(obj);
if (result && predicate(result))
results += result;
}
return results;
}
template <typename T> static T *getObject() template <typename T> static T *getObject()
{ {
QReadLocker lock(listLock()); QReadLocker lock(listLock());
@@ -85,6 +98,17 @@ public:
} }
return 0; return 0;
} }
template <typename T, typename Predicate> static T *getObject(Predicate predicate)
{
QReadLocker lock(listLock());
QList<QObject *> all = allObjects();
foreach (QObject *obj, all) {
if (T *result = qobject_cast<T *>(obj))
if (predicate(result))
return result;
}
return 0;
}
static QObject *getObjectByName(const QString &name); static QObject *getObjectByName(const QString &name);
static QObject *getObjectByClassName(const QString &className); static QObject *getObjectByClassName(const QString &className);

View File

@@ -138,6 +138,9 @@ void tst_PluginManager::getObject()
{ {
MyClass2 *object2 = new MyClass2; MyClass2 *object2 = new MyClass2;
MyClass11 *object11 = new MyClass11; MyClass11 *object11 = new MyClass11;
MyClass2 *object2b = new MyClass2;
const QString objectName = QLatin1String("OBJECTNAME");
object2b->setObjectName(objectName);
m_pm->addObject(object2); m_pm->addObject(object2);
QCOMPARE(m_pm->getObject<MyClass11>(), (MyClass11*)0); QCOMPARE(m_pm->getObject<MyClass11>(), (MyClass11*)0);
QCOMPARE(m_pm->getObject<MyClass1>(), (MyClass1*)0); QCOMPARE(m_pm->getObject<MyClass1>(), (MyClass1*)0);
@@ -146,10 +149,17 @@ void tst_PluginManager::getObject()
QCOMPARE(m_pm->getObject<MyClass11>(), object11); QCOMPARE(m_pm->getObject<MyClass11>(), object11);
QCOMPARE(m_pm->getObject<MyClass1>(), qobject_cast<MyClass1*>(object11)); QCOMPARE(m_pm->getObject<MyClass1>(), qobject_cast<MyClass1*>(object11));
QCOMPARE(m_pm->getObject<MyClass2>(), object2); QCOMPARE(m_pm->getObject<MyClass2>(), object2);
QCOMPARE(m_pm->getObjectByName(objectName), (QObject*)0);
m_pm->addObject(object2b);
QCOMPARE(m_pm->getObjectByName(objectName), object2b);
QCOMPARE(m_pm->getObject<MyClass2>(
[&objectName](MyClass2 *obj) { return obj->objectName() == objectName;}), object2b);
m_pm->removeObject(object2); m_pm->removeObject(object2);
m_pm->removeObject(object11); m_pm->removeObject(object11);
m_pm->removeObject(object2b);
delete object2; delete object2;
delete object11; delete object11;
delete object2b;
} }
void tst_PluginManager::getObjects() void tst_PluginManager::getObjects()
@@ -172,6 +182,12 @@ void tst_PluginManager::getObjects()
QCOMPARE(m_pm->getObjects<MyClass1>(), QList<MyClass1*>() << object11 << object1); QCOMPARE(m_pm->getObjects<MyClass1>(), QList<MyClass1*>() << object11 << object1);
QCOMPARE(m_pm->getObjects<MyClass2>(), QList<MyClass2*>() << object2); QCOMPARE(m_pm->getObjects<MyClass2>(), QList<MyClass2*>() << object2);
QCOMPARE(m_pm->allObjects(), QList<QObject*>() << object2 << object11 << object1); QCOMPARE(m_pm->allObjects(), QList<QObject*>() << object2 << object11 << object1);
QCOMPARE(m_pm->getObjects<MyClass1>(
[](MyClass1 *o){
return !qobject_cast<MyClass11 *>(o);} ),
QList<MyClass1 *>() << object1);
m_pm->removeObject(object2); m_pm->removeObject(object2);
m_pm->removeObject(object11); m_pm->removeObject(object11);
m_pm->removeObject(object1); m_pm->removeObject(object1);