From 8fcaef4ba1d15944e48e515e904b98041c244eb3 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 10 Jan 2024 00:12:55 +0300 Subject: [PATCH] ECS index API wip: support creating & storing indices --- libs/ecs/include/psemek/ecs/container.hpp | 11 +++++ .../psemek/ecs/detail/index_container.hpp | 45 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 libs/ecs/include/psemek/ecs/detail/index_container.hpp diff --git a/libs/ecs/include/psemek/ecs/container.hpp b/libs/ecs/include/psemek/ecs/container.hpp index eb854a53..296f6415 100644 --- a/libs/ecs/include/psemek/ecs/container.hpp +++ b/libs/ecs/include/psemek/ecs/container.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -375,11 +376,15 @@ namespace psemek::ecs template void watch(Function && function); + template + Index & index(Args && ... args); + private: detail::entity_list entity_list_; detail::table_container table_container_; detail::query_cache_container query_cache_container_; detail::component_registry component_registry_; + detail::index_container index_container_; std::vector uuid_helper_; util::hash_set uuid_set_helper_; @@ -656,4 +661,10 @@ namespace psemek::ecs callback_caches_.push_back(cache); } + template + Index & container::index(Args && ... args) + { + return index_container_.get(*this, std::forward(args)...); + } + } diff --git a/libs/ecs/include/psemek/ecs/detail/index_container.hpp b/libs/ecs/include/psemek/ecs/detail/index_container.hpp new file mode 100644 index 00000000..3b9c4e86 --- /dev/null +++ b/libs/ecs/include/psemek/ecs/detail/index_container.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace psemek::ecs +{ + + struct container; + +} + +namespace psemek::ecs::detail +{ + + struct index_container + { + template + Index & get(container & container, Args && ... args) + { + auto uuid = Index::uuid(); + if (auto it = storage_.find(uuid); it != storage_.end()) + return *reinterpret_cast(it->second.get()); + + if constexpr (std::is_constructible_v) + { + auto ptr = std::make_shared(container, std::forward(args)...); + storage_.insert({uuid, ptr}); + return *ptr; + } + else + { + throw util::exception("Index " + util::type_name() + " is neither present nor constructible"); + } + } + + private: + util::hash_map> storage_; + }; + +}