15namespace di::function::detail {
16template<concepts::TupleLike Tup>
17constexpr auto tuple_forward(Tup&& tuple) {
19 []<
typename... Args>(Args&&... args) {
22 di::forward<Tup>(tuple));
26constexpr auto tuple_forward(T&&
value) {
30template<
typename... Args>
31constexpr auto do_tuple_cat(Args&&... args) {
32 return di::tuple_cat(detail::tuple_forward(di::forward<Args>(args))...);
35template<
typename... Args>
38template<
typename F,
typename Tup>
39concept TupleInvoceable =
40 requires(F&& function, Tup&& tuple) {
di::apply(di::forward<F>(function), di::forward<Tup>(tuple)); };
42template<
typename F,
typename... Args>
43concept CanUncurry = TupleInvoceable<F, AsTuple<Args...>>;
46class UncurryImpl :
public pipeline::EnablePipeline {
52 constexpr UncurryImpl(types::InPlace, Fn&& function) : m_function(di::forward<Fn>(function)) {}
54 constexpr UncurryImpl(UncurryImpl
const&) =
default;
55 constexpr UncurryImpl(UncurryImpl&&) =
default;
57 constexpr auto operator=(UncurryImpl
const&) -> UncurryImpl& =
delete;
58 constexpr auto operator=(UncurryImpl&&) -> UncurryImpl& =
delete;
60 template<
typename... Args>
61 requires(CanUncurry<F&, Args...>)
62 constexpr auto operator()(Args&&... args) & ->
decltype(
auto) {
63 return di::apply(m_function, detail::do_tuple_cat(di::forward<Args>(args)...));
66 template<
typename... Args>
67 requires(CanUncurry<F
const&, Args...>)
68 constexpr auto operator()(Args&&... args)
const& ->
decltype(
auto) {
69 return di::apply(m_function, detail::do_tuple_cat(di::forward<Args>(args)...));
72 template<
typename... Args>
73 requires(CanUncurry<F &&, Args...>)
74 constexpr auto operator()(Args&&... args) && ->
decltype(
auto) {
75 return di::apply(di::move(m_function), detail::do_tuple_cat(di::forward<Args>(args)...));
78 template<
typename... Args>
79 requires(CanUncurry<F
const &&, Args...>)
80 constexpr auto operator()(Args&&... args)
const&& ->
decltype(
auto) {
81 return di::apply(di::move(m_function), detail::do_tuple_cat(di::forward<Args>(args)...));
85struct UncurryFunction {
86 template<concepts::DecayConstructible F>
87 constexpr auto operator()(F&& function)
const {
88 return UncurryImpl<meta::Decay<F>>(
in_place, di::forward<F>(function));
94constexpr inline auto uncurry = detail::UncurryFunction {};
constexpr auto uncurry
Definition uncurry.h:94
constexpr auto value
Definition value.h:34
Definition any_storable.h:9
constexpr auto tuple_cat(Tups &&... tuples)
Definition tuple_cat.h:11
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
constexpr auto forward_as_tuple(Args &&... args) -> Tuple< Args &&... >
Definition forward_as_tuple.h:8
constexpr auto in_place
Definition in_place.h:8