diff options
Diffstat (limited to 'src/corelib/plugin/qfactoryloader_p.h')
-rw-r--r-- | src/corelib/plugin/qfactoryloader_p.h | 82 |
1 files changed, 69 insertions, 13 deletions
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h index 1c48491b0d..e67bb98976 100644 --- a/src/corelib/plugin/qfactoryloader_p.h +++ b/src/corelib/plugin/qfactoryloader_p.h @@ -45,17 +45,18 @@ // We mean it. // +#include "QtCore/qglobal.h" +#ifndef QT_NO_QOBJECT + #include "QtCore/qobject.h" #include "QtCore/qstringlist.h" #include "QtCore/qjsonobject.h" #include "QtCore/qmap.h" #include "private/qlibrary_p.h" -#ifndef QT_NO_LIBRARY QT_BEGIN_NAMESPACE class QFactoryLoaderPrivate; - class Q_CORE_EXPORT QFactoryLoader : public QObject { Q_OBJECT @@ -65,23 +66,42 @@ public: explicit QFactoryLoader(const char *iid, const QString &suffix = QString(), Qt::CaseSensitivity = Qt::CaseSensitive); + +#ifndef QT_NO_LIBRARY ~QFactoryLoader(); - QList<QJsonObject> metaData() const; - QObject *instance(int index) const; + void update(); + static void refreshAll(); #if defined(Q_OS_UNIX) && !defined (Q_OS_MAC) QLibraryPrivate *library(const QString &key) const; -#endif +#endif // Q_OS_UNIX && !Q_OS_MAC +#endif // !QT_NO_LIBRARY QMultiMap<int, QString> keyMap() const; int indexOf(const QString &needle) const; - void update(); - - static void refreshAll(); + QList<QJsonObject> metaData() const; + 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) { @@ -95,23 +115,59 @@ 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<PluginInterface, FactoryInterface>(loader, key, std::forward<Arg>(arg)); } + QT_END_NAMESPACE -#endif // QT_NO_LIBRARY +#endif // QT_NO_QOBJECT #endif // QFACTORYLOADER_P_H |