diff options
author | Hop311 <hop3114@gmail.com> | 2023-04-25 01:03:15 +0200 |
---|---|---|
committer | Hop311 <hop3114@gmail.com> | 2023-04-25 01:03:15 +0200 |
commit | 8fba1c8a02f8680e0d80279b8b6451fea4a40a62 (patch) | |
tree | ba88378d61e2121a26847b2f68ac5111b5c9baec /extension/src/openvic2/Types.hpp | |
parent | 639f86febf39184cccde9f898fc328375048233f (diff) |
Req comments + cleanup + c++ registry refactoring
Diffstat (limited to 'extension/src/openvic2/Types.hpp')
-rw-r--r-- | extension/src/openvic2/Types.hpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/extension/src/openvic2/Types.hpp b/extension/src/openvic2/Types.hpp index b20db10..226dd30 100644 --- a/extension/src/openvic2/Types.hpp +++ b/extension/src/openvic2/Types.hpp @@ -17,4 +17,66 @@ namespace OpenVic2 { public: std::string const& get_identifier() const; }; + + template<typename T, char const* name, std::enable_if<std::is_base_of<HasIdentifier, T>::value>::type* = nullptr> + class IdentifierRegistry { + std::vector<T> items; + bool locked = false; + public: + return_t add_item(T&& item) { + if (locked) { + Logger::error("Cannot add item to the ", name, " registry - locked!"); + return FAILURE; + } + if (item.get_identifier().empty()) { + Logger::error("Cannot add item to the ", name, " registry - empty identifier!"); + return FAILURE; + } + T const* old_item = get_item_by_identifier(item.get_identifier()); + if (old_item != nullptr) { + Logger::error("Cannot add item to the ", name, " registry - an item with the identifier \"", item.get_identifier(), "\" already exists!"); + return FAILURE; + } + items.push_back(item); + return SUCCESS; + } + void lock() { + if (locked) { + Logger::error("Failed to lock ", name, " registry - already locked!"); + } else { + locked = true; + Logger::info("Locked ", name, " registry after registering ", get_item_count(), " items"); + } + } + bool is_locked() const { + return locked; + } + size_t get_item_count() const { + return items.size(); + } + T* get_item_by_identifier(std::string const& identifier) { + if (!identifier.empty()) + for (T& item : items) + if (item.get_identifier() == identifier) return &item; + return nullptr; + } + T const* get_item_by_identifier(std::string const& identifier) const { + if (!identifier.empty()) + for (T const& item : items) + if (item.get_identifier() == identifier) return &item; + return nullptr; + } + T* get_item_by_index(size_t index) { + return index < items.size() ? &items[index] : nullptr; + } + T const* get_item_by_index(size_t index) const { + return index < items.size() ? &items[index] : nullptr; + } + std::vector<T>& get_items() { + return items; + } + std::vector<T> const& get_items() const { + return items; + } + }; } |