From d4505f42933bd39f3e733cdc201d331af3f39f05 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Fri, 25 Sep 2020 13:33:57 +0200 Subject: [PATCH] Make CreatureSpecies follow PIMPL idiom. Signed-off-by: Deukhoofd --- src/Library/BaseLibrary.hpp | 1 - src/Library/CreatureData/CreatureSpecies.cpp | 131 +++++++++++++++---- src/Library/CreatureData/CreatureSpecies.hpp | 56 +++----- src/Precompiled.hxx | 1 + 4 files changed, 125 insertions(+), 64 deletions(-) diff --git a/src/Library/BaseLibrary.hpp b/src/Library/BaseLibrary.hpp index 7c97ba4..f44e7ea 100644 --- a/src/Library/BaseLibrary.hpp +++ b/src/Library/BaseLibrary.hpp @@ -8,7 +8,6 @@ namespace CreatureLib::Library { protected: ArbUt::Dictionary> _values; ArbUt::List _listValues; - size_t _index; public: BaseLibrary(size_t initialCapacity = 32) : _values(initialCapacity), _listValues(initialCapacity) {} diff --git a/src/Library/CreatureData/CreatureSpecies.cpp b/src/Library/CreatureData/CreatureSpecies.cpp index 0f73888..35cdad4 100644 --- a/src/Library/CreatureData/CreatureSpecies.cpp +++ b/src/Library/CreatureData/CreatureSpecies.cpp @@ -2,36 +2,119 @@ using namespace CreatureLib::Library; +struct CreatureSpecies::impl { + const ArbUt::StringView _name; + uint16_t _id; + float _genderRate; + const ArbUt::StringView _growthRate; + uint8_t _captureRate; + + ArbUt::Dictionary> _variantsLookup; + ArbUt::List> _variantsList; + std::unordered_set _flags; + + impl(uint16_t id, const ArbUt::StringView& name, const SpeciesVariant* defaultVariant, float genderRatio, + const ArbUt::StringView& growthRate, uint8_t captureRate, std::unordered_set flags) + : _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate), + _variantsLookup(1), _variantsList(1), _flags(std::move(flags)) { + AssertNotNull(defaultVariant) + SetVariant("default"_cnc, defaultVariant); + } + + ~impl() { _variantsLookup.Clear(); } + + inline uint16_t GetId() const noexcept { return _id; } + inline float GetGenderRate() const noexcept { return _genderRate; } + inline const ArbUt::StringView& GetGrowthRate() const noexcept { return _growthRate; } + inline uint8_t GetCaptureRate() const noexcept { return _captureRate; } + + [[nodiscard]] inline bool HasVariant(const ArbUt::BasicStringView& key) const noexcept { + return _variantsLookup.Has(key); + } + [[nodiscard]] inline bool HasVariant(uint32_t hash) const noexcept { return _variantsLookup.Has(hash); } + [[nodiscard]] inline bool TryGetVariant(const ArbUt::BasicStringView& name, + ArbUt::BorrowedPtr& out) const noexcept { + return TryGetVariant(name.GetHash(), out); + } + [[nodiscard]] bool TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr& out) const noexcept { + auto find = _variantsLookup.GetStdMap().find(hash); + if (find == _variantsLookup.end()) + return false; + out = std::get<1>(*find); + return true; + } + [[nodiscard]] inline ArbUt::BorrowedPtr GetVariant(const ArbUt::BasicStringView& key) const { + return _variantsLookup.Get(key); + } + [[nodiscard]] inline ArbUt::BorrowedPtr GetVariant(uint32_t key) const { + return _variantsLookup.Get(key); + } + [[nodiscard]] Gender GetRandomGender(ArbUt::Random& rand) const noexcept { + if (this->_genderRate == -1) { + return Gender::Genderless; + } + auto val = rand.GetDouble(); + if (val >= this->_genderRate) + return Gender ::Female; + return Gender ::Male; + } + [[nodiscard]] inline const ArbUt::StringView& GetName() const noexcept { return _name; } + + void SetVariant(const ArbUt::StringView& name, const SpeciesVariant* variant) { + Assert(!name.IsEmpty()) + AssertNotNull(variant) + _variantsList.CreateBack(variant); + _variantsLookup.GetStdMap().insert({name, std::unique_ptr(variant)}); + } + + inline const ArbUt::List>& GetVariantsIterator() const { + return _variantsList; + } + + inline bool HasFlag(const ArbUt::StringView& key) const noexcept { + return this->_flags.find(key) != this->_flags.end(); + } + inline bool HasFlag(uint32_t keyHash) const noexcept { return this->_flags.find(keyHash) != this->_flags.end(); } +}; + CreatureSpecies::CreatureSpecies(uint16_t id, const ArbUt::StringView& name, const SpeciesVariant* defaultVariant, float genderRatio, const ArbUt::StringView& growthRate, uint8_t captureRate, std::unordered_set flags) - : _name(name), _id(id), _genderRate(genderRatio), _growthRate(growthRate), _captureRate(captureRate), - _variantsLookup(1), _variantsList(1), _flags(std::move(flags)) { - AssertNotNull(defaultVariant) - SetVariant("default"_cnc, defaultVariant); -} + : _impl(new impl(id, name, defaultVariant, genderRatio, growthRate, captureRate, flags)) {} +#define ImplGetter(type, func) \ + type CreatureSpecies::func() const noexcept { return _impl->func(); } + +CreatureSpecies::~CreatureSpecies() = default; +ImplGetter(uint16_t, GetId); +ImplGetter(float, GetGenderRate); +ImplGetter(const ArbUt::StringView&, GetGrowthRate); +ImplGetter(uint8_t, GetCaptureRate); +ImplGetter(const ArbUt::StringView&, GetName); + +bool CreatureSpecies::HasVariant(const ArbUt::BasicStringView& key) const noexcept { return _impl->HasVariant(key); } +bool CreatureSpecies::HasVariant(uint32_t hash) const noexcept { return _impl->HasVariant(hash); } + +bool CreatureSpecies::TryGetVariant(const ArbUt::BasicStringView& name, + ArbUt::BorrowedPtr& out) const noexcept { + return _impl->TryGetVariant(name, out); +} bool CreatureSpecies::TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr& out) const noexcept { - auto find = _variantsLookup.GetStdMap().find(hash); - if (find == _variantsLookup.end()) - return false; - out = std::get<1>(*find); - return true; + return _impl->TryGetVariant(hash, out); } - +ArbUt::BorrowedPtr CreatureSpecies::GetVariant(const ArbUt::BasicStringView& key) const { + return _impl->GetVariant(key); +} +ArbUt::BorrowedPtr CreatureSpecies::GetVariant(uint32_t key) const { + return _impl->GetVariant(key); +} +Gender CreatureSpecies::GetRandomGender(ArbUt::Random& rand) const noexcept { return _impl->GetRandomGender(rand); } void CreatureSpecies::SetVariant(const ArbUt::StringView& name, const SpeciesVariant* variant) { - Assert(!name.IsEmpty()) - AssertNotNull(variant) - _variantsList.CreateBack(variant); - _variantsLookup.GetStdMap().insert({name, std::unique_ptr(variant)}); + _impl->SetVariant(name, variant); +} +const ArbUt::List>& CreatureSpecies::GetVariantsIterator() const { + return _impl->GetVariantsIterator(); } -Gender CreatureSpecies::GetRandomGender(ArbUt::Random& rand) const noexcept { - if (this->_genderRate == -1) { - return Gender::Genderless; - } - auto val = rand.GetDouble(); - if (val >= this->_genderRate) - return Gender ::Female; - return Gender ::Male; -} \ No newline at end of file +bool CreatureSpecies::HasFlag(const ArbUt::StringView& key) const noexcept { return _impl->HasFlag(key); } +bool CreatureSpecies::HasFlag(uint32_t keyHash) const noexcept { return _impl->HasFlag(keyHash); } diff --git a/src/Library/CreatureData/CreatureSpecies.hpp b/src/Library/CreatureData/CreatureSpecies.hpp index e63b1d9..0369aba 100644 --- a/src/Library/CreatureData/CreatureSpecies.hpp +++ b/src/Library/CreatureData/CreatureSpecies.hpp @@ -10,59 +10,37 @@ namespace CreatureLib::Library { creatures with. */ class CreatureSpecies { - const ArbUt::StringView _name; - uint16_t _id; - float _genderRate; - const ArbUt::StringView _growthRate; - uint8_t _captureRate; - - ArbUt::Dictionary> _variantsLookup; - ArbUt::List> _variantsList; - std::unordered_set _flags; + struct impl; + std::unique_ptr _impl; public: CreatureSpecies(uint16_t id, const ArbUt::StringView& name, const SpeciesVariant* defaultVariant, float genderRatio, const ArbUt::StringView& growthRate, uint8_t captureRate, std::unordered_set flags = {}); - virtual ~CreatureSpecies() noexcept { _variantsLookup.Clear(); } + virtual ~CreatureSpecies(); - inline uint16_t GetId() const noexcept { return _id; } - inline float GetGenderRate() const noexcept { return _genderRate; } - inline const ArbUt::StringView& GetGrowthRate() const noexcept { return _growthRate; } - inline uint8_t GetCaptureRate() const noexcept { return _captureRate; } + uint16_t GetId() const noexcept; + float GetGenderRate() const noexcept; + const ArbUt::StringView& GetGrowthRate() const noexcept; + uint8_t GetCaptureRate() const noexcept; - [[nodiscard]] inline bool HasVariant(const ArbUt::BasicStringView& key) const noexcept { - return _variantsLookup.Has(key); - } - [[nodiscard]] inline bool HasVariant(uint32_t hash) const noexcept { return _variantsLookup.Has(hash); } - [[nodiscard]] inline bool TryGetVariant(const ArbUt::BasicStringView& name, - ArbUt::BorrowedPtr& out) const noexcept { - return TryGetVariant(name.GetHash(), out); - } + [[nodiscard]] bool HasVariant(const ArbUt::BasicStringView& key) const noexcept; + [[nodiscard]] bool HasVariant(uint32_t hash) const noexcept; + [[nodiscard]] bool TryGetVariant(const ArbUt::BasicStringView& name, + ArbUt::BorrowedPtr& out) const noexcept; [[nodiscard]] bool TryGetVariant(uint32_t hash, ArbUt::BorrowedPtr& out) const noexcept; - [[nodiscard]] inline ArbUt::BorrowedPtr - GetVariant(const ArbUt::BasicStringView& key) const { - return _variantsLookup.Get(key); - } - [[nodiscard]] inline ArbUt::BorrowedPtr GetVariant(uint32_t key) const { - return _variantsLookup.Get(key); - } + [[nodiscard]] ArbUt::BorrowedPtr GetVariant(const ArbUt::BasicStringView& key) const; + [[nodiscard]] ArbUt::BorrowedPtr GetVariant(uint32_t key) const; [[nodiscard]] Gender GetRandomGender(ArbUt::Random& rand) const noexcept; - [[nodiscard]] inline const ArbUt::StringView& GetName() const { return _name; } + [[nodiscard]] const ArbUt::StringView& GetName() const noexcept; void SetVariant(const ArbUt::StringView& name, const SpeciesVariant* variant); - inline const ArbUt::List>& GetVariantsIterator() const { - return _variantsList; - } + const ArbUt::List>& GetVariantsIterator() const; - inline bool HasFlag(const ArbUt::StringView& key) const noexcept { - return this->_flags.find(key) != this->_flags.end(); - } - inline bool HasFlag(uint32_t keyHash) const noexcept { - return this->_flags.find(keyHash) != this->_flags.end(); - } + bool HasFlag(const ArbUt::StringView& key) const noexcept; + bool HasFlag(uint32_t keyHash) const noexcept; }; } diff --git a/src/Precompiled.hxx b/src/Precompiled.hxx index 7166686..5a08e73 100644 --- a/src/Precompiled.hxx +++ b/src/Precompiled.hxx @@ -1,6 +1,7 @@ #ifndef CREATURELIB_PRECOMPILED_HXX #define CREATURELIB_PRECOMPILED_HXX +// std #include #include #include