SeqAn3  3.0.2
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 namespace seqan3::detail
22 {
23 
37 template <size_t beg,
38  template <typename ...> typename tuple_t,
39  size_t ... Is,
40  typename ...ts>
42  requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
44 constexpr auto tuple_split(tuple_t<ts...> const & t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
45 {
46  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::get<beg + Is>(t)...};
47 }
48 
50 template <size_t beg,
51  template <typename ...> typename tuple_t,
52  size_t ... Is,
53  typename ...ts>
55  requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
57 constexpr auto tuple_split(tuple_t<ts...> && t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
58 {
59  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::move(std::get<beg + Is>(t))...};
60 }
61 } // namespace seqan3::detail
62 
63 namespace seqan3
64 {
97 template <size_t pivot_c, template <typename ...> typename tuple_t, typename ...ts>
99  requires tuple_like<tuple_t<ts...>>
101 constexpr auto tuple_split(tuple_t<ts...> const & t)
102 {
103  static_assert(pivot_c <= sizeof...(ts));
104 
105  return tuple_t{detail::tuple_split<0>(t, std::make_index_sequence<pivot_c>{}),
106  detail::tuple_split<pivot_c>(t, std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
107 }
108 
110 template <size_t pivot_c, template <typename ...> typename tuple_t, typename ...ts>
112  requires tuple_like<tuple_t<ts...>>
114 constexpr auto tuple_split(tuple_t<ts...> && t)
115 {
116  static_assert(pivot_c <= sizeof...(ts));
117 
118  return tuple_t{detail::tuple_split<0>(std::move(t), std::make_index_sequence<pivot_c>{}),
119  detail::tuple_split<pivot_c>(std::move(t), std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
120 }
121 
148 template <typename pivot_t, tuple_like tuple_t>
149 constexpr auto tuple_split(tuple_t && t)
150 {
151  constexpr size_t pivot_c = list_traits::find<pivot_t, detail::tuple_type_list_t<std::remove_cvref_t<tuple_t>>>;
152 
153  static_assert(pivot_c <= std::tuple_size_v<std::remove_cvref_t<tuple_t>>);
154 
155  return tuple_split<pivot_c>(std::forward<tuple_t>(t));
156 }
157 
178 template <tuple_like tuple_t>
179 constexpr auto tuple_pop_front(tuple_t && t)
180 {
182 
183  return std::get<1>(tuple_split<1>(std::forward<tuple_t>(t)));
184 }
186 
187 } // namespace seqan3
seqan3::tuple_split
constexpr auto tuple_split(tuple_t< ts... > const &t)
Splits a tuple like data structure at the given position.
Definition: tuple_utility.hpp:101
utility
pod_tuple.hpp
Provides seqan3::pod_tuple.
tuple.hpp
Provides seqan3::tuple_like.
std::index_sequence
seqan3::views::move
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
tuple_like
Whether a type behaves like a tuple.
std::remove_cvref_t
traits.hpp
Provides traits for seqan3::type_list.
seqan3::tuple_pop_front
constexpr auto tuple_pop_front(tuple_t &&t)
Removes the first element of a tuple.
Definition: tuple_utility.hpp:179
std::tuple_size_v
T tuple_size_v