SeqAn3  3.0.0
The Modern C++ library for sequence analysis.
tuple_utility.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2019, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2019, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <meta/meta.hpp>
16 
17 #include <utility>
18 
24 
25 namespace seqan3::detail
26 {
27 
41 template <size_t beg,
42  template <typename ...> typename tuple_t,
43  size_t ... Is,
44  typename ...ts>
46  requires TupleLike<tuple_t<ts...>> && TupleLike<tuple_t<>>
48 constexpr auto tuple_split(tuple_t<ts...> const & t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
49 {
50  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::get<beg + Is>(t)...};
51 }
52 
54 template <size_t beg,
55  template <typename ...> typename tuple_t,
56  size_t ... Is,
57  typename ...ts>
59  requires TupleLike<tuple_t<ts...>> && TupleLike<tuple_t<>>
61 constexpr auto tuple_split(tuple_t<ts...> && t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
62 {
63  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::move(std::get<beg + Is>(t))...};
64 }
65 } // namespace seqan3::detail
66 
67 namespace seqan3
68 {
101 template <size_t pivot_c, template <typename ...> typename tuple_t, typename ... ts>
103  requires TupleLike<tuple_t<ts...>>
105 constexpr auto tuple_split(tuple_t<ts...> const & t)
106 {
107  static_assert(pivot_c <= sizeof...(ts));
108 
109  return tuple_t{detail::tuple_split<0>(t, std::make_index_sequence<pivot_c>{}),
110  detail::tuple_split<pivot_c>(t, std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
111 }
112 
114 template <size_t pivot_c, template <typename ...> typename tuple_t, typename ... ts>
116  requires TupleLike<tuple_t<ts...>>
118 constexpr auto tuple_split(tuple_t<ts...> && t)
119 {
120  static_assert(pivot_c <= sizeof...(ts));
121 
122  return tuple_t{detail::tuple_split<0>(std::move(t), std::make_index_sequence<pivot_c>{}),
123  detail::tuple_split<pivot_c>(std::move(t), std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
124 }
125 
152 template <typename pivot_t, TupleLike tuple_t>
153 constexpr auto tuple_split(tuple_t && t)
154 {
155  constexpr size_t pivot_c = meta::find_index<detail::tuple_type_list_t<remove_cvref_t<tuple_t>>, pivot_t>::value;
156 
157  static_assert(pivot_c <= std::tuple_size_v<remove_cvref_t<tuple_t>>);
158 
159  return tuple_split<pivot_c>(std::forward<tuple_t>(t));
160 }
161 
182 template <TupleLike tuple_t>
183 constexpr auto tuple_pop_front(tuple_t && t)
184 {
185  static_assert(std::tuple_size_v<remove_cvref_t<tuple_t>> > 0);
186 
187  return std::get<1>(tuple_split<1>(std::forward<tuple_t>(t)));
188 }
190 
191 } // namespace seqan3
constexpr auto tuple_split(tuple_t< ts... > const &t)
Splits a tuple like data structure at the given position.
Definition: tuple_utility.hpp:105
Provides seqan3::type_list and auxiliary type traits.
The main SeqAn3 namespace.
Provides seqan3::pod_tuple.
Provides seqan3::type_list and auxiliary type traits.
Provides seqan3::TupleLike.
T tuple_size_v
Definition: aligned_sequence_concept.hpp:35
Provides various type traits on generic types.
constexpr auto tuple_pop_front(tuple_t &&t)
Removes the first element of a tuple.
Definition: tuple_utility.hpp:183