SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
iterator_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 <type_traits>
17 
18 #include <seqan3/core/platform.hpp>
19 #ifdef SEQAN3_DEPRECATED_310
21 #endif // SEQAN3_DEPRECATED_310
22 
23 namespace seqan3
24 {
25 
30 // ----------------------------------------------------------------------------
31 // value_type
32 // ----------------------------------------------------------------------------
33 
34 #ifdef SEQAN3_DEPRECATED_310
35 namespace detail
36 {
42 template <std::input_iterator it_t>
43 struct value_type<it_t>
44 {
46  using type = std::iter_value_t<it_t>;
47 };
48 } // namespace seqan3::detail
49 #endif // SEQAN3_DEPRECATED_310
50 
51 // see specialisation for ranges in core/range/type_traits.hpp
52 
53 // ----------------------------------------------------------------------------
54 // reference
55 // ----------------------------------------------------------------------------
56 
57 #ifdef SEQAN3_DEPRECATED_310
58 namespace detail
59 {
65 template <std::input_iterator it_t>
66 struct reference<it_t>
67 {
69  using type = std::iter_reference_t<it_t>;
70 };
71 } // namespace seqan3::detail
72 #endif // SEQAN3_DEPRECATED_310
73 
74 // see specialisation for ranges in core/range/type_traits.hpp
75 
76 // ----------------------------------------------------------------------------
77 // rvalue_reference
78 // ----------------------------------------------------------------------------
79 
80 #ifdef SEQAN3_DEPRECATED_310
81 namespace detail
82 {
88 template <std::input_iterator it_t>
89 struct rvalue_reference<it_t>
90 {
93 };
94 } // namespace seqan3::detail
95 #endif // SEQAN3_DEPRECATED_310
96 
97 // see specialisation for ranges in core/range/type_traits.hpp
98 
99 // ----------------------------------------------------------------------------
100 // const_reference
101 // ----------------------------------------------------------------------------
102 
103 // only defined for ranges
104 
105 // ----------------------------------------------------------------------------
106 // difference_type
107 // ----------------------------------------------------------------------------
108 
109 #ifdef SEQAN3_DEPRECATED_310
110 namespace detail
111 {
117 template <std::weakly_incrementable it_t>
118 struct difference_type<it_t>
119 {
121  using type = std::iter_difference_t<it_t>;
122 };
123 } // namespace seqan3::detail
124 #endif // SEQAN3_DEPRECATED_310
125 
126 // see specialisation for ranges in core/range/type_traits.hpp
127 
128 // ----------------------------------------------------------------------------
129 // size_type
130 // ----------------------------------------------------------------------------
131 
132 #ifdef SEQAN3_DEPRECATED_310
133 namespace detail
134 {
142 template <std::weakly_incrementable it_t>
143 struct size_type<it_t>
144 {
147 };
148 } // namespace seqan3::detail
149 #endif // SEQAN3_DEPRECATED_310
150 
151 // see specialisation for ranges in core/range/type_traits.hpp
153 
154 } // namespace seqan3
155 
156 namespace seqan3::detail
157 {
175 template <typename underlying_iterator_t>
176 struct maybe_iterator_category
177 {
178 #if SEQAN3_DOXYGEN_ONLY(1)0
185  using iterator_category = MAYBE_PRESENT(std::iterator_­traits<underlying_iterator_t>::​iterator_­category);
186 #endif // SEQAN3_DOXYGEN_ONLY(1)0
187 };
188 
190 template <typename t>
191 SEQAN3_CONCEPT has_iterator_category = requires ()
192 {
193  typename t::iterator_category;
194 };
196 
197 #if SEQAN3_WORKAROUND_GCC_96070
201 template <typename underlying_iterator_t>
202  requires (!has_iterator_category<std::iterator_traits<underlying_iterator_t>>)
203 struct maybe_iterator_category<underlying_iterator_t>
204 {
205  using iterator_category = void;
206 };
207 #endif // SEQAN3_WORKAROUND_GCC_96070
208 
210 template <typename underlying_iterator_t>
211  requires has_iterator_category<std::iterator_traits<underlying_iterator_t>>
212 struct maybe_iterator_category<underlying_iterator_t>
213 {
214  using iterator_category = typename std::iterator_traits<underlying_iterator_t>::iterator_category;
215 };
217 
227 template <typename underling_iterator_t>
228 struct maybe_inherited_iterator_category : public maybe_iterator_category<underling_iterator_t>
229 {};
230 
232 template <typename underling_iterator_t>
233  requires has_iterator_category<underling_iterator_t>
234 struct maybe_inherited_iterator_category<underling_iterator_t>
235 {
236  // underling_iterator_t::iterator_category is already defined
237 };
239 
245 template <typename it_t>
247  requires std::input_or_output_iterator<it_t>
249 using iterator_concept_tag_t =
251  std::contiguous_iterator<it_t>,
252  std::contiguous_iterator_tag,
254  std::random_access_iterator<it_t>,
257  std::bidirectional_iterator<it_t>,
260  std::forward_iterator<it_t>,
263  std::input_iterator<it_t>,
266 
267 } // namespace seqan3::detail
268 
269 namespace seqan3::detail
270 {
271 // ----------------------------------------------------------------------------
272 // iter_pointer
273 // ----------------------------------------------------------------------------
274 
284 template <typename it_t>
285 struct iter_pointer
286 {
288  using type = void;
289 };
290 
292 template <typename it_t>
293  requires requires { typename std::iterator_traits<it_t>::pointer; }
294 struct iter_pointer<it_t>
295 {
298  using type = typename std::iterator_traits<it_t>::pointer;
299 };
301 
306 template <typename it_t>
307 using iter_pointer_t = typename iter_pointer<it_t>::type;
308 
309 } // namespace seqan3::detail
Provides C++20 additions to the <iterator> header.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides platform and dependency checks.
Provides various transformation trait base templates and shortcuts.