SeqAn3 3.2.0-rc.1
The Modern C++ library for sequence analysis.
type_traits.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, 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 <seqan3/std/iterator>
16#include <seqan3/std/ranges>
17#include <type_traits>
18
22
23// TODO(h-2): add innermost_reference instead of or addition to range_innermost_value?
24
25//NOTE(h-2): for the range overloads we explicitly forbid that the type is iteratoer
26// because some types are actually both (e.g. std::directory_iterator)
27
28namespace seqan3::detail
29{
30
32template <typename t>
33concept has_range_value_type = requires { typename std::ranges::range_value_t<std::remove_cvref_t<t>>; };
35
38template <bool const_range, typename range_t>
40
43template <bool const_range, typename range_t>
44using maybe_const_iterator_t = std::ranges::iterator_t<maybe_const_range_t<const_range, range_t>>;
45
48template <bool const_v, typename range_t>
49using maybe_const_sentinel_t = std::ranges::sentinel_t<maybe_const_range_t<const_v, range_t>>;
50
53template <typename unary_predicate_fn_t, typename urng_t>
54concept indirect_unary_predicate_on_range = std::ranges::range<urng_t> &&
55 std::indirect_unary_predicate<unary_predicate_fn_t,
56 std::ranges::iterator_t<urng_t>>;
58} // namespace seqan3::detail
59
60namespace seqan3
61{
62
63// ----------------------------------------------------------------------------
64// range_innermost_value
65// ----------------------------------------------------------------------------
66
77template <typename t>
79 requires detail::has_range_value_type<t>
82{
84 using type = std::ranges::range_value_t<std::remove_cvref_t<t>>;
85};
86
88template <typename t>
89 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
91{
93};
95
99template <typename t>
101
102// ----------------------------------------------------------------------------
103// range_dimension_v
104// ----------------------------------------------------------------------------
105
115template <typename t>
117 requires detail::has_range_value_type<t>
119constexpr size_t range_dimension_v = 1;
120
122template <typename t>
123 requires detail::has_range_value_type<t> && detail::has_range_value_type<std::ranges::range_value_t<std::remove_cvref_t<t>>>
124constexpr size_t range_dimension_v<t> = range_dimension_v<std::ranges::range_value_t<std::remove_cvref_t<t>>> + 1;
126
127} // namespace seqan3
Provides various type traits on generic types.
std::ranges::sentinel_t< maybe_const_range_t< const_v, range_t > > maybe_const_sentinel_t
Returns the const sentinel of range_t if const_range is true; otherwise the non-const sentinel.
Definition: type_traits.hpp:49
constexpr size_t range_dimension_v
Returns the number of times you can call seqan3::value_type_t recursively on t (type trait).
Definition: type_traits.hpp:119
std::ranges::iterator_t< maybe_const_range_t< const_range, range_t > > maybe_const_iterator_t
Returns the const iterator of range_t if const_range is true; otherwise the non-const iterator.
Definition: type_traits.hpp:44
typename range_innermost_value< t >::type range_innermost_value_t
Shortcut for seqan3::range_innermost_value (transformation_trait shortcut).
Definition: type_traits.hpp:100
Provides various transformation traits for use on iterators.
The <iterator> header from C++20's standard library.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides platform and dependency checks.
The <ranges> header from C++20's standard library.
Recursively determines the value_type on containers and/or iterators.
Definition: type_traits.hpp:82
std::ranges::range_value_t< std::remove_cvref_t< t > > type
The return type (recursion not shown).
Definition: type_traits.hpp:84