11 #ifndef smtk_plugin_Client_h
12 #define smtk_plugin_Client_h
14 #include "smtk/plugin/ClientBase.h"
15 #include "smtk/plugin/Registry.h"
19 #include <unordered_set>
22 #include "smtk/plugin/Sentinel.h"
31 template<
typename Registrar,
typename Manager>
60 template<
typename Registrar,
typename Manager,
typename... T>
67 static std::shared_ptr<ClientBase> create();
68 ~
Client()
override =
default;
77 class SMTK_ALWAYS_EXPORT
Client
79 ,
public Client<Registrar, T...>
82 static std::shared_ptr<ClientBase> create();
83 ~
Client()
override =
default;
88 ,
Client<Registrar, T...>()
93 template<
typename Registrar>
94 class SMTK_ALWAYS_EXPORT Client<Registrar, detail::Sentinel> :
public ClientBase
99 ~Client()
override =
default;
111 template<
typename Manager>
117 virtual bool registerPluginTo(
const std::shared_ptr<Manager>&) = 0;
118 virtual bool unregisterPluginFrom(
const std::shared_ptr<Manager>&) = 0;
123 std::unordered_set<smtk::plugin::RegistryBase*> m_registries;
126 template<
typename Manager>
129 for (
auto* base_registry : m_registries)
131 delete base_registry;
140 template<
typename Registrar,
typename Manager>
141 class SMTK_ALWAYS_EXPORT Client :
public ClientFor<Manager>
144 bool registerPluginTo(
const std::shared_ptr<Manager>&)
override;
145 bool unregisterPluginFrom(
const std::shared_ptr<Manager>&)
override;
151 template<
typename Registrar,
typename Manager>
153 const std::shared_ptr<Manager>& manager)
161 for (
auto base_registry : ClientFor<Manager>::m_registries)
163 QueriedRegistry* registry =
dynamic_cast<QueriedRegistry*
>(base_registry);
170 if (registry !=
nullptr && registry->contains(manager))
172 return base_registry;
178 template<
typename Registrar,
typename Manager>
179 bool Client<Registrar, Manager>::registerPluginTo(
const std::shared_ptr<Manager>& manager)
183 if (this->find(manager) ==
nullptr)
185 auto val = ClientFor<Manager>::m_registries.insert(
192 template<
typename Registrar,
typename Manager>
193 bool Client<Registrar, Manager>::unregisterPluginFrom(
const std::shared_ptr<Manager>& manager)
197 if (
auto registry = this->find(manager))
199 ClientFor<Manager>::m_registries.erase(registry);