diff options
author | Naios <naios-dev@live.de> | 2016-09-25 15:36:58 +0200 |
---|---|---|
committer | Naios <naios-dev@live.de> | 2016-10-06 21:17:06 +0200 |
commit | 8775f8b28a5ad4403371577787131ff81f14332b (patch) | |
tree | f7f7a9824f56b599271fdc468214743c072ffa22 /src | |
parent | ac1f24061a174ac879bcdb08f801afe7fef3adcc (diff) |
Core/Grids: Allow arbitrary containers in grid searchers that support push_back
* Makes it possible to use vector and dequeue with grid searchers.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 70 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 20 |
2 files changed, 60 insertions, 30 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 8304054c663..317378dfa8b 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -170,6 +170,31 @@ namespace Trinity // WorldObject searchers & workers + // Generic base class to insert elements into arbitrary containers using push_back + template<typename Type> + class ContainerInserter { + using InserterType = void(*)(void*, Type&&); + + void* ref; + InserterType inserter; + + // MSVC workaround + template<typename T> + static void InserterOf(void* ref, Type&& type) + { + static_cast<T*>(ref)->push_back(std::move(type)); + } + + protected: + template<typename T> + ContainerInserter(T& ref_) : ref(&ref_), inserter(&InserterOf<T>) { } + + void Insert(Type type) + { + inserter(ref, std::move(type)); + } + }; + template<class Check> struct WorldObjectSearcher { @@ -211,15 +236,16 @@ namespace Trinity }; template<class Check> - struct WorldObjectListSearcher + struct WorldObjectListSearcher : ContainerInserter<WorldObject*> { uint32 i_mapTypeMask; uint32 i_phaseMask; - std::list<WorldObject*> &i_objects; Check& i_check; - WorldObjectListSearcher(WorldObject const* searcher, std::list<WorldObject*> &objects, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } + template<typename Container> + WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : ContainerInserter<WorldObject*>(container), + i_mapTypeMask(mapTypeMask), i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -321,14 +347,15 @@ namespace Trinity }; template<class Check> - struct GameObjectListSearcher + struct GameObjectListSearcher : ContainerInserter<GameObject*> { uint32 i_phaseMask; - std::list<GameObject*> &i_objects; Check& i_check; - GameObjectListSearcher(WorldObject const* searcher, std::list<GameObject*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } + template<typename Container> + GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check) + : ContainerInserter<GameObject*>(container), + i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(GameObjectMapType &m); @@ -393,14 +420,15 @@ namespace Trinity // All accepted by Check units if any template<class Check> - struct UnitListSearcher + struct UnitListSearcher : ContainerInserter<Unit*> { uint32 i_phaseMask; - std::list<Unit*> &i_objects; Check& i_check; - UnitListSearcher(WorldObject const* searcher, std::list<Unit*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } + template<typename Container> + UnitListSearcher(WorldObject const* searcher, Container& container, Check& check) + : ContainerInserter<Unit*>(container), + i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(PlayerMapType &m); void Visit(CreatureMapType &m); @@ -442,14 +470,15 @@ namespace Trinity }; template<class Check> - struct CreatureListSearcher + struct CreatureListSearcher : ContainerInserter<Creature*> { uint32 i_phaseMask; - std::list<Creature*> &i_objects; Check& i_check; - CreatureListSearcher(WorldObject const* searcher, std::list<Creature*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } + template<typename Container> + CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) + : ContainerInserter<Creature*>(container), + i_phaseMask(searcher->GetPhaseMask()), i_check(check) { } void Visit(CreatureMapType &m); @@ -493,14 +522,15 @@ namespace Trinity }; template<class Check> - struct PlayerListSearcher + struct PlayerListSearcher : ContainerInserter<Player*> { uint32 i_phaseMask; - std::list<Player*> &i_objects; Check& i_check; - PlayerListSearcher(WorldObject const* searcher, std::list<Player*> &objects, Check & check) - : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) { } + template<typename Container> + PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check) + : ContainerInserter<Player*>(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 340531c5883..5a3f41e5351 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -246,7 +246,7 @@ void Trinity::WorldObjectListSearcher<Check>::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<class Check> @@ -257,7 +257,7 @@ void Trinity::WorldObjectListSearcher<Check>::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<class Check> @@ -268,7 +268,7 @@ void Trinity::WorldObjectListSearcher<Check>::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<class Check> @@ -279,7 +279,7 @@ void Trinity::WorldObjectListSearcher<Check>::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<class Check> @@ -290,7 +290,7 @@ void Trinity::WorldObjectListSearcher<Check>::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 @@ -334,7 +334,7 @@ void Trinity::GameObjectListSearcher<Check>::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 @@ -411,7 +411,7 @@ void Trinity::UnitListSearcher<Check>::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<class Check> @@ -420,7 +420,7 @@ void Trinity::UnitListSearcher<Check>::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 @@ -464,7 +464,7 @@ void Trinity::CreatureListSearcher<Check>::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<class Check> @@ -473,7 +473,7 @@ void Trinity::PlayerListSearcher<Check>::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<class Check> |