SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
split.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, 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 
19 
20 namespace seqan3::detail
21 {
22 
36 template <size_t beg, template <typename...> typename tuple_t, size_t... Is, typename... ts>
37  requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
38 constexpr auto tuple_split(tuple_t<ts...> const & t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
39 {
40  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::get<beg + Is>(t)...};
41 }
42 
44 template <size_t beg, template <typename...> typename tuple_t, size_t... Is, typename... ts>
45  requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
46 constexpr auto tuple_split(tuple_t<ts...> && t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
47 {
48  return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::move(std::get<beg + Is>(t))...};
49 }
50 } // namespace seqan3::detail
51 
52 namespace seqan3
53 {
82 template <size_t pivot_c, template <typename...> typename tuple_t, typename... ts>
83  requires tuple_like<tuple_t<ts...>>
84 constexpr auto tuple_split(tuple_t<ts...> const & t)
85 {
86  static_assert(pivot_c <= sizeof...(ts));
87 
88  return tuple_t{detail::tuple_split<0>(t, std::make_index_sequence<pivot_c>{}),
89  detail::tuple_split<pivot_c>(t, std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
90 }
91 
93 template <size_t pivot_c, template <typename...> typename tuple_t, typename... ts>
94  requires tuple_like<tuple_t<ts...>>
95 constexpr auto tuple_split(tuple_t<ts...> && t)
96 {
97  static_assert(pivot_c <= sizeof...(ts));
98 
99  return tuple_t{detail::tuple_split<0>(std::move(t), std::make_index_sequence<pivot_c>{}),
100  detail::tuple_split<pivot_c>(std::move(t), std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
101 }
102 
129 template <typename pivot_t, tuple_like tuple_t>
130 constexpr auto tuple_split(tuple_t && t)
131 {
132  constexpr size_t pivot_c = list_traits::find<pivot_t, detail::tuple_type_list_t<std::remove_cvref_t<tuple_t>>>;
133 
134  static_assert(pivot_c <= std::tuple_size_v<std::remove_cvref_t<tuple_t>>);
135 
136  return tuple_split<pivot_c>(std::forward<tuple_t>(t));
137 }
138 
139 } // namespace seqan3
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
requires constexpr tuple_like< tuple_t< ts... > > auto tuple_split(tuple_t< ts... > const &t)
Splits a tuple like data structure at the given position.
Definition: split.hpp:84
Whether a type behaves like a tuple.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
T tuple_size_v
Provides traits for seqan3::type_list.
Provides seqan3::tuple_like.