aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h70
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h20
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>