From 2d59777d6012e704f415218b7214f2956fe60880 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 9 Nov 2022 23:06:25 +0300 Subject: [PATCH] Support searching ecs species by name --- libs/util/include/psemek/util/ecs.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libs/util/include/psemek/util/ecs.hpp b/libs/util/include/psemek/util/ecs.hpp index 3752fe7b..da204f15 100644 --- a/libs/util/include/psemek/util/ecs.hpp +++ b/libs/util/include/psemek/util/ecs.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -13,6 +14,7 @@ #include #include #include +#include #include @@ -622,6 +624,8 @@ namespace psemek::util std::string_view species_name(species_handle species) const { return species_[species.value]->name(); } + std::optional find_species_by_name(std::string_view const & name) const; + static species_handle entity_species(entity_handle entity) { return {ecs_detail::unpack(entity.value).species}; } template @@ -704,6 +708,7 @@ namespace psemek::util private: std::vector> species_; + std::unordered_map> species_by_name_; std::unordered_map>> event_subscribers_; @@ -720,6 +725,7 @@ namespace psemek::util ecs::species_handle ecs::register_species(std::string name, policy p, Components && ... components) { species_handle result{species_.size()}; + species_by_name_[name] = result.value; if (p == policy::sparse) species_.push_back(std::make_unique...>>(this, std::move(name), result.value, std::forward(components)...)); else @@ -729,6 +735,13 @@ namespace psemek::util return result; } + inline std::optional ecs::find_species_by_name(std::string_view const & name) const + { + if (auto it = species_by_name_.find(name); it != species_by_name_.end()) + return species_handle{it->second}; + return std::nullopt; + } + template inline ecs::entity_handle ecs::add_entity(species_handle species, typename Components::data ... components) {