#pragma once #include "Components.h" #include #include #include #include #include #include class ComponentManager { public: static ComponentManager& GetInstance(); //Singleton ComponentManager(const ComponentManager&) = delete; //Singleton ComponentManager(ComponentManager&&) = delete; //Singleton ComponentManager& operator=(const ComponentManager&) = delete; //Singleton ComponentManager& operator=(ComponentManager&&) = delete; //Singleton template void AddComponent(std::uint32_t id, Args&&... args); //Add a component of a specific type template void DeleteComponentsById(std::uint32_t id); //Deletes all components of a specific type and id template void DeleteComponents(); //Deletes all components of a specific type void DeleteAllComponentsOfId(std::uint32_t id); //Deletes all components of a specific id void DeleteAllComponents(); //Deletes all components template std::vector> GetComponentsByID(std::uint32_t id) const; //Get a vector<> of all components at specific type and id template std::vector, std::uint32_t>> GetComponentsByType() const; //Get a vector<> of all components of a specific type private: static ComponentManager mInstance; //Singleton ComponentManager(); //Singleton /* * The std::unordered_map>>> below might seem a bit strange, let me explain this structure: * The std::unordered_map<> has a key and value. The key is a std::type_index and the value is a std::vector. So, a new std::vector will be created for each new std::type_index. * The first std::vector<> stores another vector<>. This first vector<> is to bind the entity's id to a component. * The second std::vector<> stores unique_ptrs. Each component can be gathered via an unique_ptr. This second vector<> allows multiple components of the same std::type_index for one entity (id). */ std::unordered_map>>> mComponents; }; #include "ComponentManager.hpp"