SeqAn3
3.4.0
The Modern C++ library for sequence analysis.
Toggle main menu visibility
Loading...
Searching...
No Matches
split.hpp
Go to the documentation of this file.
1
// SPDX-FileCopyrightText: 2006-2025 Knut Reinert & Freie Universität Berlin
2
// SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
3
// SPDX-License-Identifier: BSD-3-Clause
4
9
10
#pragma once
11
12
#include <
utility
>
13
14
#include <
seqan3/utility/tuple/concept.hpp
>
15
#include <
seqan3/utility/type_list/traits.hpp
>
16
17
namespace
seqan3::detail
18
{
19
33
template
<
size_t
beg,
template
<
typename
...>
typename
tuple_t,
size_t
... Is,
typename
... ts>
34
requires
tuple_like<tuple_t<ts...>> && tuple_like<tuple_t<>>
35
constexpr
auto
tuple_split(tuple_t<ts...>
const
& t, std::index_sequence<Is...>
const
& SEQAN3_DOXYGEN_ONLY(idx))
36
{
37
#pragma GCC diagnostic push
38
#pragma GCC diagnostic ignored "-Wmissing-braces"
39
return
tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::get<beg + Is>(t)...};
40
#pragma GCC diagnostic pop
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
#pragma GCC diagnostic push
49
#pragma GCC diagnostic ignored "-Wmissing-braces"
50
return
tuple_t<std::tuple_element_t<beg + Is, tuple_t<ts...>>...>{std::move(std::get<beg + Is>(t))...};
51
#pragma GCC diagnostic pop
52
}
53
}
// namespace seqan3::detail
54
55
namespace
seqan3
56
{
85
template
<
size_t
pivot_c,
template
<
typename
...>
typename
tuple_t,
typename
... ts>
86
requires
tuple_like<tuple_t<ts...>>
87
constexpr
auto
tuple_split
(tuple_t<ts...>
const
& t)
88
{
89
static_assert
(pivot_c <=
sizeof
...(ts));
90
91
#pragma GCC diagnostic push
92
#pragma GCC diagnostic ignored "-Wmissing-braces"
93
return
tuple_t{detail::tuple_split<0>(t,
std::make_index_sequence<pivot_c>
{}),
94
detail::tuple_split<pivot_c>(t,
std::make_index_sequence
<
sizeof
...(ts) - pivot_c>{})};
95
#pragma GCC diagnostic pop
96
}
97
99
template
<
size_t
pivot_c,
template
<
typename
...>
typename
tuple_t,
typename
... ts>
100
requires
tuple_like
<tuple_t<ts...>>
101
constexpr
auto
tuple_split
(tuple_t<ts...> && t)
102
{
103
static_assert
(pivot_c <=
sizeof
...(ts));
104
#pragma GCC diagnostic push
105
#pragma GCC diagnostic ignored "-Wmissing-braces"
106
return
tuple_t{detail::tuple_split<0>(std::move(t),
std::make_index_sequence<pivot_c>
{}),
107
detail::tuple_split<pivot_c>(std::move(t),
std::make_index_sequence
<
sizeof
...(ts) - pivot_c>{})};
108
#pragma GCC diagnostic pop
109
}
110
137
template
<
typename
pivot_t, tuple_like tuple_t>
138
constexpr
auto
tuple_split
(tuple_t && t)
139
{
140
constexpr
size_t
pivot_c = list_traits::find<pivot_t, detail::tuple_type_list_t<std::remove_cvref_t<tuple_t>>>;
141
142
static_assert
(pivot_c <= std::tuple_size_v<std::remove_cvref_t<tuple_t>>);
143
144
return
tuple_split<pivot_c>
(
std::forward<tuple_t>
(t));
145
}
146
147
}
// namespace seqan3
std::forward
T forward(T... args)
seqan3::tuple_split
constexpr auto tuple_split(tuple_t< ts... > const &t)
Splits a tuple like data structure at the given position.
Definition
split.hpp:87
std::make_index_sequence
tuple_like
Whether a type behaves like a tuple.
seqan3
The main SeqAn3 namespace.
Definition
aligned_sequence_concept.hpp:26
traits.hpp
Provides traits for seqan3::type_list.
concept.hpp
Provides seqan3::tuple_like.
utility
Hide me
Version:
seqan3
utility
tuple
split.hpp
Generated on
for SeqAn3 by
1.17.0