aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/ComponentManager.hpp
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-11-04 08:28:18 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-11-04 08:28:18 +0100
commit06f65659fc6ffde7cabd2135040cbfbf089e5a24 (patch)
treee3570bea52b87b6919550ee81d17927ccbc11cc5 /src/crepe/ComponentManager.hpp
parent128969619a22dfc17a9ea35335c0d21c6ad0c954 (diff)
parent6aa8fdd04728b6a499f526de727514ae3d0490b4 (diff)
merge `origin/master` into `master`
Diffstat (limited to 'src/crepe/ComponentManager.hpp')
-rw-r--r--src/crepe/ComponentManager.hpp97
1 files changed, 46 insertions, 51 deletions
diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp
index 084cd33..9b07f13 100644
--- a/src/crepe/ComponentManager.hpp
+++ b/src/crepe/ComponentManager.hpp
@@ -7,10 +7,11 @@
namespace crepe {
template <class T, typename... Args>
-void ComponentManager::add_component(uint32_t id, Args &&... args) {
+T & 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");
+ 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);
@@ -29,9 +30,11 @@ void ComponentManager::add_component(uint32_t id, Args &&... args) {
// Create a new component of type T (arguments directly forwarded). The
// constructor must be called by ComponentManager.
- T * instance = new T(forward<Args>(args)...);
+ T * instance = new T(id, forward<Args>(args)...);
// store its unique_ptr in the vector<>
components[type][id].push_back(unique_ptr<T>(instance));
+
+ return *instance;
}
template <typename T>
@@ -60,11 +63,9 @@ 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();
- }
+ if (components.find(type) == components.end()) return;
+
+ components[type].clear();
}
template <typename T>
@@ -78,30 +79,26 @@ ComponentManager::get_components_by_id(uint32_t id) const {
// 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);
+ if (components.find(type) == components.end()) return component_vector;
- // 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);
- }
- }
- }
+ // 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()) return component_vector;
+
+ // 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());
+
+ if (casted_component == nullptr) continue;
+
+ // Add the dereferenced raw pointer to the vector<>
+ component_vector.push_back(*casted_component);
}
- // Return the vector<>
return component_vector;
}
@@ -119,30 +116,28 @@ ComponentManager::get_components_by_type() const {
// uint32_t id = 0;
// Find the type (in the unordered_map<>)
- if (components.find(type) != components.end()) {
+ if (components.find(type) == components.end()) return component_vector;
- // 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;
+ // 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 == nullptr) continue;
+
+ // 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<>