diff options
Diffstat (limited to 'src/crepe/ComponentManager.hpp')
-rw-r--r-- | src/crepe/ComponentManager.hpp | 152 |
1 files changed, 0 insertions, 152 deletions
diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp deleted file mode 100644 index 084cd33..0000000 --- a/src/crepe/ComponentManager.hpp +++ /dev/null @@ -1,152 +0,0 @@ -#pragma once - -#include <type_traits> - -#include "ComponentManager.h" - -namespace crepe { - -template <class T, typename... Args> -void ComponentManager::add_component(uint32_t id, Args &&... args) { - using namespace std; - - static_assert(is_base_of<Component, T>::value, "add_component must recieve a derivative class of Component"); - - // Determine the type of T (this is used as the key of the unordered_map<>) - type_index type = typeid(T); - - // Check if this component type is already in the unordered_map<> - if (components.find(type) == components.end()) { - //If not, create a new (empty) vector<> of vector<unique_ptr<Component>> - components[type] = vector<vector<unique_ptr<Component>>>(); - } - - // Resize the vector<> if the id is greater than the current size - if (id >= components[type].size()) { - // Initialize new slots to nullptr (resize does automatically init to nullptr) - components[type].resize(id + 1); - } - - // Create a new component of type T (arguments directly forwarded). The - // constructor must be called by ComponentManager. - T * instance = new T(forward<Args>(args)...); - // store its unique_ptr in the vector<> - components[type][id].push_back(unique_ptr<T>(instance)); -} - -template <typename T> -void ComponentManager::delete_components_by_id(uint32_t id) { - using namespace std; - - // Determine the type of T (this is used as the key of the unordered_map<>) - type_index type = typeid(T); - - // Find the type (in the unordered_map<>) - if (components.find(type) != components.end()) { - // Get the correct vector<> - vector<vector<unique_ptr<Component>>> & component_array - = components[type]; - - // Make sure that the id (that we are looking for) is within the boundaries of the vector<> - if (id < component_array.size()) { - // Clear the whole vector<> of this specific type and id - component_array[id].clear(); - } - } -} - -template <typename T> -void ComponentManager::delete_components() { - // Determine the type of T (this is used as the key of the unordered_map<>) - std::type_index type = typeid(T); - - // Find the type (in the unordered_map<>) - if (components.find(type) != components.end()) { - // Clear the whole vector<> of this specific type - components[type].clear(); - } -} - -template <typename T> -std::vector<std::reference_wrapper<T>> -ComponentManager::get_components_by_id(uint32_t id) const { - using namespace std; - - // Determine the type of T (this is used as the key of the unordered_map<>) - type_index type = typeid(T); - - // Create an empty vector<> - vector<reference_wrapper<T>> component_vector; - - // Find the type (in the unordered_map<>) - if (components.find(type) != components.end()) { - // Get the correct vector<> - const vector<vector<unique_ptr<Component>>> & component_array - = components.at(type); - - // Make sure that the id (that we are looking for) is within the boundaries of the vector<> - if (id < component_array.size()) { - // Loop trough the whole vector<> - for (const unique_ptr<Component> & component_ptr : - component_array[id]) { - // Cast the unique_ptr to a raw pointer - T * casted_component = static_cast<T *>(component_ptr.get()); - - // Ensure that the cast was successful - if (casted_component) { - // Add the dereferenced raw pointer to the vector<> - component_vector.push_back(*casted_component); - } - } - } - } - - // Return the vector<> - return component_vector; -} - -template <typename T> -std::vector<std::reference_wrapper<T>> -ComponentManager::get_components_by_type() const { - using namespace std; - - // Determine the type of T (this is used as the key of the unordered_map<>) - type_index type = typeid(T); - - // Create an empty vector<> - vector<reference_wrapper<T>> component_vector; - // Set the id to 0 (the id will also be stored in the returned vector<>) - // uint32_t id = 0; - - // Find the type (in the unordered_map<>) - if (components.find(type) != components.end()) { - - // Get the correct vector<> - const vector<vector<unique_ptr<Component>>> & component_array - = components.at(type); - - // Loop through the whole vector<> - for (const vector<unique_ptr<Component>> & component : - component_array) { - // Loop trough the whole vector<> - for (const unique_ptr<Component> & component_ptr : component) { - // Cast the unique_ptr to a raw pointer - T * casted_component = static_cast<T *>(component_ptr.get()); - - // Ensure that the cast was successful - if (casted_component) { - // Pair the dereferenced raw pointer and the id and add it to the vector<> - component_vector.emplace_back(ref(*casted_component)); - } - } - - // Increase the id (the id will also be stored in the returned vector<>) - //++id; - } - } - - // Return the vector<> - return component_vector; -} - -} // namespace crepe |