diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2020-09-29 21:20:10 +0200 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2020-09-29 21:20:10 +0200 |
| commit | cf828cd77b41e75b6adb3dc79908aa27142fa0af (patch) | |
| tree | ce0f672e3f335aae4e0ecadf7a5cd97fe669868e /src/plugincontainer.cpp | |
| parent | 69625912b822f5e7630648d76af2408f013f23ba (diff) | |
Use bf::for_each instead of custom templates.
Diffstat (limited to 'src/plugincontainer.cpp')
| -rw-r--r-- | src/plugincontainer.cpp | 78 |
1 files changed, 21 insertions, 57 deletions
diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index e6a4e877..1af8487f 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -24,57 +24,16 @@ namespace bf = boost::fusion; template <class T>
struct PluginTypeName;
-template <> struct PluginTypeName<QObject> { static QString get() { return {}; } };
-template <> struct PluginTypeName<MOBase::IPlugin> { static QString get() { return QT_TR_NOOP("Plugin"); } };
-template <> struct PluginTypeName<MOBase::IPluginDiagnose> { static QString get() { return QT_TR_NOOP("Diagnose"); } };
-template <> struct PluginTypeName<MOBase::IPluginGame> { static QString get() { return QT_TR_NOOP("Game"); } };
-template <> struct PluginTypeName<MOBase::IPluginInstaller> { static QString get() { return QT_TR_NOOP("Installer"); } };
-template <> struct PluginTypeName<MOBase::IPluginModPage> { static QString get() { return QT_TR_NOOP("Mod Page"); } };
-template <> struct PluginTypeName<MOBase::IPluginPreview> { static QString get() { return QT_TR_NOOP("Preview"); } };
-template <> struct PluginTypeName<MOBase::IPluginTool> { static QString get() { return QT_TR_NOOP("Tool"); } };
-template <> struct PluginTypeName<MOBase::IPluginProxy> { static QString get() { return QT_TR_NOOP("Proxy"); } };
-template <> struct PluginTypeName<MOBase::IPluginFileMapper> { static QString get() { return QT_TR_NOOP("File Mapper"); } };
-
-template <class Reducer, template <class> class Mapper, class BfMap>
-struct plugin_map_iterate_impl;
-
-template <class Reducer, template <class> class Mapper>
-struct plugin_map_iterate_impl<Reducer, Mapper, bf::map<>>
-{
- template <class U, class... Args>
- static auto apply(Reducer const& r, U &&u, Args const&... args) {
- return std::forward<U>(u);
- }
-};
-
-template <
- class Reducer,
- template <class> class Mapper,
- class K, class V, class... Ps
->
-struct plugin_map_iterate_impl<Reducer, Mapper, bf::map<bf::pair<K, V>, Ps... >>
-{
- template <class U, class... Args>
- static auto apply(Reducer const& r, U&& u, Args const&... args) {
- return plugin_map_iterate_impl<Reducer, Mapper, bf::map<Ps... >>::apply(r, r(Mapper<K>::get(args... ), u), args... );
- }
-};
-
-template <template <class> class M, class B, class R, class U, class... Args>
-auto plugin_map_iterate(R const& r, U &&init, Args const&... args) {
- return plugin_map_iterate_impl<R, M, B>::apply(r, std::forward<U>(init), args... );
-}
-
-template <class T>
-struct PluginTypeNameIf {
- static QString get(QObject* plugin) {
- if (qobject_cast<T*>(plugin)) {
- return PluginTypeName<T>::get();
- }
- return {};
- }
-};
-
+template <> struct PluginTypeName<QObject> { static QString value() { return {}; } };
+template <> struct PluginTypeName<MOBase::IPlugin> { static QString value() { return QT_TR_NOOP("Plugin"); } };
+template <> struct PluginTypeName<MOBase::IPluginDiagnose> { static QString value() { return QT_TR_NOOP("Diagnose"); } };
+template <> struct PluginTypeName<MOBase::IPluginGame> { static QString value() { return QT_TR_NOOP("Game"); } };
+template <> struct PluginTypeName<MOBase::IPluginInstaller> { static QString value() { return QT_TR_NOOP("Installer"); } };
+template <> struct PluginTypeName<MOBase::IPluginModPage> { static QString value() { return QT_TR_NOOP("Mod Page"); } };
+template <> struct PluginTypeName<MOBase::IPluginPreview> { static QString value() { return QT_TR_NOOP("Preview"); } };
+template <> struct PluginTypeName<MOBase::IPluginTool> { static QString value() { return QT_TR_NOOP("Tool"); } };
+template <> struct PluginTypeName<MOBase::IPluginProxy> { static QString value() { return QT_TR_NOOP("Proxy"); } };
+template <> struct PluginTypeName<MOBase::IPluginFileMapper> { static QString value() { return QT_TR_NOOP("File Mapper"); } };
QStringList PluginContainer::implementedInterfaces(const IPlugin* plugin) const
{
@@ -88,17 +47,22 @@ QStringList PluginContainer::implementedInterfaces(const IPlugin* plugin) const return {};
}
+ // We need a QObject to be able to qobject_cast<> to the plugin types:
+ const QObject* oPlugin = *it;
+
// Find all the names:
- auto names = plugin_map_iterate<PluginTypeNameIf, PluginMap>([](QString name, QStringList value) {
- if (name.isEmpty()) {
- return value;
+ QStringList names;
+ bf::for_each(m_Plugins, [oPlugin, &names](auto const& p) {
+ using key_type = typename std::decay_t<decltype(p)>::first_type;
+ auto name = PluginTypeName<key_type>::value();
+ if (!name.isEmpty()) {
+ names.append(name);
}
- return value << name;
- }, QStringList(), *it);
+ });
// If the plugin implements at least one interface other than IPlugin, remove IPlugin:
if (names.size() > 1) {
- names.removeAll(PluginTypeName<IPlugin>::get());
+ names.removeAll(PluginTypeName<IPlugin>::value());
}
return names;
|
