SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
tuple_utility.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 <utility>
16 
20 
21 
22 namespace seqan3::detail
23 {
24 
38 template <size_t beg,
39  template <typename ...> typename tuple_t,
40  size_t ... Is,
41  typename ...ts>
43  requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
45 constexpr auto tuple_split(tuple_t<ts...> const & t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
46 {
47  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::get<beg + Is>(t)...};
48 }
49 
51 template <size_t beg,
52  template <typename ...> typename tuple_t,
53  size_t ... Is,
54  typename ...ts>
56  requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
58 constexpr auto tuple_split(tuple_t<ts...> && t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
59 {
60  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::move(std::get<beg + Is>(t))...};
61 }
62 } // namespace seqan3::detail
63 
64 namespace seqan3
65 {
98 template <size_t pivot_c, template <typename ...> typename tuple_t, typename ...ts>
100  requires tuple_like<tuple_t<ts...>>
102 constexpr auto tuple_split(tuple_t<ts...> const & t)
103 {
104  static_assert(pivot_c <= sizeof...(ts));
105 
106  return tuple_t{detail::tuple_split<0>(t, std::make_index_sequence<pivot_c>{}),
107  detail::tuple_split<pivot_c>(t, std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
108 }
109 
111 template <size_t pivot_c, template <typename ...> typename tuple_t, typename ...ts>
113  requires tuple_like<tuple_t<ts...>>
115 constexpr auto tuple_split(tuple_t<ts...> && t)
116 {
117  static_assert(pivot_c <= sizeof...(ts));
118 
119  return tuple_t{detail::tuple_split<0>(std::move(t), std::make_index_sequence<pivot_c>{}),
120  detail::tuple_split<pivot_c>(std::move(t), std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
121 }
122 
149 template <typename pivot_t, tuple_like tuple_t>
150 constexpr auto tuple_split(tuple_t && t)
151 {
152  constexpr size_t pivot_c = list_traits::find<pivot_t, detail::tuple_type_list_t<std::remove_cvref_t<tuple_t>>>;
153 
154  static_assert(pivot_c <= std::tuple_size_v<std::remove_cvref_t<tuple_t>>);
155 
156  return tuple_split<pivot_c>(std::forward<tuple_t>(t));
157 }
158 
179 template <tuple_like tuple_t>
180 constexpr auto tuple_pop_front(tuple_t && t)
181 {
183 
184  return std::get<1>(tuple_split<1>(std::forward<tuple_t>(t)));
185 }
187 
188 } // namespace seqan3
constexpr auto tuple_pop_front(tuple_t &&t)
Removes the first element of a tuple.
Definition: tuple_utility.hpp:180
constexpr auto tuple_split(tuple_t< ts... > const &t)
Splits a tuple like data structure at the given position.
Definition: tuple_utility.hpp:102
constexpr auto tuple_split(tuple_t< ts... > const &t, std::index_sequence< Is... > const &idx)
Helper function for seqan3::tuple_split.
Definition: tuple_utility.hpp:45
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:70
Whether a type behaves like a tuple.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
T tuple_size_v
Provides seqan3::tuple_like.
Provides seqan3::pod_tuple.
Provides traits for seqan3::type_list.