diff options
author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-10-23 21:15:58 +0200 |
---|---|---|
committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-10-23 21:15:58 +0200 |
commit | b5e83d076f356c6d01b7bbc1f033db4850356c0d (patch) | |
tree | c4b11f86c6ab1685e46fab9d674377a39e612fd7 /mwe/ecs-homemade/inc/ComponentManager.h | |
parent | 51c8a51b53a850265955a3e4bc45b40ad3f8c477 (diff) | |
parent | 04a040e28ade412ea5b1767bf77eed3956121973 (diff) |
pull origin master
Diffstat (limited to 'mwe/ecs-homemade/inc/ComponentManager.h')
-rw-r--r-- | mwe/ecs-homemade/inc/ComponentManager.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/mwe/ecs-homemade/inc/ComponentManager.h b/mwe/ecs-homemade/inc/ComponentManager.h new file mode 100644 index 0000000..0ba358e --- /dev/null +++ b/mwe/ecs-homemade/inc/ComponentManager.h @@ -0,0 +1,58 @@ +#pragma once + +#include "Components.h" +#include <cstdint> +#include <memory> +#include <typeindex> +#include <unordered_map> +#include <utility> +#include <vector> + +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 + + //Add a component of a specific type + template <typename T, typename... Args> + T & AddComponent(std::uint32_t id, Args &&... args); + //Deletes all components of a specific type and id + template <typename T> + void DeleteComponentsById(std::uint32_t id); + //Deletes all components of a specific type + template <typename T> + void DeleteComponents(); + //Deletes all components of a specific id + void DeleteAllComponentsOfId(std::uint32_t id); + //Deletes all components + void DeleteAllComponents(); + + //Get a vector<> of all components at specific type and id + template <typename T> + std::vector<std::reference_wrapper<T>> + GetComponentsByID(std::uint32_t id) const; + //Get a vector<> of all components of a specific type + template <typename T> + std::vector<std::reference_wrapper<T>> GetComponentsByType() const; + +private: + static ComponentManager mInstance; //Singleton + + ComponentManager(); //Singleton + + /* + * The std::unordered_map<std::type_index, std::vector<std::vector<std::unique_ptr<Component>>>> 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<std::type_index, + std::vector<std::vector<std::unique_ptr<Component>>>> + mComponents; +}; + +#include "ComponentManager.hpp" |