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// SPDX-FileCopyrightText: Copyright (C) 2024 Tobias Hienzsch
3
4#ifndef TETL_TUPLE_TUPLE_CAT_HPP
5#define TETL_TUPLE_TUPLE_CAT_HPP
6
7#include <etl/_cstddef/size_t.hpp>
8#include <etl/_tuple/forward_as_tuple.hpp>
9#include <etl/_tuple/tuple_like.hpp>
10#include <etl/_tuple/tuple_size.hpp>
11#include <etl/_type_traits/remove_reference.hpp>
12#include <etl/_utility/forward.hpp>
13#include <etl/_utility/index_sequence.hpp>
14
15namespace etl {
16
17namespace detail {
18
19inline constexpr struct tuple_cat {
20 template <etl::tuple_like T1, etl::tuple_like T2, etl::size_t... I1, etl::size_t... I2>
21 [[nodiscard]] constexpr auto
22 concat(T1&& t1, T2&& t2, etl::index_sequence<I1...> /*i1*/, etl::index_sequence<I2...> /*i2*/) const
23 {
24 using etl::get;
25 return etl::forward_as_tuple(get<I1>(etl::forward<T1>(t1))..., get<I2>(etl::forward<T2>(t2))...);
26 }
27
28 template <etl::tuple_like Result>
29 [[nodiscard]] constexpr auto operator()(Result&& result) const
30 {
31 return [&]<etl::size_t... Is>(etl::index_sequence<Is...> /*is*/) {
32 using etl::get;
33 return etl::tuple{get<Is>(etl::forward<Result>(result))...};
34 }(etl::make_index_sequence<etl::tuple_size_v<etl::remove_reference_t<Result>>>{});
35 }
36
37 template <etl::tuple_like Result, etl::tuple_like Head, etl::tuple_like... Tail>
38 [[nodiscard]] constexpr auto operator()(Result&& result, Head&& head, Tail&&... tail) const
39 {
40 constexpr auto idx1 = etl::make_index_sequence<etl::tuple_size_v<etl::remove_reference_t<Result>>>{};
41 constexpr auto idx2 = etl::make_index_sequence<etl::tuple_size_v<etl::remove_reference_t<Head>>>{};
42 return (*this)(
43 concat(etl::forward<Result>(result), etl::forward<Head>(head), idx1, idx2),
44 etl::forward<Tail>(tail)...
45 );
46 }
47} tuple_cat;
48
49} // namespace detail
50
51template <etl::tuple_like... Tuples>
52[[nodiscard]] constexpr auto tuple_cat(Tuples&&... ts)
53{
54 return etl::detail::tuple_cat(etl::forward<Tuples>(ts)...);
55}
56
57} // namespace etl
58
59#endif // TETL_TUPLE_TUPLE_CAT_HPP
Definition adjacent_find.hpp:9
constexpr auto tuple_cat(Tuples &&... ts)
Definition tuple_cat.hpp:52
Definition tuple.hpp:114