Iros
 
Loading...
Searching...
No Matches
uncurry.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/util.h"
7#include "di/types/in_place.h"
8#include "di/util/forward.h"
9#include "di/util/move.h"
14
15namespace di::function::detail {
16template<concepts::TupleLike Tup>
17constexpr auto tuple_forward(Tup&& tuple) {
18 return di::apply(
19 []<typename... Args>(Args&&... args) {
20 return di::forward_as_tuple<Args...>(di::forward<Args>(args)...);
21 },
22 di::forward<Tup>(tuple));
23}
24
25template<typename T>
26constexpr auto tuple_forward(T&& value) {
27 return di::forward_as_tuple<T>(di::forward<T>(value));
28}
29
30template<typename... Args>
31constexpr auto do_tuple_cat(Args&&... args) {
32 return di::tuple_cat(detail::tuple_forward(di::forward<Args>(args))...);
33}
34
35template<typename... Args>
37
38template<typename F, typename Tup>
40 requires(F&& function, Tup&& tuple) { di::apply(di::forward<F>(function), di::forward<Tup>(tuple)); };
41
42template<typename F, typename... Args>
43concept CanUncurry = TupleInvoceable<F, AsTuple<Args...>>;
44
45template<typename F>
47private:
48 F m_function;
49
50public:
51 template<typename Fn>
52 constexpr UncurryImpl(types::InPlace, Fn&& function) : m_function(di::forward<Fn>(function)) {}
53
54 constexpr UncurryImpl(UncurryImpl const&) = default;
55 constexpr UncurryImpl(UncurryImpl&&) = default;
56
57 constexpr auto operator=(UncurryImpl const&) -> UncurryImpl& = delete;
58 constexpr auto operator=(UncurryImpl&&) -> UncurryImpl& = delete;
59
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)...));
64 }
65
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)...));
70 }
71
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)...));
76 }
77
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)...));
82 }
83};
84
86 template<concepts::DecayConstructible F>
87 constexpr auto operator()(F&& function) const {
88 return UncurryImpl<meta::Decay<F>>(in_place, di::forward<F>(function));
89 }
90};
91}
92
93namespace di::function {
94constexpr inline auto uncurry = detail::UncurryFunction {};
95}
96
97namespace di {
99}
Definition uncurry.h:46
constexpr UncurryImpl(UncurryImpl &&)=default
constexpr UncurryImpl(types::InPlace, Fn &&function)
Definition uncurry.h:52
constexpr UncurryImpl(UncurryImpl const &)=default
constexpr auto operator=(UncurryImpl const &) -> UncurryImpl &=delete
constexpr auto operator=(UncurryImpl &&) -> UncurryImpl &=delete
Definition uncurry.h:43
Definition bind_back.h:16
constexpr auto tuple_forward(Tup &&tuple)
Definition uncurry.h:17
decltype(detail::do_tuple_cat(di::declval< Args >()...)) AsTuple
Definition uncurry.h:36
constexpr auto do_tuple_cat(Args &&... args)
Definition uncurry.h:31
Definition as_bool.h:8
constexpr auto uncurry
Definition uncurry.h:94
constexpr auto value
Definition value.h:34
Definition zstring_parser.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
constexpr auto operator()(F &&function) const
Definition uncurry.h:87
Definition in_place.h:4