SeqAn3  3.2.0
The Modern C++ library for sequence analysis.
iterator_traits.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, 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 
18 #include <seqan3/core/platform.hpp>
19 
20 namespace seqan3::detail
21 {
40 template <typename underlying_iterator_t>
41 struct 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 
55 template <typename t>
56 concept has_iterator_category = requires () { typename t::iterator_category; };
58 
59 #if SEQAN3_WORKAROUND_GCC_96070
63 template <typename underlying_iterator_t>
65 struct maybe_iterator_category<underlying_iterator_t>
66 {
67  using iterator_category = void;
68 };
69 #endif // SEQAN3_WORKAROUND_GCC_96070
70 
72 template <typename underlying_iterator_t>
73  requires has_iterator_category<std::iterator_traits<underlying_iterator_t>>
74 struct maybe_iterator_category<underlying_iterator_t>
75 {
76  using iterator_category = typename std::iterator_traits<underlying_iterator_t>::iterator_category;
77 };
79 
90 template <typename underling_iterator_t>
91 struct maybe_inherited_iterator_category : public maybe_iterator_category<underling_iterator_t>
92 {};
93 
95 template <typename underling_iterator_t>
96  requires has_iterator_category<underling_iterator_t>
97 struct maybe_inherited_iterator_category<underling_iterator_t>
98 {
99  // underling_iterator_t::iterator_category is already defined
100 };
102 
109 template <typename it_t>
110  requires std::input_or_output_iterator<it_t>
111 using iterator_concept_tag_t = std::conditional_t<
112  std::contiguous_iterator<it_t>,
113  std::contiguous_iterator_tag,
123 
124 } // namespace seqan3::detail
125 
126 namespace seqan3::detail
127 {
128 // ----------------------------------------------------------------------------
129 // iter_pointer
130 // ----------------------------------------------------------------------------
131 
142 template <typename it_t>
143 struct iter_pointer
144 {
146  using type = void;
147 };
148 
150 template <typename it_t>
152 struct iter_pointer<it_t>
153 {
156  using type = typename std::iterator_traits<it_t>::pointer;
157 };
159 
165 template <typename it_t>
166 using iter_pointer_t = typename iter_pointer<it_t>::type;
167 
168 } // namespace seqan3::detail
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
Provides platform and dependency checks.