diff options
author | ariel- <ariel-@users.noreply.github.com> | 2017-06-01 02:29:20 -0300 |
---|---|---|
committer | funjoker <funjoker109@gmail.com> | 2020-06-14 23:49:05 +0200 |
commit | 1881088744315ed3edcb1a61290cd5bde6ff1d9a (patch) | |
tree | 3004556174e8ebd8ac32311e367a84f9c5bf8c9a /src/server/shared/Dynamic/ObjectRegistry.h | |
parent | 43339e68402a428862198fdc0c8143ab749dc59e (diff) |
Core/AI: Factory functions cleanup
- Get rid of fugly void pointers
- Streamlined AI selection code, using Permissible as it should've been instead of harcoded checks on the selector code
- Moved IdleMovementGenerator singleton to factory code
(cherry picked from commit ce3787f190d28c1e981598eef2cd24c622a2cbae)
Diffstat (limited to 'src/server/shared/Dynamic/ObjectRegistry.h')
-rw-r--r-- | src/server/shared/Dynamic/ObjectRegistry.h | 71 |
1 files changed, 21 insertions, 50 deletions
diff --git a/src/server/shared/Dynamic/ObjectRegistry.h b/src/server/shared/Dynamic/ObjectRegistry.h index 45380d699d3..89ca33f15fa 100644 --- a/src/server/shared/Dynamic/ObjectRegistry.h +++ b/src/server/shared/Dynamic/ObjectRegistry.h @@ -23,14 +23,15 @@ #include <string> #include <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; static ObjectRegistry<T, Key>* instance() { @@ -39,71 +40,41 @@ class ObjectRegistry } /// 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() ? NULL : iter->second ); + auto itr = _registeredObjects.find(key); + if (itr == _registeredObjects.end()) + return nullptr; + return itr->second.get(); } /// 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 + 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 |