1#ifndef TATOOINE_INVOKE_UNPACKED_H
2#define TATOOINE_INVOKE_UNPACKED_H
10template <
typename Container>
23template <
typename F,
typename T,
typename... Ts>
26 std::forward<Ts>(ts)...);
31template <std::size_t... Is,
typename F,
typename T,
typename... Ts>
35 std::forward<Ts>(ts)...);
39template <
typename F,
typename T,
typename... Ts>
42 std::forward<F>(f), std::move(t),
43 std::forward<Ts>(ts)...);
48template <
typename T,
size_t N>
50 static constexpr size_t n = N;
53 explicit constexpr unpack(std::array<T, N>& c) : container{c} {}
56 constexpr auto get() ->
auto& {
return container[I]; }
58 constexpr auto get() const -> const auto& {
return container[I]; }
61template <
typename T,
size_t N>
62unpack(std::array<T, N>& c)->unpack<std::array<T, N>>;
64template <
typename T,
size_t N>
65struct unpack<const std::array<T, N>> {
66 static constexpr size_t n = N;
70 explicit constexpr unpack(
const std::array<T, N>& c) : container{c} {}
74 constexpr auto get() const -> const auto& {
79template <
typename T,
size_t N>
80unpack(
const std::array<T, N>& c)->unpack<
const std::array<T, N>>;
83template <
typename... Ts>
85 static constexpr size_t n =
sizeof...(Ts);
88 explicit constexpr unpack(std::tuple<Ts...>&& c) : container{c} {}
91 constexpr auto get() ->
auto& {
92 return std::get<I>(container);
96 constexpr auto get() const -> const auto& {
97 return std::get<I>(container);
101template <
typename... Ts>
102unpack(std::tuple<Ts...>&& c)->unpack<std::tuple<Ts...>>;
105template <
typename... Ts>
107 static constexpr size_t n =
sizeof...(Ts);
110 explicit constexpr unpack(std::tuple<Ts...>&& c) : container{c} {}
113 constexpr auto get() const -> const auto& {
114 return std::get<I>(container);
118template <
typename... Ts>
119unpack(
const std::tuple<Ts...>& c)->unpack<
const std::tuple<Ts...>>;
122template <
typename A,
typename B>
124 static constexpr size_t n = 2;
127 explicit constexpr unpack(std::pair<A, B>& c) : container{c} {}
130 constexpr auto get() ->
auto& {
131 return std::get<I>(container);
135 constexpr auto get() const -> const auto& {
136 return std::get<I>(container);
140template <
typename A,
typename B>
141unpack(std::pair<A, B>& c)->unpack<std::pair<A, B>>;
144template <
typename A,
typename B>
146 static constexpr size_t n = 2;
149 explicit constexpr unpack(std::pair<A, B>&& c) : container{c} {}
152 constexpr auto get() const -> const auto& {
153 return std::get<I>(container);
157template <
typename A,
typename B>
158unpack(
const std::pair<A, B>& c)->unpack<
const std::pair<A, B>>;
Definition: algorithm.h:6
typename get_impl< Container, I >::type get
Definition: get.h:11
constexpr auto bind(F &&f, Args &&... args)
Binds first arguments of f (either all or only partially).
Definition: bind.h:10
constexpr decltype(auto) invoke_unpacked(F &&f)
All arguments are bound -> just call f.
Definition: invoke_unpacked.h:15
const std::array< T, N > & container
Definition: invoke_unpacked.h:67
constexpr auto get() const -> const auto &
Definition: invoke_unpacked.h:74
constexpr unpack(const std::array< T, N > &c)
Definition: invoke_unpacked.h:70
constexpr auto get() const -> const auto &
Definition: invoke_unpacked.h:152
const std::pair< A, B > & container
Definition: invoke_unpacked.h:147
constexpr unpack(std::pair< A, B > &&c)
Definition: invoke_unpacked.h:149
const std::tuple< Ts... > & container
Definition: invoke_unpacked.h:108
constexpr auto get() const -> const auto &
Definition: invoke_unpacked.h:113
constexpr unpack(std::tuple< Ts... > &&c)
Definition: invoke_unpacked.h:110
std::array< T, N > & container
Definition: invoke_unpacked.h:51
constexpr unpack(std::array< T, N > &c)
Definition: invoke_unpacked.h:53
constexpr auto get() -> auto &
Definition: invoke_unpacked.h:56
constexpr auto get() const -> const auto &
Definition: invoke_unpacked.h:58
constexpr unpack(std::pair< A, B > &c)
Definition: invoke_unpacked.h:127
std::pair< A, B > & container
Definition: invoke_unpacked.h:125
constexpr auto get() const -> const auto &
Definition: invoke_unpacked.h:135
constexpr auto get() -> auto &
Definition: invoke_unpacked.h:130
constexpr auto get() const -> const auto &
Definition: invoke_unpacked.h:96
constexpr auto get() -> auto &
Definition: invoke_unpacked.h:91
std::tuple< Ts... > & container
Definition: invoke_unpacked.h:86
constexpr unpack(std::tuple< Ts... > &&c)
Definition: invoke_unpacked.h:88
Definition: invoke_unpacked.h:11