From 61885dde256b794a55c8cb31479eb74e08ceecbc Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 27 Oct 2022 20:59:34 +0300 Subject: [PATCH] Add util::ecs::species() for iterating over all species --- libs/util/include/psemek/util/ecs.hpp | 39 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/libs/util/include/psemek/util/ecs.hpp b/libs/util/include/psemek/util/ecs.hpp index f9a775ea..e19bd316 100644 --- a/libs/util/include/psemek/util/ecs.hpp +++ b/libs/util/include/psemek/util/ecs.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -447,6 +448,37 @@ namespace psemek::util void begin(species_handle, Components const & ...) {} }; + struct species_iterator + { + species_iterator(ecs_detail::species_handle h) + : h_(h) + {} + + species_handle operator*() const + { + return species_handle{h_}; + } + + species_iterator & operator++() + { + ++h_; + return *this; + } + + friend bool operator == (species_iterator const & it1, species_iterator const & it2) + { + return it1.h_ == it2.h_; + } + + friend bool operator != (species_iterator const & it1, species_iterator const & it2) + { + return !(it1 == it2); + } + + private: + ecs_detail::species_handle h_; + }; + enum class policy { sparse, @@ -456,7 +488,10 @@ namespace psemek::util template species_handle register_species(std::string name, policy p, Components && ... components); - ecs_detail::species_handle species_count() const { return species_.size(); } + util::range species() const + { + return {species_iterator{0}, species_iterator{species_.size()}}; + } std::string_view species_name(species_handle species) const { return species_[species.value]->name(); } @@ -518,7 +553,7 @@ namespace psemek::util template ecs::species_handle ecs::register_species(std::string name, policy p, Components && ... components) { - auto result = species_count(); + auto result = species_.size(); if (p == policy::sparse) species_.push_back(std::make_unique>(std::move(name), result, std::move(components)...)); else