From fb55337487e44f0ad091e52595dacabb150ac210 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Tue, 15 Nov 2022 23:31:21 +0100 Subject: entity: more metaprogramming --- src/entity.hpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/entity.hpp b/src/entity.hpp index 3c32ea23..51698651 100644 --- a/src/entity.hpp +++ b/src/entity.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include namespace floormat {} @@ -314,14 +315,28 @@ struct except_nth_<0, parameter_pack, X> { template using except_nth = typename except_nth_, T>::type; -template -struct sort_tuple_; - -template class Tuple, typename... Ts> -struct sort_tuple_> { +template +struct sort_tuple_ { + template + static consteval auto sort_indices(const Tuple& tuple, const std::index_sequence&) { + std::array indices = { Is..., }; + using KeyT = decltype(KeyFn(std::get<0>(tuple))); + std::array keys = { KeyFn(std::get(tuple))..., }; + std::sort(indices.begin(), indices.end(), [&](std::size_t a, std::size_t b) { return Comp(keys[a], keys[b]); }); + return indices; + } + template + struct helper { + template + static consteval auto do_sort(const Tuple& tuple, const std::index_sequence&) { + return std::make_tuple(std::get(tuple)...); + } + }; }; + + } // namespace detail template -- cgit v1.2.3