SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
iterator.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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>
20 #include <seqan3/std/iterator>
21 
22 namespace seqan3
23 {
24 
29 // ----------------------------------------------------------------------------
30 // value_type
31 // ----------------------------------------------------------------------------
32 
33 #ifdef SEQAN3_DEPRECATED_310
34 namespace detail
35 {
41 template <std::input_iterator it_t>
42 struct value_type<it_t>
43 {
45  using type = std::iter_value_t<it_t>;
46 };
47 } // namespace seqan3::detail
48 #endif // SEQAN3_DEPRECATED_310
49 
50 // see specialisation for ranges in core/type_traits/range.hpp
51 
52 // ----------------------------------------------------------------------------
53 // reference
54 // ----------------------------------------------------------------------------
55 
56 #ifdef SEQAN3_DEPRECATED_310
57 namespace detail
58 {
64 template <std::input_iterator it_t>
65 struct reference<it_t>
66 {
68  using type = std::iter_reference_t<it_t>;
69 };
70 } // namespace seqan3::detail
71 #endif // SEQAN3_DEPRECATED_310
72 
73 // see specialisation for ranges in core/type_traits/range.hpp
74 
75 // ----------------------------------------------------------------------------
76 // rvalue_reference
77 // ----------------------------------------------------------------------------
78 
79 #ifdef SEQAN3_DEPRECATED_310
80 namespace detail
81 {
87 template <std::input_iterator it_t>
88 struct rvalue_reference<it_t>
89 {
92 };
93 } // namespace seqan3::detail
94 #endif // SEQAN3_DEPRECATED_310
95 
96 // see specialisation for ranges in core/type_traits/range.hpp
97 
98 // ----------------------------------------------------------------------------
99 // const_reference
100 // ----------------------------------------------------------------------------
101 
102 // only defined for ranges
103 
104 // ----------------------------------------------------------------------------
105 // difference_type
106 // ----------------------------------------------------------------------------
107 
108 #ifdef SEQAN3_DEPRECATED_310
109 namespace detail
110 {
116 template <std::weakly_incrementable it_t>
117 struct difference_type<it_t>
118 {
120  using type = std::iter_difference_t<it_t>;
121 };
122 } // namespace seqan3::detail
123 #endif // SEQAN3_DEPRECATED_310
124 
125 // see specialisation for ranges in core/type_traits/range.hpp
126 
127 // ----------------------------------------------------------------------------
128 // size_type
129 // ----------------------------------------------------------------------------
130 
131 #ifdef SEQAN3_DEPRECATED_310
132 namespace detail
133 {
141 template <std::weakly_incrementable it_t>
142 struct size_type<it_t>
143 {
146 };
147 } // namespace seqan3::detail
148 #endif // SEQAN3_DEPRECATED_310
149 
150 // see specialisation for ranges in core/type_traits/range.hpp
152 
153 } // namespace seqan3
154 
155 namespace seqan3::detail
156 {
157 #if SEQAN3_WORKAROUND_GCC_96070
158 template <typename it_t>
160 struct iterator_category_tag
161 {
162  using type = void;
163 };
164 
165 template <typename it_t>
166  requires requires { typename std::iterator_traits<it_t>::iterator_category; }
167 struct iterator_category_tag<it_t>
168 {
169  using type = typename std::iterator_traits<it_t>::iterator_category;
170 };
172 
181 template <typename it_t>
182 using iterator_category_tag_t = typename iterator_category_tag<it_t>::type;
183 #else // ^^^ workaround / no workaround vvv
184 // TODO: Change the description / the definition of iterator_category_tag_t depending on how the standard resolves this
185 // https://github.com/seqan/product_backlog/issues/151
186 
197 template <typename it_t>
199  requires requires { typename std::iterator_traits<it_t>::iterator_category; }
201 using iterator_category_tag_t = typename std::iterator_traits<it_t>::iterator_category;
202 #endif // SEQAN3_WORKAROUND_GCC_96070
203 
209 template <typename it_t>
211  requires std::input_or_output_iterator<it_t>
213 using iterator_concept_tag_t =
215  std::contiguous_iterator<it_t>,
216  std::contiguous_iterator_tag,
218  std::random_access_iterator<it_t>,
221  std::bidirectional_iterator<it_t>,
224  std::forward_iterator<it_t>,
227  std::input_iterator<it_t>,
230 
231 } // namespace seqan3::detail
232 
233 namespace seqan3::detail
234 {
235 // ----------------------------------------------------------------------------
236 // iter_pointer
237 // ----------------------------------------------------------------------------
238 
248 template <typename it_t>
249 struct iter_pointer
250 {
252  using type = void;
253 };
254 
256 template <typename it_t>
257  requires requires { typename std::iterator_traits<it_t>::pointer; }
258 struct iter_pointer<it_t>
259 {
262  using type = typename std::iterator_traits<it_t>::pointer;
263 };
265 
270 template <typename it_t>
271 using iter_pointer_t = typename iter_pointer<it_t>::type;
272 
273 } // namespace seqan3::detail
pre.hpp
Provides various transformation trait base templates and shortcuts.
iterator
std::random_access_iterator_tag
std::iterator_traits
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
std::iter_value_t
platform.hpp
Provides platform and dependency checks.
std::conditional_t
std::make_unsigned_t