CreatureLib/src/Battling/ScriptHandling/ScriptSet.hpp

74 lines
2.1 KiB
C++

#ifndef CREATURELIB_SCRIPTSET_HPP
#define CREATURELIB_SCRIPTSET_HPP
#include <Arbutils/Collections/Dictionary.hpp>
#include <Arbutils/Memory/UniquePtrList.hpp>
#include <any>
#include "Script.hpp"
namespace CreatureLib::Battling {
class ScriptSet {
ArbUt::UniquePtrList<Script> _scripts;
ArbUt::Dictionary<uint32_t, size_t> _lookup;
public:
~ScriptSet() = default;
static constexpr size_t defaultCapacity = 8;
ScriptSet() : _scripts(defaultCapacity), _lookup(defaultCapacity){};
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);
}
ArbUt::BorrowedPtr<Script> Get(const ArbUt::BasicStringView& key) const { return Get(key.GetHash()); }
ArbUt::BorrowedPtr<Script> Get(uint32_t keyHash) const noexcept {
size_t v;
if (_lookup.TryGet(keyHash, v)) {
return _scripts[v];
}
return nullptr;
}
void Remove(const ArbUt::BasicStringView& key) { Remove(key.GetHash()); }
void Remove(uint32_t keyHash) {
size_t v;
if (_lookup.TryGet(keyHash, v)) {
auto script = _scripts[v];
script->OnRemove();
_scripts.Remove(v);
_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<Script>& GetIterator() const { return _scripts; }
};
}
#endif // CREATURELIB_SCRIPTSET_HPP