/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #ifndef ACORE_GRID_H #define ACORE_GRID_H /* @class Grid Grid is a logical segment of the game world represented inside TrinIty. Grid is bind at compile time to a particular type of object which we call it the object of interested. There are many types of loader, specially, dynamic loader, static loader, or on-demand loader. There's a subtle difference between dynamic loader and on-demand loader but this is implementation specific to the loader class. From the Grid's perspective, the loader meets its API requirement is suffice. */ #include "Define.h" #include "TypeContainer.h" #include "TypeContainerVisitor.h" // forward declaration template class GridLoader; template < class ACTIVE_OBJECT, class WORLD_OBJECT_TYPES, class GRID_OBJECT_TYPES > class Grid { // allows the GridLoader to access its internals template friend class GridLoader; public: /** destructor to clean up its resources. This includes unloading the grid if it has not been unload. */ ~Grid() = default; /** an object of interested enters the grid */ template void AddWorldObject(SPECIFIC_OBJECT* obj) { i_objects.template insert(obj); ASSERT(obj->IsInGrid()); } /** an object of interested exits the grid */ //Actually an unlink is enough, no need to go through the container //template void RemoveWorldObject(SPECIFIC_OBJECT *obj) //{ // ASSERT(obj->GetGridRef().isValid()); // i_objects.template remove(obj); // ASSERT(!obj->GetGridRef().isValid()); //} /** Refreshes/update the grid. This required for remote grids. */ //void RefreshGrid(void) { /* TBI */} /** Locks a grid. Any object enters must wait until the grid is unlock. */ //void LockGrid(void) { /* TBI */ } /** Unlocks the grid. */ //void UnlockGrid(void) { /* TBI */ } // Visit grid objects template void Visit(TypeContainerVisitor >& visitor) { visitor.Visit(i_container); } // Visit world objects template void Visit(TypeContainerVisitor >& visitor) { visitor.Visit(i_objects); } /** Inserts a container type object into the grid. */ template void AddGridObject(SPECIFIC_OBJECT* obj) { i_container.template insert(obj); ASSERT(obj->IsInGrid()); } /** Removes a containter type object from the grid */ //template void RemoveGridObject(SPECIFIC_OBJECT *obj) //{ // ASSERT(obj->GetGridRef().isValid()); // i_container.template remove(obj); // ASSERT(!obj->GetGridRef().isValid()); //} /*bool NoWorldObjectInGrid() const { return i_objects.GetElements().isEmpty(); } bool NoGridObjectInGrid() const { return i_container.GetElements().isEmpty(); }*/ private: TypeMapContainer i_container; TypeMapContainer i_objects; //typedef std::set ActiveGridObjects; //ActiveGridObjects m_activeGridObjects; }; #endif