Use unique_ptr to manage AiPackage lifetime

C++20
elsid 2 years ago
parent 09b1aca9bd
commit 595c2e0a8e
No known key found for this signature in database
GPG Key ID: B845CB9FEE18AB40

@ -52,8 +52,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Activate;
package.mPackage = activate.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(activate);
sequence.mPackages.push_back(std::move(package));
}
AiActivate::AiActivate(const ESM::AiSequence::AiActivate *activate)

@ -460,8 +460,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Combat;
package.mPackage = combat.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(combat);
sequence.mPackages.push_back(std::move(package));
}
void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target)

@ -109,8 +109,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Escort;
package.mPackage = escort.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(escort);
sequence.mPackages.push_back(std::move(package));
}
void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state)

@ -217,8 +217,8 @@ void AiFollow::writeState(ESM::AiSequence::AiSequence &sequence) const
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Follow;
package.mPackage = follow.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(follow);
sequence.mPackages.push_back(std::move(package));
}
int AiFollow::getFollowIndex() const

@ -81,8 +81,8 @@ void AiPursue::writeState(ESM::AiSequence::AiSequence &sequence) const
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Pursue;
package.mPackage = pursue.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(pursue);
sequence.mPackages.push_back(std::move(package));
}
} // namespace MWMechanics

@ -498,41 +498,41 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence)
{
case ESM::AiSequence::Ai_Wander:
{
package.reset(new AiWander(static_cast<ESM::AiSequence::AiWander*>(container.mPackage)));
package.reset(new AiWander(&static_cast<const ESM::AiSequence::AiWander&>(*container.mPackage)));
break;
}
case ESM::AiSequence::Ai_Travel:
{
const auto source = static_cast<const ESM::AiSequence::AiTravel*>(container.mPackage);
if (source->mHidden)
package.reset(new AiInternalTravel(source));
const ESM::AiSequence::AiTravel& source = static_cast<const ESM::AiSequence::AiTravel&>(*container.mPackage);
if (source.mHidden)
package.reset(new AiInternalTravel(&source));
else
package.reset(new AiTravel(source));
package.reset(new AiTravel(&source));
break;
}
case ESM::AiSequence::Ai_Escort:
{
package.reset(new AiEscort(static_cast<ESM::AiSequence::AiEscort*>(container.mPackage)));
package.reset(new AiEscort(&static_cast<const ESM::AiSequence::AiEscort&>(*container.mPackage)));
break;
}
case ESM::AiSequence::Ai_Follow:
{
package.reset(new AiFollow(static_cast<ESM::AiSequence::AiFollow*>(container.mPackage)));
package.reset(new AiFollow(&static_cast<const ESM::AiSequence::AiFollow&>(*container.mPackage)));
break;
}
case ESM::AiSequence::Ai_Activate:
{
package.reset(new AiActivate(static_cast<ESM::AiSequence::AiActivate*>(container.mPackage)));
package.reset(new AiActivate(&static_cast<const ESM::AiSequence::AiActivate&>(*container.mPackage)));
break;
}
case ESM::AiSequence::Ai_Combat:
{
package.reset(new AiCombat(static_cast<ESM::AiSequence::AiCombat*>(container.mPackage)));
package.reset(new AiCombat(&static_cast<const ESM::AiSequence::AiCombat&>(*container.mPackage)));
break;
}
case ESM::AiSequence::Ai_Pursue:
{
package.reset(new AiPursue(static_cast<ESM::AiSequence::AiPursue*>(container.mPackage)));
package.reset(new AiPursue(&static_cast<const ESM::AiSequence::AiPursue&>(*container.mPackage)));
break;
}
default:

@ -129,8 +129,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Travel;
package.mPackage = travel.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(travel);
sequence.mPackages.push_back(std::move(package));
}
AiInternalTravel::AiInternalTravel(float x, float y, float z)

@ -888,8 +888,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Wander;
package.mPackage = wander.release();
sequence.mPackages.push_back(package);
package.mPackage = std::move(wander);
sequence.mPackages.push_back(std::move(package));
}
AiWander::AiWander (const ESM::AiSequence::AiWander* wander)

@ -152,12 +152,6 @@ namespace AiSequence
esm.writeHNT ("TARG", mTargetActorId);
}
AiSequence::~AiSequence()
{
for (std::vector<AiPackageContainer>::iterator it = mPackages.begin(); it != mPackages.end(); ++it)
delete it->mPackage;
}
void AiSequence::save(ESMWriter &esm) const
{
for (std::vector<AiPackageContainer>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it)
@ -166,25 +160,25 @@ namespace AiSequence
switch (it->mType)
{
case Ai_Wander:
static_cast<const AiWander*>(it->mPackage)->save(esm);
static_cast<const AiWander&>(*it->mPackage).save(esm);
break;
case Ai_Travel:
static_cast<const AiTravel*>(it->mPackage)->save(esm);
static_cast<const AiTravel&>(*it->mPackage).save(esm);
break;
case Ai_Escort:
static_cast<const AiEscort*>(it->mPackage)->save(esm);
static_cast<const AiEscort&>(*it->mPackage).save(esm);
break;
case Ai_Follow:
static_cast<const AiFollow*>(it->mPackage)->save(esm);
static_cast<const AiFollow&>(*it->mPackage).save(esm);
break;
case Ai_Activate:
static_cast<const AiActivate*>(it->mPackage)->save(esm);
static_cast<const AiActivate&>(*it->mPackage).save(esm);
break;
case Ai_Combat:
static_cast<const AiCombat*>(it->mPackage)->save(esm);
static_cast<const AiCombat&>(*it->mPackage).save(esm);
break;
case Ai_Pursue:
static_cast<const AiPursue*>(it->mPackage)->save(esm);
static_cast<const AiPursue&>(*it->mPackage).save(esm);
break;
default:
@ -212,7 +206,7 @@ namespace AiSequence
{
std::unique_ptr<AiWander> ptr = std::make_unique<AiWander>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
++count;
break;
}
@ -220,7 +214,7 @@ namespace AiSequence
{
std::unique_ptr<AiTravel> ptr = std::make_unique<AiTravel>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
++count;
break;
}
@ -228,7 +222,7 @@ namespace AiSequence
{
std::unique_ptr<AiEscort> ptr = std::make_unique<AiEscort>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
++count;
break;
}
@ -236,7 +230,7 @@ namespace AiSequence
{
std::unique_ptr<AiFollow> ptr = std::make_unique<AiFollow>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
++count;
break;
}
@ -244,7 +238,7 @@ namespace AiSequence
{
std::unique_ptr<AiActivate> ptr = std::make_unique<AiActivate>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
++count;
break;
}
@ -252,14 +246,14 @@ namespace AiSequence
{
std::unique_ptr<AiCombat> ptr = std::make_unique<AiCombat>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
break;
}
case Ai_Pursue:
{
std::unique_ptr<AiPursue> ptr = std::make_unique<AiPursue>();
ptr->load(esm);
mPackages.back().mPackage = ptr.release();
mPackages.back().mPackage = std::move(ptr);
break;
}
default:
@ -274,15 +268,15 @@ namespace AiSequence
for(auto& pkg : mPackages)
{
if(pkg.mType == Ai_Wander)
static_cast<AiWander*>(pkg.mPackage)->mData.mShouldRepeat = true;
static_cast<AiWander&>(*pkg.mPackage).mData.mShouldRepeat = true;
else if(pkg.mType == Ai_Travel)
static_cast<AiTravel*>(pkg.mPackage)->mRepeat = true;
static_cast<AiTravel&>(*pkg.mPackage).mRepeat = true;
else if(pkg.mType == Ai_Escort)
static_cast<AiEscort*>(pkg.mPackage)->mRepeat = true;
static_cast<AiEscort&>(*pkg.mPackage).mRepeat = true;
else if(pkg.mType == Ai_Follow)
static_cast<AiFollow*>(pkg.mPackage)->mRepeat = true;
static_cast<AiFollow&>(*pkg.mPackage).mRepeat = true;
else if(pkg.mType == Ai_Activate)
static_cast<AiActivate*>(pkg.mPackage)->mRepeat = true;
static_cast<AiActivate&>(*pkg.mPackage).mRepeat = true;
}
}
}

@ -3,6 +3,7 @@
#include <vector>
#include <string>
#include <memory>
#include "components/esm/defs.hpp"
@ -149,7 +150,7 @@ namespace ESM
{
int mType;
AiPackage* mPackage;
std::unique_ptr<AiPackage> mPackage;
};
struct AiSequence
@ -158,7 +159,6 @@ namespace ESM
{
mLastAiPackage = -1;
}
~AiSequence();
std::vector<AiPackageContainer> mPackages;
int mLastAiPackage;

Loading…
Cancel
Save