From 49ff1736eaaaf3baa81c9419177db5eafb9d9bd3 Mon Sep 17 00:00:00 2001 From: Naios Date: Sun, 25 Sep 2016 15:36:58 +0200 Subject: Core/Grids: Allow arbitrary containers in grid searchers that support push_back * Makes it possible to use vector and dequeue with grid searchers. (cherry picked from commit 8775f8b28a5ad4403371577787131ff81f14332b) --- src/server/game/Grids/Notifiers/GridNotifiers.h | 70 +++++++++++++++------- .../game/Grids/Notifiers/GridNotifiersImpl.h | 24 ++++---- 2 files changed, 62 insertions(+), 32 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 0e5c2350736..98010ddf2cd 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -165,6 +165,31 @@ namespace Trinity // WorldObject searchers & workers + // Generic base class to insert elements into arbitrary containers using push_back + template + class ContainerInserter { + using InserterType = void(*)(void*, Type&&); + + void* ref; + InserterType inserter; + + // MSVC workaround + template + static void InserterOf(void* ref, Type&& type) + { + static_cast(ref)->push_back(std::move(type)); + } + + protected: + template + ContainerInserter(T& ref_) : ref(&ref_), inserter(&InserterOf) { } + + void Insert(Type type) + { + inserter(ref, std::move(type)); + } + }; + template struct WorldObjectSearcher { @@ -210,15 +235,16 @@ namespace Trinity }; template - struct WorldObjectListSearcher + struct WorldObjectListSearcher : ContainerInserter { uint32 i_mapTypeMask; WorldObject const* _searcher; - std::list &i_objects; Check& i_check; - WorldObjectListSearcher(WorldObject const* searcher, std::list &objects, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), _searcher(searcher), i_objects(objects), i_check(check) { } + template + WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : ContainerInserter(container), + i_mapTypeMask(mapTypeMask), _searcher(searcher), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -340,14 +366,15 @@ namespace Trinity }; template - struct GameObjectListSearcher + struct GameObjectListSearcher : ContainerInserter { WorldObject const* _searcher; - std::list &i_objects; Check& i_check; - GameObjectListSearcher(WorldObject const* searcher, std::list &objects, Check & check) - : _searcher(searcher), i_objects(objects), i_check(check) { } + template + GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check) + : ContainerInserter(container), + _searcher(searcher), i_check(check) { } void Visit(GameObjectMapType &m); @@ -412,14 +439,15 @@ namespace Trinity // All accepted by Check units if any template - struct UnitListSearcher + struct UnitListSearcher : ContainerInserter { WorldObject const* _searcher; - std::list &i_objects; Check& i_check; - UnitListSearcher(WorldObject const* searcher, std::list &objects, Check & check) - : _searcher(searcher), i_objects(objects), i_check(check) { } + template + UnitListSearcher(WorldObject const* searcher, Container& container, Check& check) + : ContainerInserter(container), + _searcher(searcher), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -461,14 +489,15 @@ namespace Trinity }; template - struct CreatureListSearcher + struct CreatureListSearcher : ContainerInserter { WorldObject const* _searcher; - std::list &i_objects; Check& i_check; - CreatureListSearcher(WorldObject const* searcher, std::list &objects, Check & check) - : _searcher(searcher), i_objects(objects), i_check(check) { } + template + CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) + : ContainerInserter(container), + _searcher(searcher), i_check(check) { } void Visit(CreatureMapType &m); @@ -512,14 +541,15 @@ namespace Trinity }; template - struct PlayerListSearcher + struct PlayerListSearcher : ContainerInserter { WorldObject const* _searcher; - std::list &i_objects; Check& i_check; - PlayerListSearcher(WorldObject const* searcher, std::list &objects, Check & check) - : _searcher(searcher), i_objects(objects), i_check(check) { } + template + PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check) + : ContainerInserter(container), + _searcher(searcher), i_check(check) { } void Visit(PlayerMapType &m); diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index fb2a00c2b5c..d632537d61c 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -323,7 +323,7 @@ void Trinity::WorldObjectListSearcher::Visit(PlayerMapType &m) for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -334,7 +334,7 @@ void Trinity::WorldObjectListSearcher::Visit(CreatureMapType &m) for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -345,7 +345,7 @@ void Trinity::WorldObjectListSearcher::Visit(CorpseMapType &m) for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -356,7 +356,7 @@ void Trinity::WorldObjectListSearcher::Visit(GameObjectMapType &m) for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -367,7 +367,7 @@ void Trinity::WorldObjectListSearcher::Visit(DynamicObjectMapType &m) for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -378,7 +378,7 @@ void Trinity::WorldObjectListSearcher::Visit(AreaTriggerMapType &m) for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -389,7 +389,7 @@ void Trinity::WorldObjectListSearcher::Visit(ConversationMapType &m) for (ConversationMapType::iterator itr = m.begin(); itr != m.end(); ++itr) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } // Gameobject searchers @@ -433,7 +433,7 @@ void Trinity::GameObjectListSearcher::Visit(GameObjectMapType &m) for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->IsInPhase(_searcher)) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } // Unit searchers @@ -510,7 +510,7 @@ void Trinity::UnitListSearcher::Visit(PlayerMapType &m) for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->IsInPhase(_searcher)) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -519,7 +519,7 @@ void Trinity::UnitListSearcher::Visit(CreatureMapType &m) for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->IsInPhase(_searcher)) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } // Creature searchers @@ -563,7 +563,7 @@ void Trinity::CreatureListSearcher::Visit(CreatureMapType &m) for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->IsInPhase(_searcher)) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -572,7 +572,7 @@ void Trinity::PlayerListSearcher::Visit(PlayerMapType &m) for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->IsInPhase(_searcher)) if (i_check(itr->GetSource())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template -- cgit v1.2.3