SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
split.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2023, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2023, 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
20namespace seqan3::detail
21{
22
36template <size_t beg, template <typename...> typename tuple_t, size_t... Is, typename... ts>
37 requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
38constexpr auto tuple_split(tuple_t<ts...> const & t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
39{
40#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wmissing-braces"
42 return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::get<beg + Is>(t)...};
43#pragma GCC diagnostic pop
44}
45
47template <size_t beg, template <typename...> typename tuple_t, size_t... Is, typename... ts>
48 requires tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
49constexpr auto tuple_split(tuple_t<ts...> && t, std::index_sequence<Is...> const & SEQAN3_DOXYGEN_ONLY(idx))
50{
51#pragma GCC diagnostic push
52#pragma GCC diagnostic ignored "-Wmissing-braces"
53 return tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::move(std::get<beg + Is>(t))...};
54#pragma GCC diagnostic pop
55}
56} // namespace seqan3::detail
57
58namespace seqan3
59{
88template <size_t pivot_c, template <typename...> typename tuple_t, typename... ts>
89 requires tuple_like<tuple_t<ts...>>
90constexpr auto tuple_split(tuple_t<ts...> const & t)
91{
92 static_assert(pivot_c <= sizeof...(ts));
93
94#pragma GCC diagnostic push
95#pragma GCC diagnostic ignored "-Wmissing-braces"
96 return tuple_t{detail::tuple_split<0>(t, std::make_index_sequence<pivot_c>{}),
97 detail::tuple_split<pivot_c>(t, std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
98#pragma GCC diagnostic pop
99}
100
102template <size_t pivot_c, template <typename...> typename tuple_t, typename... ts>
103 requires tuple_like<tuple_t<ts...>>
104constexpr auto tuple_split(tuple_t<ts...> && t)
105{
106 static_assert(pivot_c <= sizeof...(ts));
107#pragma GCC diagnostic push
108#pragma GCC diagnostic ignored "-Wmissing-braces"
109 return tuple_t{detail::tuple_split<0>(std::move(t), std::make_index_sequence<pivot_c>{}),
110 detail::tuple_split<pivot_c>(std::move(t), std::make_index_sequence<sizeof...(ts) - pivot_c>{})};
111#pragma GCC diagnostic pop
112}
113
140template <typename pivot_t, tuple_like tuple_t>
141constexpr auto tuple_split(tuple_t && t)
142{
143 constexpr size_t pivot_c = list_traits::find<pivot_t, detail::tuple_type_list_t<std::remove_cvref_t<tuple_t>>>;
144
145 static_assert(pivot_c <= std::tuple_size_v<std::remove_cvref_t<tuple_t>>);
146
147 return tuple_split<pivot_c>(std::forward<tuple_t>(t));
148}
149
150} // namespace seqan3
constexpr auto tuple_split(tuple_t< ts... > const &t)
Splits a tuple like data structure at the given position.
Definition split.hpp:90
Whether a type behaves like a tuple.
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:29
Provides traits for seqan3::type_list.
Provides seqan3::tuple_like.