From 7ae816299ab64df44990381323c340722e7791f7 Mon Sep 17 00:00:00 2001 From: namark <namark@disroot.org> Date: Mon, 31 May 2021 00:58:05 +0400 Subject: [PATCH] Stop complaining all over the place, and complain in just one place. --- source/simple/support/function_utils.hpp | 10 ++++++++ .../simple/support/tuple_utils/apply_for.hpp | 23 ++++++++----------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/source/simple/support/function_utils.hpp b/source/simple/support/function_utils.hpp index e575810..65db44e 100644 --- a/source/simple/support/function_utils.hpp +++ b/source/simple/support/function_utils.hpp @@ -34,6 +34,16 @@ namespace simple { namespace support template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; + // std::invoke is not constexpr, until c++20 -_- + template< class F, class... Args> + constexpr std::invoke_result_t<F, Args...> + invoke(F&& f, Args&&... args) + noexcept(std::is_nothrow_invocable_v<F,Args...>) + { + return std::apply(std::forward<F>(f), + std::forward_as_tuple(std::forward<Args>(args)...)); + } + }} // namespace simple.support #endif /* end of include guard */ diff --git a/source/simple/support/tuple_utils/apply_for.hpp b/source/simple/support/tuple_utils/apply_for.hpp index 4799b1c..e1a1563 100644 --- a/source/simple/support/tuple_utils/apply_for.hpp +++ b/source/simple/support/tuple_utils/apply_for.hpp @@ -5,6 +5,7 @@ #include <functional> #include <cassert> #include "../range.hpp" +#include "../function_utils.hpp" #include "common.hpp" namespace simple::support @@ -32,17 +33,15 @@ namespace simple::support { using std::remove_reference_t; using First_t = remove_reference_t<First>; - using std::apply; using std::get; using std::tuple_element_t; using std::forward; static_assert(I >= 0 && I < std::tuple_size_v<First_t>); if(I == index) - // std::invoke is not constexpr -_- - return apply(forward<F>(f), std::forward_as_tuple( - forward<tuple_element_t<I, First_t>>(get<I>(first)), - forward<tuple_element_t<I, remove_reference_t<Rest>>>(get<I>(rest))... - )); + return support::invoke(forward<F>(f), + get<I>(std::forward<First>(first)), + get<I>(std::forward<Rest>(rest))... + ); if constexpr (I > 0) return apply_for<F, decltype(forward<First_t>(first)), I - 1>(index, forward<F>(f), forward<First_t>(first), forward<remove_reference_t<Rest>>(rest)...); @@ -99,7 +98,7 @@ namespace simple::support constexpr decltype(auto) transform(F&& f) //TODO: noexcept(-_-) { - return std::apply(std::forward<F>(f)); + return support::invoke(std::forward<F>(f)); } template<size_t Index, typename F, typename... Tuples, @@ -112,10 +111,9 @@ namespace simple::support decltype(auto) transform(F&& f, Tuples&&... tuples) //TODO: noexcept(-_-) { - // std::invoke is not contexpr in C++17 :V auto info = iteration_state<Index, min_tuple_index_sequence<Tuples...>>{}; - return std::apply(std::forward<F>(f), - std::forward_as_tuple(info, get<Index>(std::forward<Tuples>(tuples))...) ); + return support::invoke(std::forward<F>(f), + info, get<Index>(std::forward<Tuples>(tuples))... ); } template<size_t Index, typename F, typename... Tuples, @@ -126,9 +124,8 @@ namespace simple::support decltype(auto) transform(F&& f, Tuples&&... tuples) //TODO: noexcept(-_-) { - // std::invoke is not contexpr in C++17 :V - return std::apply(std::forward<F>(f), - std::forward_as_tuple(get<Index>(std::forward<Tuples>(tuples))...) ); + return support::invoke(std::forward<F>(f), + get<Index>(std::forward<Tuples>(tuples))... ); } template<typename F, typename... Tuples, size_t... Indecies, -- GitLab