#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> 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"