aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h70
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h24
2 files changed, 62 insertions, 32 deletions
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<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
{
@@ -210,15 +235,16 @@ namespace Trinity
};
template<class Check>
- struct WorldObjectListSearcher
+ struct WorldObjectListSearcher : ContainerInserter<WorldObject*>
{
uint32 i_mapTypeMask;
WorldObject const* _searcher;
- 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), _searcher(searcher), 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), _searcher(searcher), i_check(check) { }
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
@@ -340,14 +366,15 @@ namespace Trinity
};
template<class Check>
- struct GameObjectListSearcher
+ struct GameObjectListSearcher : ContainerInserter<GameObject*>
{
WorldObject const* _searcher;
- std::list<GameObject*> &i_objects;
Check& i_check;
- GameObjectListSearcher(WorldObject const* searcher, std::list<GameObject*> &objects, Check & check)
- : _searcher(searcher), i_objects(objects), i_check(check) { }
+ template<typename Container>
+ GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check)
+ : ContainerInserter<GameObject*>(container),
+ _searcher(searcher), i_check(check) { }
void Visit(GameObjectMapType &m);
@@ -412,14 +439,15 @@ namespace Trinity
// All accepted by Check units if any
template<class Check>
- struct UnitListSearcher
+ struct UnitListSearcher : ContainerInserter<Unit*>
{
WorldObject const* _searcher;
- std::list<Unit*> &i_objects;
Check& i_check;
- UnitListSearcher(WorldObject const* searcher, std::list<Unit*> &objects, Check & check)
- : _searcher(searcher), i_objects(objects), i_check(check) { }
+ template<typename Container>
+ UnitListSearcher(WorldObject const* searcher, Container& container, Check& check)
+ : ContainerInserter<Unit*>(container),
+ _searcher(searcher), i_check(check) { }
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
@@ -461,14 +489,15 @@ namespace Trinity
};
template<class Check>
- struct CreatureListSearcher
+ struct CreatureListSearcher : ContainerInserter<Creature*>
{
WorldObject const* _searcher;
- std::list<Creature*> &i_objects;
Check& i_check;
- CreatureListSearcher(WorldObject const* searcher, std::list<Creature*> &objects, Check & check)
- : _searcher(searcher), i_objects(objects), i_check(check) { }
+ template<typename Container>
+ CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check)
+ : ContainerInserter<Creature*>(container),
+ _searcher(searcher), i_check(check) { }
void Visit(CreatureMapType &m);
@@ -512,14 +541,15 @@ namespace Trinity
};
template<class Check>
- struct PlayerListSearcher
+ struct PlayerListSearcher : ContainerInserter<Player*>
{
WorldObject const* _searcher;
- std::list<Player*> &i_objects;
Check& i_check;
- PlayerListSearcher(WorldObject const* searcher, std::list<Player*> &objects, Check & check)
- : _searcher(searcher), i_objects(objects), i_check(check) { }
+ template<typename Container>
+ PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check)
+ : ContainerInserter<Player*>(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<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>
@@ -334,7 +334,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>
@@ -345,7 +345,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>
@@ -356,7 +356,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>
@@ -367,7 +367,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());
}
template<class Check>
@@ -378,7 +378,7 @@ void Trinity::WorldObjectListSearcher<Check>::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<class Check>
@@ -389,7 +389,7 @@ void Trinity::WorldObjectListSearcher<Check>::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<Check>::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<Check>::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<class Check>
@@ -519,7 +519,7 @@ void Trinity::UnitListSearcher<Check>::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<Check>::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<class Check>
@@ -572,7 +572,7 @@ void Trinity::PlayerListSearcher<Check>::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<class Check>