From bfa0491f39eb445bce76c5038593dfb04becd194 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 29 Nov 2024 01:15:35 +0300 Subject: [PATCH] Support retrieving ECS table statistics --- libs/ecs/include/psemek/ecs/container.hpp | 3 +++ libs/ecs/include/psemek/ecs/detail/column.hpp | 15 ++++++++++++++ .../include/psemek/ecs/detail/describe.hpp | 19 +++++++++++++++--- libs/ecs/include/psemek/ecs/detail/table.hpp | 1 + libs/ecs/include/psemek/ecs/statistics.hpp | 20 +++++++++++++++++++ libs/ecs/source/container.cpp | 12 +++++++++++ libs/ecs/source/detail/table.cpp | 12 +++++++++++ 7 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 libs/ecs/include/psemek/ecs/statistics.hpp diff --git a/libs/ecs/include/psemek/ecs/container.hpp b/libs/ecs/include/psemek/ecs/container.hpp index 98028110..f33ab6f1 100644 --- a/libs/ecs/include/psemek/ecs/container.hpp +++ b/libs/ecs/include/psemek/ecs/container.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -396,6 +397,8 @@ namespace psemek::ecs std::size_t table_count(); + struct statistics statistics(); + private: detail::entity_list entity_list_; detail::table_container table_container_; diff --git a/libs/ecs/include/psemek/ecs/detail/column.hpp b/libs/ecs/include/psemek/ecs/detail/column.hpp index a3f6dc43..d06472a2 100644 --- a/libs/ecs/include/psemek/ecs/detail/column.hpp +++ b/libs/ecs/include/psemek/ecs/detail/column.hpp @@ -54,6 +54,7 @@ namespace psemek::ecs::detail virtual std::size_t memory_usage() const = 0; + virtual std::string describe() const = 0; virtual std::string describe(std::uint32_t row) const = 0; virtual ~column() = default; @@ -90,6 +91,7 @@ namespace psemek::ecs::detail std::size_t memory_usage() const override; + std::string describe() const override; std::string describe(std::uint32_t row) const override; ~column_impl() override; @@ -118,6 +120,7 @@ namespace psemek::ecs::detail std::size_t memory_usage() const override; + std::string describe() const override; std::string describe(std::uint32_t row) const override; ~column_impl() override; @@ -215,6 +218,12 @@ namespace psemek::ecs::detail return sizeof(Component) * row_count_; } + template + std::string column_impl::describe() const + { + return detail::describe(); + } + template std::string column_impl::describe(std::uint32_t row) const { @@ -299,6 +308,12 @@ namespace psemek::ecs::detail return sizeof(Component); } + template + std::string column_impl::describe() const + { + return detail::describe(); + } + template std::string column_impl::describe(std::uint32_t) const { diff --git a/libs/ecs/include/psemek/ecs/detail/describe.hpp b/libs/ecs/include/psemek/ecs/detail/describe.hpp index 19f1b9ee..5c25051f 100644 --- a/libs/ecs/include/psemek/ecs/detail/describe.hpp +++ b/libs/ecs/include/psemek/ecs/detail/describe.hpp @@ -8,11 +8,11 @@ namespace psemek::ecs::detail { template - std::string describe(Component const & component) + std::string describe() { - if constexpr (requires {component.to_string();}) + if constexpr (requires {Component::to_string();}) { - return component.to_string(); + return Component::to_string(); } else { @@ -23,4 +23,17 @@ namespace psemek::ecs::detail } } + template + std::string describe(Component const & component) + { + if constexpr (requires {component.to_string();}) + { + return component.to_string(); + } + else + { + return describe(); + } + } + } diff --git a/libs/ecs/include/psemek/ecs/detail/table.hpp b/libs/ecs/include/psemek/ecs/detail/table.hpp index 29f2aee7..3e227eee 100644 --- a/libs/ecs/include/psemek/ecs/detail/table.hpp +++ b/libs/ecs/include/psemek/ecs/detail/table.hpp @@ -81,6 +81,7 @@ namespace psemek::ecs::detail std::size_t memory_usage() const; + std::string describe() const; std::string describe(std::uint32_t row) const; protected: diff --git a/libs/ecs/include/psemek/ecs/statistics.hpp b/libs/ecs/include/psemek/ecs/statistics.hpp new file mode 100644 index 00000000..bd3d8abf --- /dev/null +++ b/libs/ecs/include/psemek/ecs/statistics.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +namespace psemek::ecs +{ + + struct table_statistics + { + std::string description; + std::size_t entity_count; + }; + + struct statistics + { + std::vector tables; + }; + +} diff --git a/libs/ecs/source/container.cpp b/libs/ecs/source/container.cpp index 302df130..944a858d 100644 --- a/libs/ecs/source/container.cpp +++ b/libs/ecs/source/container.cpp @@ -138,4 +138,16 @@ namespace psemek::ecs return table_container_.table_count(); } + statistics container::statistics() + { + struct statistics result; + + table_container_.apply([&](detail::table & table) + { + result.tables.push_back({table.describe(), table.row_count()}); + }, {}, {}); + + return result; + } + } diff --git a/libs/ecs/source/detail/table.cpp b/libs/ecs/source/detail/table.cpp index 90b2fb37..aa4c185f 100644 --- a/libs/ecs/source/detail/table.cpp +++ b/libs/ecs/source/detail/table.cpp @@ -188,6 +188,18 @@ namespace psemek::ecs::detail return result; } + std::string table::describe() const + { + std::string result; + for (std::size_t i = 0; i < columns_.size(); ++i) + { + if (i > 0) + result += ";"; + result += columns_[i]->describe(); + } + return result; + } + std::string table::describe(std::uint32_t row) const { std::string result;