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>bb10
parent
32bd53c6b1
commit
8b2f133822
|
|
@ -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 ¶meter1)
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 ¶meters, 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 ¶mList, 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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
Loading…
Reference in New Issue