#ifndef CREATURELIB_SCRIPTSET_HPP #define CREATURELIB_SCRIPTSET_HPP #include #include #include "Script.hpp" namespace CreatureLib::Battling { class ScriptSet { std::vector _scripts; std::unordered_map _lookup; public: ~ScriptSet() { for (auto s : _scripts) { delete s; } } void Add(Script* script) { auto f = _lookup.find(script->GetName()); if (f != _lookup.end()) { _scripts[f.operator*().second]->Stack(); delete script; return; } _scripts.push_back(script); _lookup.insert({script->GetName(), _scripts.size() - 1}); } Script* Get(const ConstString& key) const { auto f = _lookup.find(key); if (f != _lookup.end()) { return _scripts[f->second]; } return nullptr; } void Remove(const ConstString& key) { auto find = _lookup.find(key); if (find != _lookup.end()) { auto script = _scripts[find->second]; script->OnRemove(); delete script; _scripts.erase(_scripts.begin() + find.operator*().second); _lookup.erase(key); } } void Clear() { for (auto s : _scripts) { delete s; } _scripts.clear(); _lookup.clear(); } bool Has(const ConstString& key) const { auto find = _lookup.find(key); return find != _lookup.end(); } size_t Count() const { return _scripts.size(); } const std::vector* GetIterator() const { return &_scripts; } }; } #endif // CREATURELIB_SCRIPTSET_HPP