From 5f341ffbb794e9fb4be1a54a8300c3d956ea17b9 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 29 Feb 2020 17:00:29 +0100 Subject: [PATCH] Use hash as key for Species variants, added C interface for Species. --- CInterface/Library/CreatureSpecies.cpp | 53 ++++++++++++++++++++ src/Library/CreatureData/CreatureSpecies.cpp | 14 +++--- src/Library/CreatureData/CreatureSpecies.hpp | 7 ++- 3 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 CInterface/Library/CreatureSpecies.cpp diff --git a/CInterface/Library/CreatureSpecies.cpp b/CInterface/Library/CreatureSpecies.cpp new file mode 100644 index 0000000..174db1a --- /dev/null +++ b/CInterface/Library/CreatureSpecies.cpp @@ -0,0 +1,53 @@ +#include "../../src/Library/CreatureData/CreatureSpecies.hpp" +#define export extern "C" + +export CreatureLib::Library::CreatureSpecies* +CreatureLib_CreatureSpecies_Construct(uint16_t id, const char* name, + CreatureLib::Library::SpeciesVariant* defaultVariant, float genderRatio, + const char* growthRate, uint8_t captureRate) { + return new CreatureLib::Library::CreatureSpecies(id, Arbutils::CaseInsensitiveConstString(name), defaultVariant, + genderRatio, Arbutils::CaseInsensitiveConstString(growthRate), + captureRate); +} + +export void CreatureLib_CreatureSpecies_Destruct(const CreatureLib::Library::CreatureSpecies* p) { delete p; } + +#define SIMPLE_GET_FUNC(type, name, returnType) \ + export returnType CreatureLib_##type##_##name(const CreatureLib::Library::type* p) { return p->name(); } + +SIMPLE_GET_FUNC(CreatureSpecies, GetId, uint16_t); +SIMPLE_GET_FUNC(CreatureSpecies, GetGenderRate, float); +SIMPLE_GET_FUNC(CreatureSpecies, GetCaptureRate, uint8_t); +export const char* CreatureLib_CreatureSpecies_GetName(const CreatureLib::Library::CreatureSpecies* p) { + return p->GetName().c_str(); +} +export const char* CreatureLib_CreatureSpecies_GetGrowthRate(const CreatureLib::Library::CreatureSpecies* p) { + return p->GetGrowthRate().c_str(); +} +export bool CreatureLib_CreatureSpecies_HasVariant(const CreatureLib::Library::CreatureSpecies* p, const char* name) { + return p->HasVariant(Arbutils::CaseInsensitiveConstString::GetHash(name)); +} +export bool CreatureLib_CreatureSpecies_HasVariantWithHash(const CreatureLib::Library::CreatureSpecies* p, + uint32_t hash) { + return p->HasVariant(hash); +} +export bool CreatureLib_CreatureSpecies_TryGetVariant(const CreatureLib::Library::CreatureSpecies* p, const char* name, + const CreatureLib::Library::SpeciesVariant* out) { + return p->TryGetVariant(Arbutils::CaseInsensitiveConstString::GetHash(name), out); +} +export bool CreatureLib_CreatureSpecies_TryGetVariantWithHash(const CreatureLib::Library::CreatureSpecies* p, + uint32_t hash, + const CreatureLib::Library::SpeciesVariant* out) { + return p->TryGetVariant(hash, out); +} + +export const CreatureLib::Library::SpeciesVariant* +CreatureLib_CreatureSpecies_GetVariant(const CreatureLib::Library::CreatureSpecies* p, const char* name) { + return p->GetVariant(Arbutils::CaseInsensitiveConstString::GetHash(name)); +} +export const CreatureLib::Library::SpeciesVariant* +CreatureLib_CreatureSpecies_GetVariantWithHash(const CreatureLib::Library::CreatureSpecies* p, uint32_t hash) { + return p->GetVariant(hash); +} + +#undef SIMPLE_GET_FUNC \ No newline at end of file diff --git a/src/Library/CreatureData/CreatureSpecies.cpp b/src/Library/CreatureData/CreatureSpecies.cpp index 9b9360d..c517b17 100644 --- a/src/Library/CreatureData/CreatureSpecies.cpp +++ b/src/Library/CreatureData/CreatureSpecies.cpp @@ -10,7 +10,10 @@ CreatureSpecies::CreatureSpecies(uint16_t id, const ConstString& name, const Spe bool CreatureSpecies::HasVariant(const ConstString& name) const { return _variants.find(name) != _variants.end(); } bool CreatureSpecies::TryGetVariant(const ConstString& name, const SpeciesVariant*& out) const { - auto find = _variants.find(name); + return TryGetVariant(name.GetHash(), out); +} +bool CreatureSpecies::TryGetVariant(uint32_t hash, const SpeciesVariant*& out) const { + auto find = _variants.find(hash); if (find != _variants.end()) { out = find->second; return true; @@ -18,10 +21,9 @@ bool CreatureSpecies::TryGetVariant(const ConstString& name, const SpeciesVarian return false; } -const SpeciesVariant* CreatureSpecies::GetVariant(const ConstString& name) const { - auto key = name; - return _variants.at(key); -} +const SpeciesVariant* CreatureSpecies::GetVariant(const ConstString& name) const { return _variants.at(name); } +const SpeciesVariant* CreatureSpecies::GetVariant(uint32_t key) const { return _variants.at(key); } +bool CreatureSpecies::HasVariant(uint32_t hash) const { return _variants.at(hash); } void CreatureSpecies::SetVariant(const ConstString& name, const SpeciesVariant* variant) { auto find = _variants.find(name); @@ -37,4 +39,4 @@ Gender CreatureSpecies::GetRandomGender(Arbutils::Random& rand) const { if (val >= this->_genderRate) return Gender ::Female; return Gender ::Male; -} \ No newline at end of file +} diff --git a/src/Library/CreatureData/CreatureSpecies.hpp b/src/Library/CreatureData/CreatureSpecies.hpp index 657a004..04600dd 100644 --- a/src/Library/CreatureData/CreatureSpecies.hpp +++ b/src/Library/CreatureData/CreatureSpecies.hpp @@ -20,7 +20,7 @@ namespace CreatureLib::Library { float _genderRate; const ConstString _growthRate; uint8_t _captureRate; - std::unordered_map _variants; + std::unordered_map _variants; public: CreatureSpecies(uint16_t id, const ConstString& name, const SpeciesVariant* defaultVariant, float genderRatio, @@ -38,14 +38,17 @@ namespace CreatureLib::Library { inline uint8_t GetCaptureRate() const { return _captureRate; } [[nodiscard]] bool HasVariant(const ConstString& key) const; + [[nodiscard]] bool HasVariant(uint32_t hash) const; [[nodiscard]] bool TryGetVariant(const ConstString& name, const SpeciesVariant*& out) const; + [[nodiscard]] bool TryGetVariant(uint32_t hash, const SpeciesVariant*& out) const; [[nodiscard]] const SpeciesVariant* GetVariant(const ConstString& key) const; + [[nodiscard]] const SpeciesVariant* GetVariant(uint32_t key) const; [[nodiscard]] Gender GetRandomGender(Arbutils::Random& rand) const; [[nodiscard]] const ConstString& GetName() const { return _name; } void SetVariant(const ConstString& name, const SpeciesVariant* variant); - const std::unordered_map& GetVariantsIterator() const { return _variants; } + const std::unordered_map& GetVariantsIterator() const { return _variants; } }; }