From 604b4ae5720836cb4ee9a66085d3290067c63c84 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Tue, 15 Nov 2022 09:19:04 +0100 Subject: entity: add visit_tuple --- src/entity.hpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/entity.hpp b/src/entity.hpp index 1c055ce7..ba165662 100644 --- a/src/entity.hpp +++ b/src/entity.hpp @@ -1,9 +1,10 @@ #pragma once #include "compat/integer-types.hpp" -#include #include #include #include +#include +#include namespace floormat {} @@ -128,6 +129,29 @@ struct Entity final { }; }; +namespace detail { +template +requires std::invocable(std::declval()))> +constexpr CORRADE_ALWAYS_INLINE void visit_tuple(F&& fun, Tuple&& tuple) +{ + using Size = std::tuple_size>; + static_assert(N < Size()); + + fun(std::get(tuple)); + if constexpr(N+1 < Size()) + visit_tuple(std::forward(fun), std::forward(tuple)); +} + +} // namespace detail + +template +constexpr void visit_tuple(F&& fun, Tuple&& tuple) +{ + using Size = std::tuple_size>; + if constexpr(Size() > 0) + detail::visit_tuple(std::forward(fun), std::forward(tuple)); +} + enum class erased_field_type : std::uint32_t { none, string, -- cgit v1.2.3