CreatureLib/src/Battling/ScriptHandling/ScriptSet.hpp

76 lines
2.0 KiB
C++
Raw Normal View History

#ifndef CREATURELIB_SCRIPTSET_HPP
#define CREATURELIB_SCRIPTSET_HPP
2020-04-09 16:19:21 +00:00
#include <Arbutils/Collections/Dictionary.hpp>
#include <Arbutils/Collections/List.hpp>
#include <any>
#include "Script.hpp"
namespace CreatureLib::Battling {
class ScriptSet {
Arbutils::Collections::List<Script*> _scripts;
Arbutils::Collections::Dictionary<uint32_t, size_t> _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);
}
}
2019-11-09 11:15:45 +00:00
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(); }
2019-11-09 11:15:45 +00:00
const Arbutils::Collections::List<Script*>* GetIterator() const { return &_scripts; }
};
}
#endif // CREATURELIB_SCRIPTSET_HPP