From bd33fa76b63536398e00ba416d3289a44beaf461 Mon Sep 17 00:00:00 2001 From: elsid Date: Sat, 3 Apr 2021 12:59:44 +0200 Subject: [PATCH] Use CRTP to define CustomData clone function --- apps/openmw/mwclass/container.cpp | 5 ----- apps/openmw/mwclass/container.hpp | 4 +--- apps/openmw/mwclass/creature.cpp | 9 +-------- apps/openmw/mwclass/creaturelevlist.cpp | 9 +-------- apps/openmw/mwclass/door.cpp | 9 +-------- apps/openmw/mwclass/npc.cpp | 9 +-------- apps/openmw/mwworld/customdata.hpp | 9 +++++++++ 7 files changed, 14 insertions(+), 40 deletions(-) diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 2d7f300473..de560608c0 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -46,11 +46,6 @@ namespace MWClass mStore.readState(inventory); } - std::unique_ptr ContainerCustomData::clone() const - { - return std::make_unique(*this); - } - ContainerCustomData& ContainerCustomData::asContainerCustomData() { return *this; diff --git a/apps/openmw/mwclass/container.hpp b/apps/openmw/mwclass/container.hpp index fc3e046f11..1c89370068 100644 --- a/apps/openmw/mwclass/container.hpp +++ b/apps/openmw/mwclass/container.hpp @@ -13,15 +13,13 @@ namespace ESM namespace MWClass { - class ContainerCustomData : public MWWorld::CustomData + class ContainerCustomData : public MWWorld::TypedCustomData { MWWorld::ContainerStore mStore; public: ContainerCustomData(const ESM::Container& container, MWWorld::CellStore* cell); ContainerCustomData(const ESM::InventoryState& inventory); - std::unique_ptr clone() const override; - ContainerCustomData& asContainerCustomData() override; const ContainerCustomData& asContainerCustomData() const override; diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 2a55fb9fd9..6b8d2f3f25 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -51,7 +51,7 @@ namespace namespace MWClass { - class CreatureCustomData : public MWWorld::CustomData + class CreatureCustomData : public MWWorld::TypedCustomData { public: MWMechanics::CreatureStats mCreatureStats; @@ -62,8 +62,6 @@ namespace MWClass CreatureCustomData(const CreatureCustomData& other); CreatureCustomData(CreatureCustomData&& other) noexcept = default; - std::unique_ptr clone() const override; - CreatureCustomData& asCreatureCustomData() override { return *this; @@ -81,11 +79,6 @@ namespace MWClass { } - std::unique_ptr CreatureCustomData::clone() const - { - return std::make_unique(*this); - } - const Creature::GMST& Creature::getGmst() { static GMST gmst; diff --git a/apps/openmw/mwclass/creaturelevlist.cpp b/apps/openmw/mwclass/creaturelevlist.cpp index 3b401f1a3e..f86004c619 100644 --- a/apps/openmw/mwclass/creaturelevlist.cpp +++ b/apps/openmw/mwclass/creaturelevlist.cpp @@ -10,15 +10,13 @@ namespace MWClass { - class CreatureLevListCustomData : public MWWorld::CustomData + class CreatureLevListCustomData : public MWWorld::TypedCustomData { public: // actorId of the creature we spawned int mSpawnActorId; bool mSpawn; // Should a new creature be spawned? - std::unique_ptr clone() const override; - CreatureLevListCustomData& asCreatureLevListCustomData() override { return *this; @@ -29,11 +27,6 @@ namespace MWClass } }; - std::unique_ptr CreatureLevListCustomData::clone() const - { - return std::make_unique(*this); - } - std::string CreatureLevList::getName (const MWWorld::ConstPtr& ptr) const { return ""; diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index ae80855862..3a5ff0d9ae 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -31,13 +31,11 @@ namespace MWClass { - class DoorCustomData : public MWWorld::CustomData + class DoorCustomData : public MWWorld::TypedCustomData { public: MWWorld::DoorState mDoorState = MWWorld::DoorState::Idle; - std::unique_ptr clone() const override; - DoorCustomData& asDoorCustomData() override { return *this; @@ -48,11 +46,6 @@ namespace MWClass } }; - std::unique_ptr DoorCustomData::clone() const - { - return std::make_unique(*this); - } - void Door::insertObjectRendering (const MWWorld::Ptr& ptr, const std::string& model, MWRender::RenderingInterface& renderingInterface) const { if (!model.empty()) diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 248ef5d01e..c5b352cb42 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -246,15 +246,13 @@ namespace namespace MWClass { - class NpcCustomData : public MWWorld::CustomData + class NpcCustomData : public MWWorld::TypedCustomData { public: MWMechanics::NpcStats mNpcStats; MWMechanics::Movement mMovement; MWWorld::InventoryStore mInventoryStore; - std::unique_ptr clone() const override; - NpcCustomData& asNpcCustomData() override { return *this; @@ -265,11 +263,6 @@ namespace MWClass } }; - std::unique_ptr NpcCustomData::clone() const - { - return std::make_unique(*this); - } - const Npc::GMST& Npc::getGmst() { static GMST gmst; diff --git a/apps/openmw/mwworld/customdata.hpp b/apps/openmw/mwworld/customdata.hpp index ee89dd2a8f..7200e7684c 100644 --- a/apps/openmw/mwworld/customdata.hpp +++ b/apps/openmw/mwworld/customdata.hpp @@ -40,6 +40,15 @@ namespace MWWorld virtual MWClass::CreatureLevListCustomData& asCreatureLevListCustomData(); virtual const MWClass::CreatureLevListCustomData& asCreatureLevListCustomData() const; }; + + template + struct TypedCustomData : CustomData + { + std::unique_ptr clone() const final + { + return std::make_unique(*static_cast(this)); + } + }; } #endif