diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 114d41c2e44..a95d896c1d9 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -171,6 +171,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 { @@ -214,15 +239,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), i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -334,14 +360,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), + i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(GameObjectMapType &m); @@ -406,14 +433,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), + i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -455,14 +483,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), + i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(CreatureMapType &m); @@ -506,14 +535,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), + i_phaseMask(searcher->GetPhaseMask()), 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 7de1658bec9..cc87e809f7d 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -284,7 +284,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 @@ -295,7 +295,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 @@ -306,7 +306,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 @@ -317,7 +317,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 @@ -328,7 +328,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 @@ -339,7 +339,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()); } // Gameobject searchers @@ -383,7 +383,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