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
3namespace 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...>;
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}
Tuple< Ts... > BaseType
Definition flow_tuple.h:14
constexpr std::size_t size() const
Definition flow_tuple.h:27
constexpr Tuple(Arg1 &&value, Args2 &&... values)
Definition flow_tuple.h:23
const auto & get() const
Definition flow_tuple.h:41
constexpr std::size_t size() const
Definition flow_tuple.h:7
Tuple(T &&, Ts &&...) -> Tuple< T, Ts... >