_Pragma("once") #include "pool.hpp" #include "component.hpp" class Entity; class Context final { public: friend class Entity; Entity* CreateEntity(); bool HasEntity(Entity* entity); Pool::ElemContainer& GetEntities(); void DestroyEntity(Entity* entity); int GetEntityNum() const; template T* CreateComponent(Args... args) { ComponentId id = ComponentIdx::Get(); auto it = gComponentPool.find(id); if (it != gComponentPool.end()) { return it->second.Create(args...); } else { gComponentPool[id] = Pool(); return gComponentPool[id].Create(args...); } } template void DestroyComponent(T* elem) { DestroyComponentById(elem, ComponentIdx::Get()); } inline void DestroyComponentById(Component* elem, int id) { auto it = gComponentPool.find(id); if (it != gComponentPool.end()) { gComponentPool[id].Destroy(elem); } } private: Pool entities_; void onComponentUpdate(Entity*, ComponentId, Component*); };