#ifndef HYDRAECSCOMPONENTMANAGER #define HYDRAECSCOMPONENTMANAGER #include "../engine/HydraObject.h" #include "HydraComponentArray.h" #include #include using ComponentTypeID = uint8_t; class HydraComponentManager :public HydraObject { private: std::unordered_map> m_component_arrays; std::unordered_map m_component_types; ComponentTypeID m_current_component_type_id = 0; template std::shared_ptr> _GetComponentArray() { std::string type_name = std::string(typeid(T).name()); assert(m_component_types.find(type_name) != m_component_types.end() && "Component type does not exist"); return std::static_pointer_cast>(m_component_arrays[type_name]); } public: template ComponentTypeID RegisterComponentType() { std::string type_name = std::string(typeid(T).name()); assert(m_component_types.find(type_name) == m_component_types.end() && "Component name already in use"); m_component_types.insert({type_name, m_current_component_type_id}); m_component_arrays.insert({type_name, std::make_shared>()}); return m_current_component_type_id++; } template ComponentTypeID GetComponentTypeID() { std::string type_name = std::string(typeid(T).name()); assert(m_component_types.find(type_name) != m_component_types.end() && "Component type does not exist"); return m_component_types[type_name]; } template void AddComponent(HydraID entity_id, T component) { _GetComponentArray()->AddComponent(entity_id, component); } template T& GetComponent(HydraID entity_id) { return _GetComponentArray()->GetComponent(entity_id); } template bool HasComponent(HydraID entity_id) { return _GetComponentArray()->HasComponent(entity_id); } template void RemoveComponent(HydraID entity_id) { _GetComponentArray()->RemoveComponent(entity_id); } void EntityDeleted(HydraID entity_id) { for(auto comp_array : m_component_arrays) { (*comp_array.second).EntityDeleted(entity_id); } } }; #endif /* HYDRACOMPONENTMANAGER */