Core/Grids: Allow arbitrary containers in grid searchers that support push_back

* Makes it possible to use vector and dequeue with grid searchers.

(cherry picked from commit 8775f8b28a5ad4403371577787131ff81f14332b)
This commit is contained in:
Naios
2017-08-21 21:39:58 +02:00
committed by joschiwald
parent 0eb4b4de11
commit 49ff1736ea
2 changed files with 62 additions and 32 deletions
+50 -20
View File
@@ -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);
@@ -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>