#ifndef CREATURELIB_SCRIPTSET_HPP #define CREATURELIB_SCRIPTSET_HPP #include #include #include #include "Script.hpp" namespace CreatureLib::Battling { class ScriptSet { Arbutils::Collections::List _scripts; Arbutils::Collections::Dictionary _lookup; public: ~ScriptSet() { for (auto s : _scripts) { delete s; } } void Add(Script* script) { size_t v; if (_lookup.TryGet(script->GetName(), v)) { _scripts[v]->Stack(); delete script; return; } _scripts.Append(script); _lookup.Insert(script->GetName(), _scripts.Count() - 1); } Script* Get(const ConstString& key) const { return Get(key.GetHash()); } Script* Get(uint32_t keyHash) const noexcept { size_t v; if (_lookup.TryGet(keyHash, v)) { return _scripts[v]; } return nullptr; } void Remove(const ConstString& key) { Remove(key.GetHash()); } void Remove(uint32_t keyHash) { size_t v; if (_lookup.TryGet(keyHash, v)) { auto script = _scripts[v]; script->OnRemove(); delete script; _scripts.Remove(v); _lookup.Remove(keyHash); } } void Clear() { for (auto s : _scripts) { s->OnRemove(); delete s; } _scripts.Clear(); _lookup.Clear(); } bool Has(const ConstString& key) const { return _lookup.Has(key); } bool Has(uint32_t keyHash) const { return _lookup.Has(keyHash); } size_t Count() const { return _scripts.Count(); } const Arbutils::Collections::List* GetIterator() const { return &_scripts; } }; } #endif // CREATURELIB_SCRIPTSET_HPP