#ifndef CREATURELIB_SCRIPTSET_HPP #define CREATURELIB_SCRIPTSET_HPP #include #include "BattleScript.hpp" namespace CreatureLib::Battling { class ScriptSet { ArbUt::UniquePtrList _scripts; ArbUt::Dictionary _lookup; public: ~ScriptSet() = default; static constexpr size_t defaultCapacity = 8; ScriptSet() : _scripts(defaultCapacity), _lookup(defaultCapacity){}; void Clone(ScriptSet& s) { for (auto* script : _scripts) { s.Add(script->Clone()); } } BattleScript* Add(BattleScript* script) { auto v = _lookup.TryGet(script->GetName()); if (v.has_value()) { _scripts[v.value()]->Stack(); delete script; return _scripts[v.value()]; } _scripts.Append(script); _lookup.Insert(script->GetName(), _scripts.Count() - 1); return script; } ArbUt::OptionalBorrowedPtr Get(const ArbUt::BasicStringView& key) const { return Get(key.GetHash()); } ArbUt::OptionalBorrowedPtr Get(uint32_t keyHash) const noexcept { auto v = _lookup.TryGet(keyHash); if (v.has_value()) { return _scripts[v.value()].GetRaw(); } return {}; } void Remove(const ArbUt::BasicStringView& key) { Remove(key.GetHash()); } void Remove(uint32_t keyHash) { auto v = _lookup.TryGet(keyHash); if (v.has_value()) { auto script = _scripts[v.value()]; script->OnRemove(); _scripts.Remove(v.value()); _lookup.Remove(keyHash); } } void Clear() { for (auto s : _scripts) { s->OnRemove(); delete s; } _scripts.Clear(); _lookup.Clear(); } bool Has(const ArbUt::BasicStringView& key) const { return _lookup.Has(key); } bool Has(uint32_t keyHash) const { return _lookup.Has(keyHash); } inline size_t Count() const { return _scripts.Count(); } inline const ArbUt::UniquePtrList& GetIterator() const { return _scripts; } }; } #endif // CREATURELIB_SCRIPTSET_HPP