CreatureLib/src/Battling/ScriptHandling/ScriptSet.hpp

76 lines
2.2 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>
2020-06-02 13:03:31 +00:00
#include <Arbutils/Memory/UniquePtrList.hpp>
#include <any>
#include "Script.hpp"
namespace CreatureLib::Battling {
class ScriptSet {
2020-06-02 13:03:31 +00:00
ArbUt::UniquePtrList<Script> _scripts;
2020-05-26 16:31:06 +00:00
ArbUt::Dictionary<uint32_t, size_t> _lookup;
public:
2020-06-02 13:03:31 +00:00
~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);
}
2020-06-02 13:03:31 +00:00
ArbUt::BorrowedPtr<Script> Get(const ArbUt::CaseInsensitiveConstString& key) const {
return Get(key.GetHash());
}
2020-06-02 13:03:31 +00:00
ArbUt::BorrowedPtr<Script> Get(uint32_t keyHash) const noexcept {
size_t v;
if (_lookup.TryGet(keyHash, v)) {
return _scripts[v];
}
return nullptr;
}
2020-05-26 16:31:06 +00:00
void Remove(const ArbUt::CaseInsensitiveConstString& 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);
}
}
2019-11-09 11:15:45 +00:00
void Clear() {
for (auto s : _scripts) {
s->OnRemove();
delete s;
}
_scripts.Clear();
_lookup.Clear();
}
2020-05-26 16:31:06 +00:00
bool Has(const ArbUt::CaseInsensitiveConstString& key) const { return _lookup.Has(key); }
bool Has(uint32_t keyHash) const { return _lookup.Has(keyHash); }
2020-04-23 21:23:58 +00:00
inline size_t Count() const { return _scripts.Count(); }
2019-11-09 11:15:45 +00:00
inline const ArbUt::UniquePtrList<Script>& GetIterator() const { return _scripts; }
};
}
#endif // CREATURELIB_SCRIPTSET_HPP