72 lines
2.0 KiB
C++
72 lines
2.0 KiB
C++
#ifndef CREATURELIB_SCRIPTSET_HPP
|
|
#define CREATURELIB_SCRIPTSET_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
|