diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 825a34500..b4e4a461f 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -165,6 +165,32 @@ namespace Acore // 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 { @@ -206,15 +232,16 @@ namespace Acore }; template - struct WorldObjectListSearcher + struct WorldObjectListSearcher : ContainerInserter { uint32 i_mapTypeMask; uint32 i_phaseMask; - 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), i_phaseMask(searcher->GetPhaseMask()), 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); @@ -316,14 +343,15 @@ namespace Acore }; template - struct GameObjectListSearcher + struct GameObjectListSearcher : ContainerInserter { uint32 i_phaseMask; - std::list& i_objects; Check& i_check; - GameObjectListSearcher(WorldObject const* searcher, std::list& objects, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), 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); @@ -388,14 +416,15 @@ namespace Acore // All accepted by Check units if any template - struct UnitListSearcher + struct UnitListSearcher : ContainerInserter { uint32 i_phaseMask; - std::list& i_objects; Check& i_check; - UnitListSearcher(WorldObject const* searcher, std::list& objects, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), 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); @@ -437,14 +466,15 @@ namespace Acore }; template - struct CreatureListSearcher + struct CreatureListSearcher : ContainerInserter { uint32 i_phaseMask; - std::list& i_objects; Check& i_check; - CreatureListSearcher(WorldObject const* searcher, std::list& objects, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), 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); @@ -488,14 +518,15 @@ namespace Acore }; template - struct PlayerListSearcher + struct PlayerListSearcher : ContainerInserter { uint32 i_phaseMask; - std::list& i_objects; Check& i_check; - PlayerListSearcher(WorldObject const* searcher, std::list& objects, Check& check) - : i_phaseMask(searcher->GetPhaseMask()), 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 4cb57cfdf..3cd1b77dc 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -253,7 +253,7 @@ void Acore::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 @@ -264,7 +264,7 @@ void Acore::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 @@ -275,7 +275,7 @@ void Acore::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 @@ -286,7 +286,7 @@ void Acore::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 @@ -297,7 +297,7 @@ void Acore::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()); } // Gameobject searchers @@ -341,7 +341,7 @@ void Acore::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())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } // Unit searchers @@ -418,7 +418,7 @@ void Acore::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())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -427,7 +427,7 @@ void Acore::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())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } // Creature searchers @@ -471,7 +471,7 @@ void Acore::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())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template @@ -480,7 +480,7 @@ void Acore::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())) - i_objects.push_back(itr->GetSource()); + Insert(itr->GetSource()); } template