SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
utility/tuple/concept.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <concepts>
13#include <tuple>
14#include <type_traits>
15
20
21namespace seqan3::detail
22{
23
30template <typename tuple_t>
31concept tuple_size = requires (tuple_t v) {
32 {
33 std::tuple_size<tuple_t>::value
34 } -> std::convertible_to<size_t>;
35 };
37
44template <typename tuple_t>
45concept tuple_get =
46 requires (tuple_t & v, tuple_t const & v_c) {
47 requires std::tuple_size_v<tuple_t> > 0;
48
49 typename std::tuple_element<0, tuple_t>::type;
50
51 {
52 get<0>(v)
53 } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type>;
54 // requires weakly_assignable_from<decltype(get<0>(v)), typename std::tuple_element<0, tuple_t>::type>;
55 //TODO check that the previous returns something that can be assigned to
56 // unfortunately std::assignable_from requires lvalue-reference, but we want to accept xvalues too (returned
57 // proxies)
58 {
59 get<0>(v_c)
60 } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type>;
61 {
62 get<0>(std::move(v))
63 } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type>;
64 {
65 get<0>(std::move(v_c))
66 } -> std::convertible_to<typename std::tuple_element<0, tuple_t>::type const &&>;
67 };
69
77template <detail::tuple_size tuple_t>
79{
80protected:
82 template <size_t... Is>
87
88public:
90 using type = decltype(invoke_to_type_list(std::make_index_sequence<std::tuple_size<tuple_t>::value>{}));
91};
92
98template <detail::tuple_size tuple_t>
100
104template <typename... elements_t>
106 -> std::bool_constant<(std::totally_ordered<elements_t> && ... && true)>;
107
112template <typename tuple_t>
113 requires requires () {
114 {
116 };
117 }
118static constexpr bool all_elements_model_totally_ordered_v =
119 decltype(detail::all_elements_model_totally_ordered(tuple_type_list_t<tuple_t>{}))::value;
120} // namespace seqan3::detail
121
122namespace seqan3
123{
124
125// ----------------------------------------------------------------------------
126// tuple_like
127// ----------------------------------------------------------------------------
128
178template <typename t>
179concept tuple_like =
180 detail::tuple_size<std::remove_reference_t<t>>
181 && requires (t v) {
182 typename detail::tuple_type_list<std::remove_cvref_t<t>>::type;
183
184 // NOTE(rrahn): To check the full tuple_concept including the get interface and the std::totally_ordered
185 // we need to make some assumptions. In general these checks can only be executed if the tuple is not
186 // empty. Furthermore, the std::totally_ordered can only be checked if all elements in the
187 // tuple are strict_totally_ordered. This is done, by the fold expression in the second part.
188 requires (std::tuple_size<std::remove_reference_t<t>>::value == 0)
189 || (detail::tuple_get<std::remove_cvref_t<t>>
190 && (!detail::all_elements_model_totally_ordered_v<std::remove_cvref_t<t>>
191 || std::totally_ordered<std::remove_cvref_t<t>>));
192 };
194
206template <typename t>
207concept pair_like = tuple_like<t> && std::tuple_size_v<std::remove_reference_t<t>> == 2;
209
210} // namespace seqan3
Provides various type traits on generic types.
typename tuple_type_list< tuple_t >::type tuple_type_list_t
Helper type for seqan3::detail::tuple_type_list.
Definition utility/tuple/concept.hpp:99
constexpr auto all_elements_model_totally_ordered(seqan3::type_list< elements_t... >) -> std::bool_constant<(std::totally_ordered< elements_t > &&... &&true)>
Helper type function to check for std::totally_ordered on all elements of the given tuple type.
Subconcept definition for seqan3::tuple_like to test for std::get-interface.
Subconcept definition for seqan3::tuple_like to test for std::tuple_size-interface.
Whether a type behaves like a tuple with exactly two elements.
Whether a type behaves like a tuple.
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides seqan3::pod_tuple.
Transformation trait to expose the tuple element types as seqan3::type_list.
Definition utility/tuple/concept.hpp:79
static constexpr auto invoke_to_type_list(std::index_sequence< Is... >)
Helper function to extract the types using the tuple elements.
Definition utility/tuple/concept.hpp:83
decltype(invoke_to_type_list(std::make_index_sequence< std::tuple_size< tuple_t >::value >{})) type
The generated seqan3::type_list.
Definition utility/tuple/concept.hpp:90
Type that contains multiple types.
Definition type_list.hpp:26
Provides type traits for working with templates.
Provides seqan3::type_list.
Hide me