summaryrefslogtreecommitdiff
path: root/src/common/Dynamic/ObjectRegistry.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/Dynamic/ObjectRegistry.h')
-rw-r--r--src/common/Dynamic/ObjectRegistry.h75
1 files changed, 20 insertions, 55 deletions
diff --git a/src/common/Dynamic/ObjectRegistry.h b/src/common/Dynamic/ObjectRegistry.h
index 7cc2c9abca..d72fd7b3a7 100644
--- a/src/common/Dynamic/ObjectRegistry.h
+++ b/src/common/Dynamic/ObjectRegistry.h
@@ -23,20 +23,23 @@
#include <string>
#include <unordered_map>
#include <vector>
+#include <memory>
/** ObjectRegistry holds all registry item of the same type
*/
template<class T, class Key = std::string>
-class ObjectRegistry
+class ObjectRegistry final
{
public:
- typedef std::map<Key, T*> RegistryMapType;
+ typedef std::map<Key, std::unique_ptr<T>> RegistryMapType;
/// Returns a registry item
- const T* GetRegistryItem(Key key) const
+ T const* GetRegistryItem(Key const& key) const
{
- typename RegistryMapType::const_iterator iter = i_registeredObjects.find(key);
- return ( iter == i_registeredObjects.end() ? nullptr : iter->second );
+ auto itr = _registeredObjects.find(key);
+ if (itr == _registeredObjects.end())
+ return nullptr;
+ return itr->second.get();
}
static ObjectRegistry<T, Key>* instance()
@@ -46,72 +49,34 @@ public:
}
/// Inserts a registry item
- bool InsertItem(T* obj, Key key, bool override = false)
+ bool InsertItem(T* obj, Key const& key, bool force = false)
{
- typename RegistryMapType::iterator iter = i_registeredObjects.find(key);
- if ( iter != i_registeredObjects.end() )
+ auto itr = _registeredObjects.find(key);
+ if (itr != _registeredObjects.end())
{
- if ( !override )
+ if (!force)
{
return false;
}
- delete iter->second;
- i_registeredObjects.erase(iter);
+ _registeredObjects.erase(itr);
}
- i_registeredObjects[key] = obj;
+ _registeredObjects.emplace(std::piecewise_construct, std::forward_as_tuple(key), std::forward_as_tuple(obj));
return true;
}
- /// Removes a registry item
- void RemoveItem(Key key, bool delete_object = true)
- {
- typename RegistryMapType::iterator iter = i_registeredObjects.find(key);
- if ( iter != i_registeredObjects.end() )
- {
- if ( delete_object )
- {
- delete iter->second;
- }
- i_registeredObjects.erase(iter);
- }
- }
-
- /// Returns true if registry contains an item
- bool HasItem(Key key) const
- {
- return (i_registeredObjects.find(key) != i_registeredObjects.end());
- }
-
- /// Inefficiently return a vector of registered items
- unsigned int GetRegisteredItems(std::vector<Key>& l) const
- {
- unsigned int sz = l.size();
- l.resize(sz + i_registeredObjects.size());
- for (typename RegistryMapType::const_iterator iter = i_registeredObjects.begin(); iter != i_registeredObjects.end(); ++iter)
- {
- l[sz++] = iter->first;
- }
- return i_registeredObjects.size();
- }
-
/// Return the map of registered items
RegistryMapType const& GetRegisteredItems() const
{
- return i_registeredObjects;
+ return _registeredObjects;
}
- ObjectRegistry() { }
- ~ObjectRegistry()
- {
- for (typename RegistryMapType::iterator iter = i_registeredObjects.begin(); iter != i_registeredObjects.end(); ++iter)
- {
- delete iter->second;
- }
- i_registeredObjects.clear();
- }
private:
- RegistryMapType i_registeredObjects;
+ RegistryMapType _registeredObjects;
+
+ // non instanceable, only static
+ ObjectRegistry() { }
+ ~ObjectRegistry() { }
};
#endif