SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
core/range/type_traits.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 <iterator>
13#include <ranges>
14#include <type_traits>
15
19
20// TODO(h-2): add innermost_reference instead of or addition to range_innermost_value?
21
22//NOTE(h-2): for the range overloads we explicitly forbid that the type is iteratoer
23// because some types are actually both (e.g. std::directory_iterator)
24
25namespace seqan3::detail
26{
27
29template <typename t>
30concept has_range_value_type = requires { typename std::ranges::range_value_t<std::remove_cvref_t<t>>; };
32
35template <bool const_range, typename range_t>
37
40template <bool const_range, typename range_t>
41using maybe_const_iterator_t = std::ranges::iterator_t<maybe_const_range_t<const_range, range_t>>;
42
45template <bool const_v, typename range_t>
46using maybe_const_sentinel_t = std::ranges::sentinel_t<maybe_const_range_t<const_v, range_t>>;
47
50template <typename unary_predicate_fn_t, typename urng_t>
51concept indirect_unary_predicate_on_range =
52 std::ranges::range<urng_t> && std::indirect_unary_predicate<unary_predicate_fn_t, std::ranges::iterator_t<urng_t>>;
54} // namespace seqan3::detail
55
56namespace seqan3
57{
58
59// ----------------------------------------------------------------------------
60// range_innermost_value
61// ----------------------------------------------------------------------------
62
73template <typename t>
74 requires detail::has_range_value_type<t>
76{
78 using type = std::ranges::range_value_t<std::remove_cvref_t<t>>;
79};
80
82template <typename t>
83 requires detail::has_range_value_type<t>
84 && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
86{
88};
90
94template <typename t>
96
97// ----------------------------------------------------------------------------
98// range_dimension_v
99// ----------------------------------------------------------------------------
100
110template <typename t>
111 requires detail::has_range_value_type<t>
112constexpr size_t range_dimension_v = 1;
113
115template <typename t>
116 requires detail::has_range_value_type<t>
117 && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
118constexpr size_t range_dimension_v<t> = range_dimension_v<std::ranges::range_value_t<std::remove_cvref_t<t>>> + 1;
120
121} // namespace seqan3
Provides various type traits on generic types.
constexpr size_t range_dimension_v
Returns the number of times you can call seqan3::value_type_t recursively on t (type trait).
Definition core/range/type_traits.hpp:112
typename range_innermost_value< t >::type range_innermost_value_t
Shortcut for seqan3::range_innermost_value (transformation_trait shortcut).
Definition core/range/type_traits.hpp:95
Provides various transformation traits for use on iterators.
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides platform and dependency checks.
Recursively determines the value_type on containers and/or iterators.
Definition core/range/type_traits.hpp:76
std::ranges::range_value_t< std::remove_cvref_t< t > > type
The return type (recursion not shown).
Definition core/range/type_traits.hpp:78
Hide me