tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
tuple_cat.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_TUPLE_TUPLE_CAT_HPP
4#define TETL_TUPLE_TUPLE_CAT_HPP
5
13
14namespace etl {
15
16namespace detail {
17
18inline constexpr struct tuple_cat {
19 template <etl::tuple_like T1, etl::tuple_like T2, etl::size_t... I1, etl::size_t... I2>
20 [[nodiscard]] constexpr auto
21 concat(T1&& t1, T2&& t2, etl::index_sequence<I1...> /*i1*/, etl::index_sequence<I2...> /*i2*/) const
22 {
23 using etl::get;
24 return etl::forward_as_tuple(get<I1>(etl::forward<T1>(t1))..., get<I2>(etl::forward<T2>(t2))...);
25 }
26
27 template <etl::tuple_like Result>
28 [[nodiscard]] constexpr auto operator()(Result&& result) const
29 {
30 return [&]<etl::size_t... Is>(etl::index_sequence<Is...> /*is*/) {
31 using etl::get;
32 return etl::tuple{get<Is>(etl::forward<Result>(result))...};
34 }
35
36 template <etl::tuple_like Result, etl::tuple_like Head, etl::tuple_like... Tail>
37 [[nodiscard]] constexpr auto operator()(Result&& result, Head&& head, Tail&&... tail) const
38 {
41 return (*this)(
42 concat(etl::forward<Result>(result), etl::forward<Head>(head), idx1, idx2),
43 etl::forward<Tail>(tail)...
44 );
45 }
46} tuple_cat;
47
48} // namespace detail
49
50template <etl::tuple_like... Tuples>
51[[nodiscard]] constexpr auto tuple_cat(Tuples&&... ts)
52{
53 return etl::detail::tuple_cat(etl::forward<Tuples>(ts)...);
54}
55
56} // namespace etl
57
58#endif // TETL_TUPLE_TUPLE_CAT_HPP
Definition adjacent_find.hpp:8
etl::make_integer_sequence< etl::size_t, Size > make_index_sequence
Definition index_sequence.hpp:15
constexpr auto get(complex< X > &z) noexcept -> X &
Definition complex.hpp:92
constexpr auto tuple_cat(Tuples &&... ts)
Definition tuple_cat.hpp:51
etl::integer_sequence< etl::size_t, Ints... > index_sequence
Definition index_sequence.hpp:12
constexpr auto forward_as_tuple(Args &&... args) noexcept -> etl::tuple< Args &&... >
Constructs a tuple of references to the arguments in args suitable for forwarding as an argument to a...
Definition forward_as_tuple.hpp:18
constexpr auto forward(remove_reference_t< T > &param) noexcept -> T &&
Forwards lvalues as either lvalues or as rvalues, depending on T. When t is a forwarding reference (a...
Definition forward.hpp:18
TETL_BUILTIN_SIZET size_t
etl::size_t is the unsigned integer type of the result of the sizeof operator.
Definition size_t.hpp:14