10 #ifndef smtk_attribute_AssociationRuleManager_h
11 #define smtk_attribute_AssociationRuleManager_h
13 #include "smtk/CoreExports.h"
16 #include "smtk/attribute/AssociationRule.h"
17 #include "smtk/attribute/AssociationRuleFactory.h"
18 #include "smtk/attribute/AssociationRules.h"
19 #include "smtk/attribute/Resource.h"
23 #include "smtk/resource/Manager.h"
24 #include "smtk/resource/Observer.h"
37 :
public std::enable_shared_from_this<AssociationRuleManager>
39 template<
typename BaseRuleType,
bool = true>
42 template<
typename BaseRuleType,
bool>
55 return ruleManager.m_associationRegisterFunctions;
57 static std::unordered_map<std::size_t, smtk::resource::Observers::Key>& observers(
60 return ruleManager.m_associationObservers;
69 return resource.associationRules().dissociationRuleFactory();
74 return ruleManager.m_dissociationRegisterFunctions;
76 static std::unordered_map<std::size_t, smtk::resource::Observers::Key>& observers(
79 return ruleManager.m_dissociationObservers;
86 static std::shared_ptr<AssociationRuleManager> create()
108 bool registerResourceManager(smtk::resource::Manager::Ptr&);
113 for (
const auto& registerFunction : m_associationRegisterFunctions)
115 registerFunction.second(*resource);
118 for (
const auto& registerFunction : m_dissociationRegisterFunctions)
120 registerFunction.second(*resource);
127 template<
typename CustomRuleType>
130 return registerRule<AssociationRule, CustomRuleType>(alias);
134 template<
typename CustomRuleType>
137 return registerRule<DissociationRule, CustomRuleType>(alias);
141 template<
typename CustomRuleType>
144 return unregisterRule<AssociationRule, CustomRuleType>();
148 template<
typename CustomRuleType>
151 return unregisterRule<DissociationRule, CustomRuleType>();
159 template<
typename BaseRuleType,
typename CustomRuleType>
165 Trait<BaseRuleType>::factory(resource).template registerType<CustomRuleType>();
166 Trait<BaseRuleType>::factory(resource).template addAlias<CustomRuleType>(alias);
170 Trait<BaseRuleType>::registerFunctions(*this).insert(
171 std::make_pair(
typeid(CustomRuleType).hash_code(), registerCustomRuleType));
174 if (
auto manager = m_manager.lock())
178 auto registerCustomRuleTypeObserver =
193 Trait<BaseRuleType>::observers(*this).insert(std::make_pair(
194 typeid(CustomRuleType).hash_code(),
195 manager->observers().insert(
196 registerCustomRuleTypeObserver,
197 "Register custom attribute rule <" + smtk::common::typeName<CustomRuleType>() +
">.")));
204 template<
typename BaseRuleType,
typename CustomRuleType>
208 Trait<BaseRuleType>::registerFunctions(*this).erase(
typeid(CustomRuleType).hash_code());
211 Trait<BaseRuleType>::observers(*this).erase(
typeid(CustomRuleType).hash_code());
214 if (
auto manager = m_manager.lock())
219 Trait<BaseRuleType>::factory(*resource).template unregisterType<CustomRuleType>();
226 std::weak_ptr<smtk::resource::Manager> m_manager;
229 m_associationRegisterFunctions;
231 m_dissociationRegisterFunctions;
233 std::unordered_map<std::size_t, smtk::resource::Observers::Key> m_associationObservers;
234 std::unordered_map<std::size_t, smtk::resource::Observers::Key> m_dissociationObservers;