diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2016-01-05 01:06:50 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2016-01-05 10:28:27 +0000 |
commit | 8b2f133822a22379cbbaa33fe600c30b95dc0044 (patch) | |
tree | 7721d5e73a6810f27565e6f8b4d509448779a029 /src/corelib | |
parent | 32bd53c6b10b505a32d2940f9c0c8a7d3e85abf3 (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>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/plugin/qfactoryloader_p.h | 61 |
1 files changed, 57 insertions, 4 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 ¶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 |