summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2016-01-05 01:06:50 +0100
committerMarc Mutz <marc.mutz@kdab.com>2016-01-05 10:28:27 +0000
commit8b2f133822a22379cbbaa33fe600c30b95dc0044 (patch)
tree7721d5e73a6810f27565e6f8b4d509448779a029
parent32bd53c6b10b505a32d2940f9c0c8a7d3e85abf3 (diff)
QFactoryLoader: generalize qLoadPlugin()
- Use perfect forwarding for the additional argument. - Provide a variadic template version - Deprecate qLoadPlugin1() — there's no reason for a different name — and fix all callers in qtbase. - Provide non-variadic overloads for up to three additional args (QPlatformIntegration rolled its own function because it needs three args). Change-Id: I72fb2dd9a021de704cbf5e4b6ea31c80447fb3b1 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h61
-rw-r--r--src/gui/kernel/qgenericpluginfactory.cpp2
-rw-r--r--src/gui/kernel/qplatforminputcontextfactory.cpp2
-rw-r--r--src/gui/kernel/qplatformintegrationfactory.cpp15
-rw-r--r--src/gui/kernel/qplatformthemefactory.cpp9
5 files changed, 65 insertions, 24 deletions
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index ee07084180..a4690c3f03 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -85,6 +85,23 @@ public:
QObject *instance(int index) const;
};
+#ifdef Q_COMPILER_VARIADIC_TEMPLATES
+
+template <class PluginInterface, class FactoryInterface, typename ...Args>
+PluginInterface *qLoadPlugin(const QFactoryLoader *loader, const QString &key, Args &&...args)
+{
+ const int index = loader->indexOf(key);
+ if (index != -1) {
+ QObject *factoryObject = loader->instance(index);
+ if (FactoryInterface *factory = qobject_cast<FactoryInterface *>(factoryObject))
+ if (PluginInterface *result = factory->create(key, std::forward<Args>(args)...))
+ return result;
+ }
+ return nullptr;
+}
+
+#else
+
template <class PluginInterface, class FactoryInterface>
PluginInterface *qLoadPlugin(const QFactoryLoader *loader, const QString &key)
{
@@ -98,21 +115,57 @@ template <class PluginInterface, class FactoryInterface>
return 0;
}
-template <class PluginInterface, class FactoryInterface, class Parameter1>
-PluginInterface *qLoadPlugin1(const QFactoryLoader *loader,
+template <class PluginInterface, class FactoryInterface, class P1>
+PluginInterface *qLoadPlugin(const QFactoryLoader *loader,
const QString &key,
- const Parameter1 &parameter1)
+ P1 &&p1)
{
const int index = loader->indexOf(key);
if (index != -1) {
QObject *factoryObject = loader->instance(index);
if (FactoryInterface *factory = qobject_cast<FactoryInterface *>(factoryObject))
- if (PluginInterface *result = factory->create(key, parameter1))
+ if (PluginInterface *result = factory->create(key, std::forward<P1>(p1)))
return result;
}
return 0;
}
+template <class PluginInterface, class FactoryInterface, class P1, class P2>
+PluginInterface *qLoadPlugin(const QFactoryLoader *loader,
+ const QString &key,
+ P1 &&p1, P2 &&p2)
+{
+ const int index = loader->indexOf(key);
+ if (index != -1) {
+ QObject *factoryObject = loader->instance(index);
+ if (FactoryInterface *factory = qobject_cast<FactoryInterface *>(factoryObject))
+ if (PluginInterface *result = factory->create(key, std::forward<P1>(p1), std::forward<P2>(p2)))
+ return result;
+ }
+ return 0;
+}
+
+template <class PluginInterface, class FactoryInterface, class P1, class P2, class P3>
+PluginInterface *qLoadPlugin(const QFactoryLoader *loader,
+ const QString &key,
+ P1 &&p1, P2 &&p2, P3 &&p3)
+{
+ const int index = loader->indexOf(key);
+ if (index != -1) {
+ QObject *factoryObject = loader->instance(index);
+ if (FactoryInterface *factory = qobject_cast<FactoryInterface *>(factoryObject))
+ if (PluginInterface *result = factory->create(key, std::forward<P1>(p1), std::forward<P2>(p2), std::forward<P3>(p3)))
+ return result;
+ }
+ return 0;
+}
+
+#endif
+
+template <class PluginInterface, class FactoryInterface, typename Arg>
+Q_DECL_DEPRECATED PluginInterface *qLoadPlugin1(const QFactoryLoader *loader, const QString &key, Arg &&arg)
+{ return qLoadPlugin(loader, key, std::forward<Arg>(arg)); }
+
QT_END_NAMESPACE
#endif // QT_NO_QOBJECT
diff --git a/src/gui/kernel/qgenericpluginfactory.cpp b/src/gui/kernel/qgenericpluginfactory.cpp
index d7b9bfba06..15fa094f54 100644
--- a/src/gui/kernel/qgenericpluginfactory.cpp
+++ b/src/gui/kernel/qgenericpluginfactory.cpp
@@ -71,7 +71,7 @@ QObject *QGenericPluginFactory::create(const QString& key, const QString &specif
{
#if (!defined(Q_OS_WIN32) || defined(QT_SHARED)) && !defined(QT_NO_LIBRARY)
const QString driver = key.toLower();
- if (QObject *object = qLoadPlugin1<QObject, QGenericPlugin>(loader(), driver, specification))
+ if (QObject *object = qLoadPlugin<QObject, QGenericPlugin>(loader(), driver, specification))
return object;
#else // (!Q_OS_WIN32 || QT_SHARED) && !QT_NO_LIBRARY
Q_UNUSED(key)
diff --git a/src/gui/kernel/qplatforminputcontextfactory.cpp b/src/gui/kernel/qplatforminputcontextfactory.cpp
index fedf940dda..c80797d884 100644
--- a/src/gui/kernel/qplatforminputcontextfactory.cpp
+++ b/src/gui/kernel/qplatforminputcontextfactory.cpp
@@ -69,7 +69,7 @@ QPlatformInputContext *QPlatformInputContextFactory::create(const QString& key)
QStringList paramList = key.split(QLatin1Char(':'));
const QString platform = paramList.takeFirst().toLower();
- QPlatformInputContext *ic = qLoadPlugin1<QPlatformInputContext, QPlatformInputContextPlugin>
+ QPlatformInputContext *ic = qLoadPlugin<QPlatformInputContext, QPlatformInputContextPlugin>
(loader(), platform, paramList);
if (ic && ic->isValid())
return ic;
diff --git a/src/gui/kernel/qplatformintegrationfactory.cpp b/src/gui/kernel/qplatformintegrationfactory.cpp
index d109ceb2f0..2c8a7ce0f8 100644
--- a/src/gui/kernel/qplatformintegrationfactory.cpp
+++ b/src/gui/kernel/qplatformintegrationfactory.cpp
@@ -50,30 +50,19 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader,
(QPlatformIntegrationFactoryInterface_iid, QLatin1String(""), Qt::CaseInsensitive))
#endif // !QT_NO_LIBRARY
-static inline QPlatformIntegration *loadIntegration(QFactoryLoader *loader, const QString &key, const QStringList &parameters, int &argc, char ** argv)
-{
- const int index = loader->indexOf(key);
- if (index != -1) {
- if (QPlatformIntegrationPlugin *factory = qobject_cast<QPlatformIntegrationPlugin *>(loader->instance(index)))
- if (QPlatformIntegration *result = factory->create(key, parameters, argc, argv))
- return result;
- }
- return 0;
-}
-
QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList &paramList, int &argc, char **argv, const QString &platformPluginPath)
{
#ifndef QT_NO_LIBRARY
// Try loading the plugin from platformPluginPath first:
if (!platformPluginPath.isEmpty()) {
QCoreApplication::addLibraryPath(platformPluginPath);
- if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv))
+ if (QPlatformIntegration *ret = qLoadPlugin<QPlatformIntegration, QPlatformIntegrationPlugin>(directLoader(), platform, paramList, argc, argv))
return ret;
}
#else
Q_UNUSED(platformPluginPath);
#endif
- return loadIntegration(loader(), platform, paramList, argc, argv);
+ return qLoadPlugin<QPlatformIntegration, QPlatformIntegrationPlugin>(loader(), platform, paramList, argc, argv);
}
/*!
diff --git a/src/gui/kernel/qplatformthemefactory.cpp b/src/gui/kernel/qplatformthemefactory.cpp
index bcc37dad06..a89e3088ea 100644
--- a/src/gui/kernel/qplatformthemefactory.cpp
+++ b/src/gui/kernel/qplatformthemefactory.cpp
@@ -51,23 +51,22 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader,
QPlatformTheme *QPlatformThemeFactory::create(const QString& key, const QString &platformPluginPath)
{
+#ifndef QT_NO_LIBRARY
QStringList paramList = key.split(QLatin1Char(':'));
const QString platform = paramList.takeFirst().toLower();
-#ifndef QT_NO_LIBRARY
// Try loading the plugin from platformPluginPath first:
if (!platformPluginPath.isEmpty()) {
QCoreApplication::addLibraryPath(platformPluginPath);
- if (QPlatformTheme *ret = qLoadPlugin1<QPlatformTheme, QPlatformThemePlugin>(directLoader(), platform, paramList))
+ if (QPlatformTheme *ret = qLoadPlugin<QPlatformTheme, QPlatformThemePlugin>(directLoader(), platform, paramList))
return ret;
}
- if (QPlatformTheme *ret = qLoadPlugin1<QPlatformTheme, QPlatformThemePlugin>(loader(), platform, paramList))
- return ret;
+ return qLoadPlugin<QPlatformTheme, QPlatformThemePlugin>(loader(), platform, paramList);
#else
Q_UNUSED(key);
Q_UNUSED(platformPluginPath);
-#endif
return 0;
+#endif
}
/*!