Flow
Documentation for the Flow C++ Library
Loading...
Searching...
No Matches
flow_tuple.h
Go to the documentation of this file.
1
#pragma once
2
3
namespace
flow
{
4
template
<
typename
... Ts>
5
class
Tuple
{
6
public
:
7
constexpr
std::size_t
size
()
const
{
8
return
0;
9
}
10
};
11
12
template
<
typename
T,
typename
... Ts>
13
class
Tuple
<T, Ts...> :
Tuple
<Ts...> {
14
using
BaseType
=
Tuple
<Ts...>;
15
T
value_
;
16
17
public
:
18
constexpr
Tuple
()
19
:
BaseType
{},
value_
{} {
20
}
21
22
template
<
typename
Arg1,
typename
...Args2>
23
explicit
constexpr
Tuple
(Arg1&& value, Args2&&... values)
24
:
BaseType
(std::forward<Args2>(values)...),
value_
(std::forward<Arg1>(value)) {
25
}
26
27
constexpr
std::size_t
size
()
const
{
28
return
sizeof
...(Ts) + 1;
29
}
30
31
template
<std::
size_t
N>
32
auto
&
get
() {
33
if
constexpr
(N == 0) {
34
return
value_
;
35
}
else
{
36
return
BaseType::get<N - 1>();
37
}
38
}
39
40
template
<std::
size_t
N>
41
const
auto
&
get
()
const
{
42
if
constexpr
(N == 0) {
43
return
value_
;
44
}
else
{
45
return
BaseType::get<N - 1>();
46
}
47
}
48
};
49
50
template
<
typename
T,
typename
...Ts>
51
Tuple
(T&&, Ts&&...) ->
Tuple
<T, Ts...>;
52
53
54
56
//namespace detail {
57
// template <typename T>
58
// struct IsTuple : std::false_type {};
59
60
// template <typename ...Ts>
61
// struct IsTuple<Tuple<Ts...>> : std::true_type {};
62
//}
63
64
//template <typename T>
65
//constexpr bool is_tuple_v = detail::IsTuple<std::decay_t<T>>::value;
66
68
//namespace detail {
69
// template <typename T>
70
// struct TupleSize {};
71
72
// template <typename ...Ts>
73
// struct TupleSize<Tuple<Ts...>> {
74
// static constexpr std::size_t value = sizeof...(Ts);
75
// };
76
//}
77
78
//template <typename T>
79
//constexpr std::size_t tuple_size_v = detail::TupleSize<std::decay_t<T>>::value;
80
82
//namespace detail {
83
// template <typename T, typename ...Ts>
84
// struct MergedTuple {
85
// static_assert(is_tuple_v<T> && sizeof...(Ts) == 0, "concatenate non-tuple types");
86
// using type = T;
87
// };
88
89
// template <typename ...Ts1, typename ...Ts2, typename ...Tuples>
90
// struct MergedTuple<Tuple<Ts1...>, Tuple<Ts2...>, Tuples...> {
91
// using type = MergedTuple<Tuple<Ts1..., Ts2...>, Tuples...>::type;
92
// };
93
//}
94
95
//template <typename ...Ts>
96
//using merged_tuple_t = detail::MergedTuple<std::decay_t<Ts>...>::type;
97
99
//template<typename T1, typename T2>
100
//merged_tuple_t<T1, T2> merge_tuple(T1&& t1, T2&& t2) {
101
// return [&]<std::size_t ...INDEX1, std::size_t ...INDEX2>
102
// (std::index_sequence<INDEX1...>, std::index_sequence<INDEX2...>) {
103
// return merged_tuple_t<T1, T2>{
104
// std::move(t1).template get<INDEX1>()...,
105
// std::move(t2).template get<INDEX2>()...
106
// };
107
// }(std::make_index_sequence<tuple_size_v<T1>>(), std::make_index_sequence<tuple_size_v<T2>>());
108
//}
109
}
flow::Tuple< T, Ts... >::BaseType
Tuple< Ts... > BaseType
Definition
flow_tuple.h:14
flow::Tuple< T, Ts... >::Tuple
constexpr Tuple()
Definition
flow_tuple.h:18
flow::Tuple< T, Ts... >::size
constexpr std::size_t size() const
Definition
flow_tuple.h:27
flow::Tuple< T, Ts... >::Tuple
constexpr Tuple(Arg1 &&value, Args2 &&... values)
Definition
flow_tuple.h:23
flow::Tuple< T, Ts... >::get
auto & get()
Definition
flow_tuple.h:32
flow::Tuple< T, Ts... >::get
const auto & get() const
Definition
flow_tuple.h:41
flow::Tuple< T, Ts... >::value_
T value_
Definition
flow_tuple.h:15
flow::Tuple
Definition
flow_tuple.h:5
flow::Tuple::size
constexpr std::size_t size() const
Definition
flow_tuple.h:7
flow
Definition
flow_arena_memory_resource.h:8
flow::Tuple
Tuple(T &&, Ts &&...) -> Tuple< T, Ts... >
flow_tuple.h
Generated by
1.14.0