diff --git a/apps/openmw/mwmechanics/aisequence.cpp b/apps/openmw/mwmechanics/aisequence.cpp index fc91ce0c42..a9de4a5152 100644 --- a/apps/openmw/mwmechanics/aisequence.cpp +++ b/apps/openmw/mwmechanics/aisequence.cpp @@ -419,9 +419,9 @@ void AiSequence::stack (const AiPackage& package, const MWWorld::Ptr& actor, boo // Make sure that temporary storage is empty if (cancelOther) { - mAiState.moveIn(new AiCombatStorage()); - mAiState.moveIn(new AiFollowStorage()); - mAiState.moveIn(new AiWanderStorage()); + mAiState.moveIn(std::make_unique()); + mAiState.moveIn(std::make_unique()); + mAiState.moveIn(std::make_unique()); } } diff --git a/apps/openmw/mwmechanics/aistate.hpp b/apps/openmw/mwmechanics/aistate.hpp index ca90029e47..ca05c44b36 100644 --- a/apps/openmw/mwmechanics/aistate.hpp +++ b/apps/openmw/mwmechanics/aistate.hpp @@ -4,6 +4,8 @@ #include "aistatefwd.hpp" #include "aitemporarybase.hpp" +#include + namespace MWMechanics { @@ -14,28 +16,24 @@ namespace MWMechanics */ template< class Base > class DerivedClassStorage - { + { private: - Base* mStorage; - - //if needed you have to provide a clone member function - DerivedClassStorage( const DerivedClassStorage& other ); - DerivedClassStorage& operator=( const DerivedClassStorage& ); - + std::unique_ptr mStorage; + public: /// \brief returns reference to stored object or deletes it and creates a fitting template< class Derived > Derived& get() { - Derived* result = dynamic_cast(mStorage); - - if(!result) + Derived* result = dynamic_cast(mStorage.get()); + + if (result == nullptr) { - if(mStorage) - delete mStorage; - mStorage = result = new Derived(); + auto storage = std::make_unique(); + result = storage.get(); + mStorage = std::move(storage); } - + //return a reference to the (new allocated) object return *result; } @@ -43,33 +41,22 @@ namespace MWMechanics template< class Derived > void copy(DerivedClassStorage& destination) const { - Derived* result = dynamic_cast(mStorage); + Derived* result = dynamic_cast(mStorage.get()); if (result != nullptr) destination.store(*result); } - + template< class Derived > void store( const Derived& payload ) { - if(mStorage) - delete mStorage; - mStorage = new Derived(payload); - } - - /// \brief takes ownership of the passed object - template< class Derived > - void moveIn( Derived* p ) - { - if(mStorage) - delete mStorage; - mStorage = p; + mStorage = std::make_unique(payload); } - DerivedClassStorage():mStorage(nullptr){} - ~DerivedClassStorage() + /// \brief takes ownership of the passed object + template + void moveIn(std::unique_ptr&& storage) { - if(mStorage) - delete mStorage; + mStorage = std::move(storage); } }; } diff --git a/apps/openmw/mwmechanics/aiwander.cpp b/apps/openmw/mwmechanics/aiwander.cpp index f6c46945b1..777e86955d 100644 --- a/apps/openmw/mwmechanics/aiwander.cpp +++ b/apps/openmw/mwmechanics/aiwander.cpp @@ -767,7 +767,7 @@ namespace MWMechanics ToWorldCoordinates(dest, actor.getCell()->getCell()); - state.moveIn(new AiWanderStorage()); + state.moveIn(std::make_unique()); osg::Vec3f pos(static_cast(dest.mX), static_cast(dest.mY), static_cast(dest.mZ)); MWBase::Environment::get().getWorld()->moveObject(actor, pos);