SeqAn3 3.3.0
The Modern C++ library for sequence analysis.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
iterator_traits.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 <iterator>
16#include <type_traits>
17
19
20namespace seqan3::detail
21{
40template <typename underlying_iterator_t>
41struct maybe_iterator_category
42{
43#if SEQAN3_DOXYGEN_ONLY(1) 0
50 using iterator_category = MAYBE_PRESENT(std::iterator_traits<underlying_iterator_t>::iterator_category);
51#endif // SEQAN3_DOXYGEN_ONLY(1)0
52};
53
55template <typename t>
56concept has_iterator_category = requires () { typename t::iterator_category; };
58
60template <typename underlying_iterator_t>
61 requires has_iterator_category<std::iterator_traits<underlying_iterator_t>>
62struct maybe_iterator_category<underlying_iterator_t>
63{
65};
67
78template <typename underling_iterator_t>
79struct maybe_inherited_iterator_category : public maybe_iterator_category<underling_iterator_t>
80{};
81
83template <typename underling_iterator_t>
84 requires has_iterator_category<underling_iterator_t>
85struct maybe_inherited_iterator_category<underling_iterator_t>
86{
87 // underling_iterator_t::iterator_category is already defined
88};
90
97template <typename it_t>
98 requires std::input_or_output_iterator<it_t>
99using iterator_concept_tag_t = std::conditional_t<
100 std::contiguous_iterator<it_t>,
101 std::contiguous_iterator_tag,
111
112} // namespace seqan3::detail
113
114namespace seqan3::detail
115{
116// ----------------------------------------------------------------------------
117// iter_pointer
118// ----------------------------------------------------------------------------
119
130template <typename it_t>
131struct iter_pointer
132{
134 using type = void;
135};
136
138template <typename it_t>
139 requires requires { typename std::iterator_traits<it_t>::pointer; }
140struct iter_pointer<it_t>
141{
144 using type = typename std::iterator_traits<it_t>::pointer;
145};
147
153template <typename it_t>
154using iter_pointer_t = typename iter_pointer<it_t>::type;
155
156} // namespace seqan3::detail
Provides platform and dependency checks.