di
0.1.0
Loading...
Searching...
No Matches
tuple_cat.h
Go to the documentation of this file.
1
#pragma once
2
3
#include "
di/function/overload.h
"
4
#include "
di/function/unpack.h
"
5
#include "
di/function/ycombinator.h
"
6
#include "
di/vocab/tuple/apply.h
"
7
#include "
di/vocab/tuple/tuple.h
"
8
9
namespace
di::vocab
{
10
template
<concepts::TupleLike... Tups>
11
constexpr
auto
tuple_cat
(Tups&&... tuples) {
12
auto
helper =
function::overload
(
13
[] {
14
return
Tuple<>
{};
15
},
16
[](
auto
&& x) {
17
return
x;
18
},
19
[]<
typename
X,
typename
Y>(X&& x, Y&& y) {
20
return
function::unpack<meta::MakeIndexSequence<meta::TupleSize<X>
>>([&]<
size_t
... xs>(
meta::ListV
<xs...>) {
21
return
function::unpack<meta::MakeIndexSequence<meta::TupleSize<Y>
>>(
22
[&]<
size_t
... ys>(
meta::ListV
<ys...>) {
23
return
Tuple<meta::TupleElement<meta::RemoveCVRef<X>
, xs>...,
24
meta::TupleElement<meta::RemoveCVRef<Y>
, ys>...> {
25
// NOLINTNEXTLINE(bugprone-use-after-move)
26
util::get<xs>
(util::forward<X>(x))...,
util::get<ys>
(util::forward<Y>(y))...
27
};
28
});
29
});
30
},
31
[]<
typename
X,
typename
Y,
typename
... Rs>(X&& x, Y&& y, Rs&&... rest) {
32
return
tuple_cat
(
tuple_cat
(util::forward<X>(x), util::forward<Y>(y)), util::forward<Rs>(rest)...);
33
});
34
return
helper(util::forward<Tups>(tuples)...);
35
}
36
}
37
38
namespace
di
{
39
using
vocab::tuple_cat
;
40
}
apply.h
di::vocab::Tuple
Definition
tuple.h:27
di::function::unpack
constexpr auto unpack
Definition
unpack.h:24
di::function::overload
constexpr auto overload
Definition
overload.h:28
di::meta::TupleElement
decltype(vocab::tuple_element(types::in_place_type< meta::RemoveReference< T > >, c_< index >))::Type TupleElement
Definition
tuple_element.h:21
di::util::get
constexpr auto get(T &&value) -> decltype(auto)
Definition
get.h:8
di::vocab
Definition
lazy.h:165
di::vocab::tuple_cat
constexpr auto tuple_cat(Tups &&... tuples)
Definition
tuple_cat.h:11
di
Definition
any_storable.h:9
overload.h
di::meta::ListV
Definition
core.h:8
unpack.h
tuple.h
ycombinator.h
di
vocab
tuple
tuple_cat.h
Generated by
1.13.2