mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-05 00:49:09 +02:00
Use small vector for unit list
This commit is contained in:
@ -92,8 +92,8 @@ void DamageCache::buildDamageCache(std::shared_ptr<HypotheticBattle> hb, BattleS
|
||||
return u->isValidTarget();
|
||||
});
|
||||
|
||||
std::vector<const battle::Unit *> ourUnits;
|
||||
std::vector<const battle::Unit *> enemyUnits;
|
||||
battle::Units ourUnits;
|
||||
battle::Units enemyUnits;
|
||||
|
||||
for(auto stack : stacks)
|
||||
{
|
||||
@ -346,9 +346,9 @@ AttackPossibility AttackPossibility::evaluate(
|
||||
if (!attackInfo.shooting)
|
||||
ap.attackerState->setPosition(hex);
|
||||
|
||||
std::vector<const battle::Unit *> defenderUnits;
|
||||
std::vector<const battle::Unit *> retaliatedUnits = {attacker};
|
||||
std::vector<const battle::Unit *> affectedUnits;
|
||||
battle::Units defenderUnits;
|
||||
battle::Units retaliatedUnits = {attacker};
|
||||
battle::Units affectedUnits;
|
||||
|
||||
if (attackInfo.shooting)
|
||||
defenderUnits = state->getAttackedBattleUnits(attacker, defender, defHex, true, hex, defender->getPosition());
|
||||
|
@ -471,10 +471,10 @@ MoveTarget BattleExchangeEvaluator::findMoveTowardsUnreachable(
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<const battle::Unit *> BattleExchangeEvaluator::getAdjacentUnits(const battle::Unit * blockerUnit) const
|
||||
battle::Units BattleExchangeEvaluator::getAdjacentUnits(const battle::Unit * blockerUnit) const
|
||||
{
|
||||
std::queue<const battle::Unit *> queue;
|
||||
std::vector<const battle::Unit *> checkedStacks;
|
||||
battle::Units checkedStacks;
|
||||
|
||||
queue.push(blockerUnit);
|
||||
|
||||
@ -506,7 +506,7 @@ ReachabilityData BattleExchangeEvaluator::getExchangeUnits(
|
||||
uint8_t turn,
|
||||
PotentialTargets & targets,
|
||||
std::shared_ptr<HypotheticBattle> hb,
|
||||
std::vector<const battle::Unit *> additionalUnits) const
|
||||
battle::Units additionalUnits) const
|
||||
{
|
||||
ReachabilityData result;
|
||||
|
||||
@ -515,7 +515,7 @@ ReachabilityData BattleExchangeEvaluator::getExchangeUnits(
|
||||
if(!ap.attack.shooting)
|
||||
hexes.insert(ap.from);
|
||||
|
||||
std::vector<const battle::Unit *> allReachableUnits = additionalUnits;
|
||||
battle::Units allReachableUnits = additionalUnits;
|
||||
|
||||
for(auto hex : hexes)
|
||||
{
|
||||
@ -636,7 +636,7 @@ BattleScore BattleExchangeEvaluator::calculateExchange(
|
||||
PotentialTargets & targets,
|
||||
DamageCache & damageCache,
|
||||
std::shared_ptr<HypotheticBattle> hb,
|
||||
std::vector<const battle::Unit *> additionalUnits) const
|
||||
battle::Units additionalUnits) const
|
||||
{
|
||||
#if BATTLE_TRACE_LEVEL>=1
|
||||
logAi->trace("Battle exchange at %d", ap.attack.shooting ? ap.dest.hex : ap.from.hex);
|
||||
@ -649,8 +649,8 @@ BattleScore BattleExchangeEvaluator::calculateExchange(
|
||||
return BattleScore(EvaluationResult::INEFFECTIVE_SCORE, 0);
|
||||
}
|
||||
|
||||
std::vector<const battle::Unit *> ourStacks;
|
||||
std::vector<const battle::Unit *> enemyStacks;
|
||||
battle::Units ourStacks;
|
||||
battle::Units enemyStacks;
|
||||
|
||||
if(hb->battleGetUnitByID(ap.attack.defender->unitId())->alive())
|
||||
enemyStacks.push_back(ap.attack.defender);
|
||||
|
@ -112,13 +112,13 @@ private:
|
||||
|
||||
struct ReachabilityData
|
||||
{
|
||||
std::map<int, std::vector<const battle::Unit *>> units;
|
||||
std::map<int, battle::Units> units;
|
||||
|
||||
// shooters which are within mellee attack and mellee units
|
||||
std::vector<const battle::Unit *> melleeAccessible;
|
||||
battle::Units melleeAccessible;
|
||||
|
||||
// far shooters
|
||||
std::vector<const battle::Unit *> shooters;
|
||||
battle::Units shooters;
|
||||
|
||||
std::set<uint32_t> enemyUnitsReachingAttacker;
|
||||
};
|
||||
@ -158,7 +158,7 @@ private:
|
||||
PotentialTargets & targets,
|
||||
DamageCache & damageCache,
|
||||
std::shared_ptr<HypotheticBattle> hb,
|
||||
std::vector<const battle::Unit *> additionalUnits = {}) const;
|
||||
battle::Units additionalUnits = {}) const;
|
||||
|
||||
bool canBeHitThisTurn(const AttackPossibility & ap);
|
||||
|
||||
@ -193,7 +193,7 @@ public:
|
||||
uint8_t turn,
|
||||
PotentialTargets & targets,
|
||||
std::shared_ptr<HypotheticBattle> hb,
|
||||
std::vector<const battle::Unit *> additionalUnits = {}) const;
|
||||
battle::Units additionalUnits = {}) const;
|
||||
|
||||
bool checkPositionBlocksOurStacks(HypotheticBattle & hb, const battle::Unit * unit, BattleHex position);
|
||||
|
||||
@ -203,7 +203,7 @@ public:
|
||||
DamageCache & damageCache,
|
||||
std::shared_ptr<HypotheticBattle> hb);
|
||||
|
||||
std::vector<const battle::Unit *> getAdjacentUnits(const battle::Unit * unit) const;
|
||||
battle::Units getAdjacentUnits(const battle::Unit * unit) const;
|
||||
|
||||
float getPositiveEffectMultiplier() const { return 1; }
|
||||
float getNegativeEffectMultiplier() const { return negativeEffectMultiplier; }
|
||||
|
@ -14,7 +14,7 @@ class PotentialTargets
|
||||
{
|
||||
public:
|
||||
std::vector<AttackPossibility> possibleAttacks;
|
||||
std::vector<const battle::Unit *> unreachableEnemies;
|
||||
battle::Units unreachableEnemies;
|
||||
|
||||
PotentialTargets(){};
|
||||
PotentialTargets(
|
||||
|
8
Global.h
8
Global.h
@ -670,15 +670,15 @@ namespace vstd
|
||||
return false;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void removeDuplicates(std::vector<T> &vec)
|
||||
template <typename Container>
|
||||
void removeDuplicates(Container &vec)
|
||||
{
|
||||
std::sort(vec.begin(), vec.end());
|
||||
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void concatenate(std::vector<T> &dest, const std::vector<T> &src)
|
||||
template <typename Container>
|
||||
void concatenate(Container &dest, const Container &src)
|
||||
{
|
||||
dest.reserve(dest.size() + src.size());
|
||||
dest.insert(dest.end(), src.begin(), src.end());
|
||||
|
@ -22,6 +22,7 @@ class SpellSchool;
|
||||
namespace battle
|
||||
{
|
||||
class Unit;
|
||||
using Units = boost::container::small_vector<const Unit *, 4>;
|
||||
}
|
||||
|
||||
namespace spells
|
||||
@ -65,7 +66,7 @@ public:
|
||||
virtual void getCasterName(MetaString & text) const = 0;
|
||||
|
||||
///full default text
|
||||
virtual void getCastDescription(const Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const = 0;
|
||||
virtual void getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const = 0;
|
||||
|
||||
virtual void spendMana(ServerCallback * server, const int32_t spellCost) const = 0;
|
||||
|
||||
|
@ -27,7 +27,7 @@ BattleStateInfoForRetreat::BattleStateInfoForRetreat():
|
||||
{
|
||||
}
|
||||
|
||||
uint64_t getFightingStrength(const std::vector<const battle::Unit *> & stacks, const CGHeroInstance * hero = nullptr)
|
||||
uint64_t getFightingStrength(const battle::Units & stacks, const CGHeroInstance * hero = nullptr)
|
||||
{
|
||||
uint64_t result = 0;
|
||||
|
||||
|
@ -16,6 +16,7 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
namespace battle
|
||||
{
|
||||
class Unit;
|
||||
using Units = boost::container::small_vector<const Unit *, 4>;
|
||||
}
|
||||
|
||||
class CGHeroInstance;
|
||||
@ -27,8 +28,8 @@ public:
|
||||
bool canSurrender;
|
||||
bool isLastTurnBeforeDie;
|
||||
BattleSide ourSide;
|
||||
std::vector<const battle::Unit *> ourStacks;
|
||||
std::vector<const battle::Unit *> enemyStacks;
|
||||
battle::Units ourStacks;
|
||||
battle::Units enemyStacks;
|
||||
const CGHeroInstance * ourHero;
|
||||
const CGHeroInstance * enemyHero;
|
||||
int turnsSkippedByDefense;
|
||||
|
@ -383,11 +383,9 @@ battle::Units CBattleInfoCallback::battleAliveUnits(BattleSide side) const
|
||||
|
||||
using namespace battle;
|
||||
|
||||
//T is battle::Unit descendant
|
||||
template <typename T>
|
||||
const T * takeOneUnit(std::vector<const T*> & allUnits, const int turn, BattleSide & sideThatLastMoved, int phase)
|
||||
static const battle::Unit * takeOneUnit(battle::Units & allUnits, const int turn, BattleSide & sideThatLastMoved, int phase)
|
||||
{
|
||||
const T * returnedUnit = nullptr;
|
||||
const battle::Unit * returnedUnit = nullptr;
|
||||
size_t currentUnitIndex = 0;
|
||||
|
||||
for(size_t i = 0; i < allUnits.size(); i++)
|
||||
@ -1168,7 +1166,7 @@ std::pair<const battle::Unit *, BattleHex> CBattleInfoCallback::getNearestStack(
|
||||
|
||||
std::vector<DistStack> stackPairs;
|
||||
|
||||
std::vector<const battle::Unit *> possible = battleGetUnitsIf([=](const battle::Unit * unit)
|
||||
battle::Units possible = battleGetUnitsIf([=](const battle::Unit * unit)
|
||||
{
|
||||
return unit->isValidTarget(false) && unit != closest;
|
||||
});
|
||||
@ -1436,7 +1434,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyShootableHexes(const battle::
|
||||
return at;
|
||||
}
|
||||
|
||||
std::vector<const battle::Unit*> CBattleInfoCallback::getAttackedBattleUnits(
|
||||
battle::Units CBattleInfoCallback::getAttackedBattleUnits(
|
||||
const battle::Unit * attacker,
|
||||
const battle::Unit * defender,
|
||||
BattleHex destinationTile,
|
||||
@ -1444,7 +1442,7 @@ std::vector<const battle::Unit*> CBattleInfoCallback::getAttackedBattleUnits(
|
||||
BattleHex attackerPos,
|
||||
BattleHex defenderPos) const
|
||||
{
|
||||
std::vector<const battle::Unit*> units;
|
||||
battle::Units units;
|
||||
RETURN_IF_NOT_BATTLE(units);
|
||||
|
||||
if(attackerPos == BattleHex::INVALID)
|
||||
|
@ -147,7 +147,7 @@ public:
|
||||
|
||||
AttackableTiles getPotentiallyShootableHexes(const battle::Unit* attacker, BattleHex destinationTile, BattleHex attackerPos) const;
|
||||
|
||||
std::vector<const battle::Unit *> getAttackedBattleUnits(
|
||||
battle::Units getAttackedBattleUnits(
|
||||
const battle::Unit* attacker,
|
||||
const battle::Unit * defender,
|
||||
BattleHex destinationTile,
|
||||
|
@ -464,7 +464,7 @@ void CUnitState::getCasterName(MetaString & text) const
|
||||
addNameReplacement(text, true);
|
||||
}
|
||||
|
||||
void CUnitState::getCastDescription(const spells::Spell * spell, const std::vector<const Unit *> & attacked, MetaString & text) const
|
||||
void CUnitState::getCastDescription(const spells::Spell * spell, const battle::Units & attacked, MetaString & text) const
|
||||
{
|
||||
text.appendLocalString(EMetaText::GENERAL_TXT, 565);//The %s casts %s
|
||||
//todo: use text 566 for single creature
|
||||
|
@ -183,7 +183,7 @@ public:
|
||||
PlayerColor getCasterOwner() const override;
|
||||
const CGHeroInstance * getHeroCaster() const override;
|
||||
void getCasterName(MetaString & text) const override;
|
||||
void getCastDescription(const spells::Spell * spell, const std::vector<const Unit *> & attacked, MetaString & text) const override;
|
||||
void getCastDescription(const spells::Spell * spell, const battle::Units & attacked, MetaString & text) const override;
|
||||
int32_t manaLimit() const override;
|
||||
|
||||
bool ableToRetaliate() const override;
|
||||
|
@ -27,7 +27,7 @@ namespace battle
|
||||
{
|
||||
class IUnitInfo;
|
||||
class Unit;
|
||||
using Units = std::vector<const Unit *>;
|
||||
using Units = boost::container::small_vector<const Unit *, 4>;
|
||||
using UnitFilter = std::function<bool(const Unit *)>;
|
||||
}
|
||||
|
||||
|
@ -856,7 +856,7 @@ void CGHeroInstance::getCasterName(MetaString & text) const
|
||||
text.replaceRawString(getNameTranslated());
|
||||
}
|
||||
|
||||
void CGHeroInstance::getCastDescription(const spells::Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const
|
||||
void CGHeroInstance::getCastDescription(const spells::Spell * spell, const battle::Units & attacked, MetaString & text) const
|
||||
{
|
||||
const bool singleTarget = attacked.size() == 1;
|
||||
const int textIndex = singleTarget ? 195 : 196;
|
||||
|
@ -309,7 +309,7 @@ public:
|
||||
const CGHeroInstance * getHeroCaster() const override;
|
||||
|
||||
void getCasterName(MetaString & text) const override;
|
||||
void getCastDescription(const spells::Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const override;
|
||||
void getCastDescription(const spells::Spell * spell, const battle::Units & attacked, MetaString & text) const override;
|
||||
void spendMana(ServerCallback * server, const int spellCost) const override;
|
||||
|
||||
void attachToBoat(CGBoat* newBoat);
|
||||
|
@ -49,7 +49,7 @@ int32_t AbilityCaster::getEffectLevel(const Spell * spell) const
|
||||
return getSpellSchoolLevel(spell);
|
||||
}
|
||||
|
||||
void AbilityCaster::getCastDescription(const Spell * spell, const std::vector<const battle::Unit*> & attacked, MetaString & text) const
|
||||
void AbilityCaster::getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const
|
||||
{
|
||||
//do nothing
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ public:
|
||||
|
||||
int32_t getSpellSchoolLevel(const Spell * spell, SpellSchool * outSelectedSchool = nullptr) const override;
|
||||
int32_t getEffectLevel(const Spell * spell) const override;
|
||||
void getCastDescription(const Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const override;
|
||||
void spendMana(ServerCallback * server, const int32_t spellCost) const override;
|
||||
|
||||
private:
|
||||
|
@ -473,7 +473,7 @@ std::set<const battle::Unit *> BattleSpellMechanics::collectTargets() const
|
||||
return result;
|
||||
}
|
||||
|
||||
void BattleSpellMechanics::doRemoveEffects(ServerCallback * server, const std::vector<const battle::Unit *> & targets, const CSelector & selector)
|
||||
void BattleSpellMechanics::doRemoveEffects(ServerCallback * server, const battle::Units & targets, const CSelector & selector)
|
||||
{
|
||||
SetStackEffect sse;
|
||||
sse.battleID = battle()->getBattle()->getBattleID();
|
||||
|
@ -18,6 +18,11 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
struct BattleSpellCast;
|
||||
|
||||
namespace battle
|
||||
{
|
||||
using Units = boost::container::small_vector<const Unit *, 4>;
|
||||
}
|
||||
|
||||
namespace spells
|
||||
{
|
||||
|
||||
@ -66,14 +71,14 @@ private:
|
||||
std::shared_ptr<effects::Effects> effects;
|
||||
std::shared_ptr<IReceptiveCheck> targetCondition;
|
||||
|
||||
std::vector<const battle::Unit *> affectedUnits;
|
||||
battle::Units affectedUnits;
|
||||
effects::Effects::EffectsToApply effectsToApply;
|
||||
|
||||
void beforeCast(BattleSpellCast & sc, vstd::RNG & rng, const Target & target);
|
||||
|
||||
std::set<const battle::Unit *> collectTargets() const;
|
||||
|
||||
void doRemoveEffects(ServerCallback * server, const std::vector<const battle::Unit *> & targets, const CSelector & selector);
|
||||
void doRemoveEffects(ServerCallback * server, const battle::Units & targets, const CSelector & selector);
|
||||
|
||||
BattleHexArray spellRangeInHexes(BattleHex centralHex) const;
|
||||
|
||||
|
@ -57,7 +57,7 @@ void BonusCaster::getCasterName(MetaString & text) const
|
||||
}
|
||||
}
|
||||
|
||||
void BonusCaster::getCastDescription(const Spell * spell, const std::vector<const battle::Unit*> & attacked, MetaString & text) const
|
||||
void BonusCaster::getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const
|
||||
{
|
||||
const bool singleTarget = attacked.size() == 1;
|
||||
const int textIndex = singleTarget ? 195 : 196;
|
||||
|
@ -26,7 +26,7 @@ public:
|
||||
virtual ~BonusCaster();
|
||||
|
||||
void getCasterName(MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const override;
|
||||
void spendMana(ServerCallback * server, const int spellCost) const override;
|
||||
|
||||
private:
|
||||
|
@ -75,7 +75,7 @@ void SilentCaster::getCasterName(MetaString & text) const
|
||||
logGlobal->debug("Unexpected call to SilentCaster::getCasterName");
|
||||
}
|
||||
|
||||
void SilentCaster::getCastDescription(const Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const
|
||||
void SilentCaster::getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const
|
||||
{
|
||||
//do nothing
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ public:
|
||||
SilentCaster(PlayerColor owner_, const Caster * caster);
|
||||
|
||||
void getCasterName(MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const override;
|
||||
void spendMana(ServerCallback * server, const int spellCost) const override;
|
||||
PlayerColor getCasterOwner() const override;
|
||||
int32_t manaLimit() const override;
|
||||
|
@ -106,7 +106,7 @@ void ProxyCaster::getCasterName(MetaString & text) const
|
||||
actualCaster->getCasterName(text);
|
||||
}
|
||||
|
||||
void ProxyCaster::getCastDescription(const Spell * spell, const std::vector<const battle::Unit*> & attacked, MetaString & text) const
|
||||
void ProxyCaster::getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const
|
||||
{
|
||||
if(actualCaster)
|
||||
actualCaster->getCastDescription(spell, attacked, text);
|
||||
|
@ -33,7 +33,7 @@ public:
|
||||
int64_t getEffectValue(const Spell * spell) const override;
|
||||
PlayerColor getCasterOwner() const override;
|
||||
void getCasterName(MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const std::vector<const battle::Unit *> & attacked, MetaString & text) const override;
|
||||
void getCastDescription(const Spell * spell, const battle::Units & attacked, MetaString & text) const override;
|
||||
void spendMana(ServerCallback * server, const int32_t spellCost) const override;
|
||||
const CGHeroInstance * getHeroCaster() const override;
|
||||
int32_t manaLimit() const override;
|
||||
|
@ -28,7 +28,7 @@ public:
|
||||
MOCK_CONST_METHOD1(getEffectValue, int64_t(const spells::Spell *));
|
||||
MOCK_CONST_METHOD0(getCasterOwner, PlayerColor());
|
||||
MOCK_CONST_METHOD1(getCasterName, void(MetaString &));
|
||||
MOCK_CONST_METHOD3(getCastDescription, void(const spells::Spell *, const std::vector<const battle::Unit *> &, MetaString &));
|
||||
MOCK_CONST_METHOD3(getCastDescription, void(const spells::Spell *, const battle::Units &, MetaString &));
|
||||
MOCK_CONST_METHOD2(spendMana, void(ServerCallback *, const int32_t));
|
||||
MOCK_CONST_METHOD0(manaLimit, int32_t());
|
||||
MOCK_CONST_METHOD0(getHeroCaster, CGHeroInstance*());
|
||||
|
Reference in New Issue
Block a user