Line data Source code
1 1 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : /// \file
5 : /// Defines functions for slicing tuples
6 :
7 : #pragma once
8 :
9 : #include <cstddef>
10 : #include <tuple>
11 : #include <utility>
12 :
13 : namespace tuple_impl_detail {
14 : template <size_t Start, typename Tuple, size_t... Is>
15 : constexpr std::tuple<std::tuple_element_t<Is + Start, std::decay_t<Tuple>>...>
16 : slice_impl(Tuple&& tuple, std::index_sequence<Is...> /*meta*/) {
17 : return {std::get<Is + Start>(std::forward<Tuple>(tuple))...};
18 : }
19 : } // namespace tuple_impl_detail
20 :
21 : /// \ingroup UtilitiesGroup
22 : /// The subset of elements in `tuple` from index `Start` to (excluding) `Stop`
23 : template <size_t Start, size_t Stop, typename Tuple>
24 1 : constexpr auto tuple_slice(Tuple&& tuple) {
25 : constexpr size_t tuple_size = std::tuple_size<std::decay_t<Tuple>>::value;
26 : static_assert(
27 : Start <= Stop and Stop <= tuple_size,
28 : "'Start' and 'Stop' must satisfy Start <= Stop <= size of 'Tuple'");
29 : return tuple_impl_detail::slice_impl<Start>(
30 : std::forward<Tuple>(tuple), std::make_index_sequence<Stop - Start>{});
31 : }
32 :
33 : /// \ingroup UtilitiesGroup
34 : /// The first `Size` elements in `tuple`
35 : template <size_t Size, typename Tuple>
36 1 : constexpr auto tuple_head(Tuple&& tuple) {
37 : constexpr size_t tuple_size = std::tuple_size<std::decay_t<Tuple>>::value;
38 : static_assert(Size <= tuple_size,
39 : "'Size' must not exceed the size of 'Tuple'");
40 : return tuple_slice<0, Size>(std::forward<Tuple>(tuple));
41 : }
42 :
43 : /// \ingroup UtilitiesGroup
44 : /// The last `Size` elements in `tuple`
45 : template <size_t Size, typename Tuple>
46 1 : constexpr auto tuple_tail(Tuple&& tuple) {
47 : constexpr size_t tuple_size = std::tuple_size<std::decay_t<Tuple>>::value;
48 : static_assert(Size <= tuple_size,
49 : "'Size' must not exceed the size of 'Tuple'");
50 : return tuple_slice<tuple_size - Size, tuple_size>(std::forward<Tuple>(tuple));
51 : }
|