From d019719289cb8266e581147ef2085bd2f43b2bd2 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 28 May 2023 16:54:23 +0200 Subject: Core/Objects: Unify GameObjectSearcher, UnitSearcher, CreatureSearcher and PlayerSearcher classes into one common implementation (cherry picked from commit 526b16fea41fb69a302fdebe8a727e175949f04b) --- src/server/game/Grids/Notifiers/GridNotifiers.h | 269 ++++++++------------- .../game/Grids/Notifiers/GridNotifiersImpl.h | 211 ++++------------ 2 files changed, 142 insertions(+), 338 deletions(-) (limited to 'src') diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index faf245e578b..55f17abea86 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -280,11 +280,11 @@ namespace Trinity { uint32 i_mapTypeMask; uint32 i_phaseMask; - Check &i_check; + Check& i_check; template - WorldObjectSearcherBase(WorldObject const* searcher, Container& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : Result(result), i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } + WorldObjectSearcherBase(uint32 phaseMask, Container& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : Result(result), i_mapTypeMask(mapTypeMask), i_phaseMask(phaseMask), i_check(check) { } template void Visit(GridRefManager&); @@ -294,22 +294,22 @@ namespace Trinity struct WorldObjectSearcher : WorldObjectSearcherBase> { WorldObjectSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : WorldObjectSearcherBase>(searcher, result, check, mapTypeMask) { } + : WorldObjectSearcherBase>(searcher->GetPhaseMask(), result, check, mapTypeMask) { } }; template struct WorldObjectLastSearcher : WorldObjectSearcherBase> { - WorldObjectLastSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : WorldObjectSearcherBase>(searcher, result, check, mapTypeMask) { } + WorldObjectLastSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(searcher->GetPhaseMask(), result, check, mapTypeMask) { } }; template struct WorldObjectListSearcher : WorldObjectSearcherBase> { template - WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : WorldObjectSearcherBase>(searcher, container, check, mapTypeMask) { } + WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(searcher->GetPhaseMask(), container, check, mapTypeMask) { } }; template @@ -322,100 +322,55 @@ namespace Trinity WorldObjectWorker(WorldObject const* searcher, Do const& _do, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_do(_do) { } - void Visit(GameObjectMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - - void Visit(PlayerMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - void Visit(CreatureMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - - void Visit(CorpseMapType &m) - { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - i_do(itr->GetSource()); - } - - void Visit(DynamicObjectMapType &m) + template + void Visit(GridRefManager& m) { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) + if (!(i_mapTypeMask & GridMapTypeMaskForType::value)) return; - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (auto itr = m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->InSamePhase(i_phaseMask)) i_do(itr->GetSource()); } - - template void Visit(GridRefManager &) { } }; // Gameobject searchers - template - struct GameObjectSearcher + template + struct GameObjectSearcherBase : Result { uint32 i_phaseMask; - GameObject* &i_object; Check &i_check; - GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + GameObjectSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(GameObjectMapType &m); + void Visit(GameObjectMapType& m); template void Visit(GridRefManager &) { } }; - // Last accepted by Check GO if any (Check can change requirements at each call) template - struct GameObjectLastSearcher + struct GameObjectSearcher : GameObjectSearcherBase> { - uint32 i_phaseMask; - GameObject* &i_object; - Check& i_check; - - GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(GameObjectMapType &m); - - template void Visit(GridRefManager &) { } + GameObjectSearcher(WorldObject const* searcher, GameObject*& result, Check& check) + : GameObjectSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; + // Last accepted by Check GO if any (Check can change requirements at each call) template - struct GameObjectListSearcher : SearcherContainerResult + struct GameObjectLastSearcher : GameObjectSearcherBase> { - uint32 i_phaseMask; - Check& i_check; + GameObjectLastSearcher(WorldObject const* searcher, GameObject*& result, Check& check) + : GameObjectSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; + template + struct GameObjectListSearcher : GameObjectSearcherBase> + { template - GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(GameObjectMapType &m); - - template void Visit(GridRefManager &) { } + GameObjectListSearcher(WorldObject const* searcher, Container& container, Check& check) + : GameObjectSearcherBase>(searcher->GetPhaseMask(), container, check) { } }; template @@ -440,105 +395,88 @@ namespace Trinity // Unit searchers - // First accepted by Check Unit if any - template - struct UnitSearcher + template + struct UnitSearcherBase : Result { uint32 i_phaseMask; - Unit* &i_object; - Check & i_check; + Check& i_check; - UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + UnitSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(CreatureMapType &m); - void Visit(PlayerMapType &m); + void Visit(CreatureMapType& m) { VisitImpl(m); } + void Visit(PlayerMapType& m) { VisitImpl(m); } - template void Visit(GridRefManager &) { } + template void Visit(GridRefManager&) { } + + private: + template void VisitImpl(GridRefManager& m); }; - // Last accepted by Check Unit if any (Check can change requirements at each call) + // First accepted by Check Unit if any template - struct UnitLastSearcher + struct UnitSearcher : UnitSearcherBase> { - uint32 i_phaseMask; - Unit* &i_object; - Check & i_check; - - UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - void Visit(PlayerMapType &m); + UnitSearcher(WorldObject const* searcher, Unit*& result, Check& check) + : UnitSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; - template void Visit(GridRefManager &) { } + // Last accepted by Check Unit if any (Check can change requirements at each call) + template + struct UnitLastSearcher : UnitSearcherBase> + { + UnitLastSearcher(WorldObject const* searcher, Unit*& result, Check& check) + : UnitSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; // All accepted by Check units if any template - struct UnitListSearcher : SearcherContainerResult + struct UnitListSearcher : UnitSearcherBase> { - uint32 i_phaseMask; - Check& i_check; - template UnitListSearcher(WorldObject const* searcher, Container& container, Check& check) - : SearcherContainerResult(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + : UnitSearcherBase>(searcher->GetPhaseMask(), container, check) { } }; // Creature searchers - template - struct CreatureSearcher + template + struct CreatureSearcherBase : Result { uint32 i_phaseMask; - Creature* &i_object; - Check & i_check; + Check& i_check; - CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + CreatureSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(CreatureMapType &m); + void Visit(CreatureMapType& m); template void Visit(GridRefManager &) { } }; - // Last accepted by Check Creature if any (Check can change requirements at each call) template - struct CreatureLastSearcher + struct CreatureSearcher : CreatureSearcherBase> { - uint32 i_phaseMask; - Creature* &i_object; - Check & i_check; - - CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + CreatureSearcher(WorldObject const* searcher, Creature*& result, Check& check) + : CreatureSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; + // Last accepted by Check Creature if any (Check can change requirements at each call) template - struct CreatureListSearcher : SearcherContainerResult + struct CreatureLastSearcher : CreatureSearcherBase> { - uint32 i_phaseMask; - Check& i_check; + CreatureLastSearcher(WorldObject const* searcher, Creature*& result, Check& check) + : CreatureSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; + template + struct CreatureListSearcher : CreatureSearcherBase> + { template CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + : CreatureSearcherBase>(searcher->GetPhaseMask(), container, check) { } }; template @@ -562,56 +500,45 @@ namespace Trinity // Player searchers - template - struct PlayerSearcher + template + struct PlayerSearcherBase : Result { uint32 i_phaseMask; - Player* &i_object; - Check & i_check; + Check& i_check; - PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) { } + template + PlayerSearcherBase(uint32 phaseMask, Container& result, Check& check) + : Result(result), i_phaseMask(phaseMask), i_check(check) { } - void Visit(PlayerMapType &m); + void Visit(PlayerMapType& m); template void Visit(GridRefManager &) { } }; template - struct PlayerListSearcher : SearcherContainerResult + struct PlayerSearcher : PlayerSearcherBase> { - uint32 i_phaseMask; - Check& i_check; - - template - PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } - - template - PlayerListSearcher(uint32 phaseMask, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseMask(phaseMask), i_check(check) { } - - void Visit(PlayerMapType &m); - - template void Visit(GridRefManager &) { } + PlayerSearcher(WorldObject const* searcher, Player*& result, Check& check) + : PlayerSearcherBase>(searcher->GetPhaseMask(), result, check) { } }; template - struct PlayerLastSearcher + struct PlayerLastSearcher : PlayerSearcherBase> { - uint32 i_phaseMask; - Player* &i_object; - Check& i_check; - - PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) - { - } + PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) + : PlayerSearcherBase>(searcher->GetPhaseMask(), result, check) { } + }; - void Visit(PlayerMapType& m); + template + struct PlayerListSearcher : PlayerSearcherBase> + { + template + PlayerListSearcher(WorldObject const* searcher, Container& container, Check& check) + : PlayerSearcherBase>(searcher->GetPhaseMask(), container, check) { } - template void Visit(GridRefManager &) { } + template + PlayerListSearcher(uint32 phaseMask, Container& container, Check& check) + : PlayerSearcherBase>(phaseMask, container, check) { } }; template diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index bb417726403..2a852b6c046 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -51,11 +51,11 @@ void Trinity::WorldObjectSearcherBase::Visit(GridRefManager& m if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (auto itr = m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - this->Insert(itr->GetSource()); + this->Insert(ref.GetSource()); if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; @@ -65,217 +65,94 @@ void Trinity::WorldObjectSearcherBase::Visit(GridRefManager& m // Gameobject searchers -template -void Trinity::GameObjectSearcher::Visit(GameObjectMapType &m) +template +void Trinity::GameObjectSearcherBase::Visit(GameObjectMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} + this->Insert(ref.GetSource()); -template -void Trinity::GameObjectLastSearcher::Visit(GameObjectMapType &m) -{ - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } } } -template -void Trinity::GameObjectListSearcher::Visit(GameObjectMapType &m) -{ - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Unit searchers -template -void Trinity::UnitSearcher::Visit(CreatureMapType &m) +template +template +void Trinity::UnitSearcherBase::VisitImpl(GridRefManager& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} - -template -void Trinity::UnitSearcher::Visit(PlayerMapType &m) -{ - // already found - if (i_object) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; + this->Insert(ref.GetSource()); - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::UnitLastSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::UnitLastSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::UnitListSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::UnitListSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Creature searchers -template -void Trinity::CreatureSearcher::Visit(CreatureMapType &m) +template +void Trinity::CreatureSearcherBase::Visit(CreatureMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} + this->Insert(ref.GetSource()); -template -void Trinity::CreatureLastSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } } } -template -void Trinity::CreatureListSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::PlayerListSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(i_phaseMask)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} +// Player searchers -template -void Trinity::PlayerSearcher::Visit(PlayerMapType &m) +template +void Trinity::PlayerSearcherBase::Visit(PlayerMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) + if (!ref.GetSource()->InSamePhase(i_phaseMask)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} + this->Insert(ref.GetSource()); -template -void Trinity::PlayerLastSearcher::Visit(PlayerMapType& m) -{ - for (PlayerMapType::iterator itr = m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(i_phaseMask)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } } } -- cgit v1.2.3