Use unique pointers in scriptset.
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
23e2bc73bc
commit
1ef50fd3a6
|
@ -56,7 +56,7 @@ export BattleParty* const* CreatureLib_Battle_GetParties(const Battle* p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export Script* CreatureLib_Battle_GetVolatileScript(Battle* p, const char* key) {
|
export Script* CreatureLib_Battle_GetVolatileScript(Battle* p, const char* key) {
|
||||||
return p->GetVolatileScript(ConstString::GetHash(key));
|
return p->GetVolatileScript(ConstString::GetHash(key)).GetRaw();
|
||||||
}
|
}
|
||||||
export uint8_t CreatureLib_Battle_AddVolatileScriptByName(Battle* p, const char* key) {
|
export uint8_t CreatureLib_Battle_AddVolatileScriptByName(Battle* p, const char* key) {
|
||||||
Try(p->AddVolatileScript(ConstString(key));)
|
Try(p->AddVolatileScript(ConstString(key));)
|
||||||
|
|
|
@ -137,7 +137,7 @@ void Battle::AddVolatileScript(const ConstString& key) {
|
||||||
ss << "Invalid volatile script requested for battle: '" << key.c_str() << "'.";
|
ss << "Invalid volatile script requested for battle: '" << key.c_str() << "'.";
|
||||||
throw CreatureException(ss.str());
|
throw CreatureException(ss.str());
|
||||||
}
|
}
|
||||||
return _volatile.Add(script);
|
return _volatile.Add(script.GetRaw());
|
||||||
}
|
}
|
||||||
void Battle::AddVolatileScript(Script* script) { return _volatile.Add(script); }
|
void Battle::AddVolatileScript(Script* script) { return _volatile.Add(script); }
|
||||||
void Battle::RemoveVolatileScript(Script* script) { _volatile.Remove(script->GetName()); }
|
void Battle::RemoveVolatileScript(Script* script) { _volatile.Remove(script->GetName()); }
|
||||||
|
|
|
@ -82,8 +82,8 @@ namespace CreatureLib::Battling {
|
||||||
|
|
||||||
const ArbUt::UniquePtrList<BattleParty>& GetParties() const noexcept { return _parties; }
|
const ArbUt::UniquePtrList<BattleParty>& GetParties() const noexcept { return _parties; }
|
||||||
const ArbUt::UniquePtrList<BattleSide>& GetSides() const noexcept { return _sides; }
|
const ArbUt::UniquePtrList<BattleSide>& GetSides() const noexcept { return _sides; }
|
||||||
Script* GetVolatileScript(const ConstString& key) const { return _volatile.Get(key); }
|
ArbUt::BorrowedPtr<Script> GetVolatileScript(const ConstString& key) const { return _volatile.Get(key); }
|
||||||
Script* GetVolatileScript(uint32_t keyHash) const noexcept { return _volatile.Get(keyHash); }
|
ArbUt::BorrowedPtr<Script> GetVolatileScript(uint32_t keyHash) const noexcept { return _volatile.Get(keyHash); }
|
||||||
void AddVolatileScript(const ConstString& key);
|
void AddVolatileScript(const ConstString& key);
|
||||||
void AddVolatileScript(Script* script);
|
void AddVolatileScript(Script* script);
|
||||||
void RemoveVolatileScript(const ConstString& name) { _volatile.Remove(name); }
|
void RemoveVolatileScript(const ConstString& name) { _volatile.Remove(name); }
|
||||||
|
|
|
@ -225,7 +225,7 @@ void Battling::Creature::AddVolatileScript(const ConstString& name) {
|
||||||
ss << "Invalid volatile script requested for creature: '" << name.c_str() << "'.";
|
ss << "Invalid volatile script requested for creature: '" << name.c_str() << "'.";
|
||||||
throw CreatureException(ss.str());
|
throw CreatureException(ss.str());
|
||||||
}
|
}
|
||||||
_volatile.Add(script);
|
_volatile.Add(script.GetRaw());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Battling::Creature::AddVolatileScript(Script* script) { _volatile.Add(script); }
|
void Battling::Creature::AddVolatileScript(Script* script) { _volatile.Add(script); }
|
||||||
|
|
|
@ -44,7 +44,7 @@ namespace CreatureLib::Battling {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return (*s).get();
|
return (*s).get();
|
||||||
} else {
|
} else {
|
||||||
auto& set = *current.GetScriptSet()->GetIterator();
|
auto& set = current.GetScriptSet()->GetIterator();
|
||||||
auto count = set.Count();
|
auto count = set.Count();
|
||||||
if (_setIndex >= count) {
|
if (_setIndex >= count) {
|
||||||
_index++;
|
_index++;
|
||||||
|
@ -56,7 +56,7 @@ namespace CreatureLib::Battling {
|
||||||
_index++;
|
_index++;
|
||||||
_setIndex = 0;
|
_setIndex = 0;
|
||||||
}
|
}
|
||||||
return v;
|
return v.GetRaw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,21 +2,17 @@
|
||||||
#define CREATURELIB_SCRIPTSET_HPP
|
#define CREATURELIB_SCRIPTSET_HPP
|
||||||
|
|
||||||
#include <Arbutils/Collections/Dictionary.hpp>
|
#include <Arbutils/Collections/Dictionary.hpp>
|
||||||
#include <Arbutils/Collections/List.hpp>
|
#include <Arbutils/Memory/UniquePtrList.hpp>
|
||||||
#include <any>
|
#include <any>
|
||||||
#include "Script.hpp"
|
#include "Script.hpp"
|
||||||
|
|
||||||
namespace CreatureLib::Battling {
|
namespace CreatureLib::Battling {
|
||||||
class ScriptSet {
|
class ScriptSet {
|
||||||
ArbUt::List<Script*> _scripts;
|
ArbUt::UniquePtrList<Script> _scripts;
|
||||||
ArbUt::Dictionary<uint32_t, size_t> _lookup;
|
ArbUt::Dictionary<uint32_t, size_t> _lookup;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~ScriptSet() {
|
~ScriptSet() = default;
|
||||||
for (auto s : _scripts) {
|
|
||||||
delete s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static constexpr size_t defaultCapacity = 8;
|
static constexpr size_t defaultCapacity = 8;
|
||||||
ScriptSet() : _scripts(defaultCapacity), _lookup(defaultCapacity){};
|
ScriptSet() : _scripts(defaultCapacity), _lookup(defaultCapacity){};
|
||||||
|
@ -33,9 +29,11 @@ namespace CreatureLib::Battling {
|
||||||
_lookup.Insert(script->GetName(), _scripts.Count() - 1);
|
_lookup.Insert(script->GetName(), _scripts.Count() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Script* Get(const ArbUt::CaseInsensitiveConstString& key) const { return Get(key.GetHash()); }
|
ArbUt::BorrowedPtr<Script> Get(const ArbUt::CaseInsensitiveConstString& key) const {
|
||||||
|
return Get(key.GetHash());
|
||||||
|
}
|
||||||
|
|
||||||
Script* Get(uint32_t keyHash) const noexcept {
|
ArbUt::BorrowedPtr<Script> Get(uint32_t keyHash) const noexcept {
|
||||||
size_t v;
|
size_t v;
|
||||||
if (_lookup.TryGet(keyHash, v)) {
|
if (_lookup.TryGet(keyHash, v)) {
|
||||||
return _scripts[v];
|
return _scripts[v];
|
||||||
|
@ -50,7 +48,6 @@ namespace CreatureLib::Battling {
|
||||||
if (_lookup.TryGet(keyHash, v)) {
|
if (_lookup.TryGet(keyHash, v)) {
|
||||||
auto script = _scripts[v];
|
auto script = _scripts[v];
|
||||||
script->OnRemove();
|
script->OnRemove();
|
||||||
delete script;
|
|
||||||
_scripts.Remove(v);
|
_scripts.Remove(v);
|
||||||
_lookup.Remove(keyHash);
|
_lookup.Remove(keyHash);
|
||||||
}
|
}
|
||||||
|
@ -71,7 +68,7 @@ namespace CreatureLib::Battling {
|
||||||
|
|
||||||
inline size_t Count() const { return _scripts.Count(); }
|
inline size_t Count() const { return _scripts.Count(); }
|
||||||
|
|
||||||
const ArbUt::List<Script*>* GetIterator() const { return &_scripts; }
|
const ArbUt::UniquePtrList<Script>& GetIterator() const { return _scripts; }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ TEST_CASE("Add script to script set, then retrieve it", "[Battling, Scripting]")
|
||||||
auto s = new TestScript("foobar");
|
auto s = new TestScript("foobar");
|
||||||
set.Add(s);
|
set.Add(s);
|
||||||
REQUIRE(set.Count() == 1);
|
REQUIRE(set.Count() == 1);
|
||||||
auto get = set.GetIterator()->At(0);
|
auto get = set.GetIterator().At(0);
|
||||||
REQUIRE(get->GetName() == "foobar");
|
REQUIRE(get->GetName() == "foobar");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,8 +53,8 @@ TEST_CASE("Add two scripts to script set, then retrieve them", "[Battling, Scrip
|
||||||
set.Add(s);
|
set.Add(s);
|
||||||
set.Add(s2);
|
set.Add(s2);
|
||||||
REQUIRE(set.Count() == 2);
|
REQUIRE(set.Count() == 2);
|
||||||
auto get1 = set.GetIterator()->At(0);
|
auto get1 = set.GetIterator().At(0);
|
||||||
auto get2 = set.GetIterator()->At(1);
|
auto get2 = set.GetIterator().At(1);
|
||||||
REQUIRE(get1->GetName() == "foobar");
|
REQUIRE(get1->GetName() == "foobar");
|
||||||
REQUIRE(get2->GetName() == "foobar2");
|
REQUIRE(get2->GetName() == "foobar2");
|
||||||
}
|
}
|
||||||
|
@ -66,8 +66,8 @@ TEST_CASE("Add script to script set, then remove it", "[Battling, Scripting]") {
|
||||||
REQUIRE(set.Count() == 1);
|
REQUIRE(set.Count() == 1);
|
||||||
set.Remove("foobar"_cnc.GetHash());
|
set.Remove("foobar"_cnc.GetHash());
|
||||||
REQUIRE(set.Count() == 0);
|
REQUIRE(set.Count() == 0);
|
||||||
auto it = set.GetIterator();
|
auto& it = set.GetIterator();
|
||||||
REQUIRE(it->Count() == 0);
|
REQUIRE(it.Count() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Add two scripts to script set, then remove them", "[Battling, Scripting]") {
|
TEST_CASE("Add two scripts to script set, then remove them", "[Battling, Scripting]") {
|
||||||
|
@ -79,8 +79,8 @@ TEST_CASE("Add two scripts to script set, then remove them", "[Battling, Scripti
|
||||||
REQUIRE(set.Count() == 2);
|
REQUIRE(set.Count() == 2);
|
||||||
set.Remove("foobar"_cnc.GetHash());
|
set.Remove("foobar"_cnc.GetHash());
|
||||||
REQUIRE(set.Count() == 1);
|
REQUIRE(set.Count() == 1);
|
||||||
auto it = set.GetIterator();
|
auto& it = set.GetIterator();
|
||||||
REQUIRE(it->At(0)->GetName() == "foobar2");
|
REQUIRE(it.At(0)->GetName() == "foobar2");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue