SeqAn3 3.1.0
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
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>
56SEQAN3_CONCEPT has_iterator_category = requires ()
57{
58 typename t::iterator_category;
59};
61
62#if SEQAN3_WORKAROUND_GCC_96070
66template <typename underlying_iterator_t>
67 requires (!has_iterator_category<std::iterator_traits<underlying_iterator_t>>)
68struct maybe_iterator_category<underlying_iterator_t>
69{
70 using iterator_category = void;
71};
72#endif // SEQAN3_WORKAROUND_GCC_96070
73
75template <typename underlying_iterator_t>
76 requires has_iterator_category<std::iterator_traits<underlying_iterator_t>>
77struct maybe_iterator_category<underlying_iterator_t>
78{
80};
82
93template <typename underling_iterator_t>
94struct maybe_inherited_iterator_category : public maybe_iterator_category<underling_iterator_t>
95{};
96
98template <typename underling_iterator_t>
99 requires has_iterator_category<underling_iterator_t>
100struct maybe_inherited_iterator_category<underling_iterator_t>
101{
102 // underling_iterator_t::iterator_category is already defined
103};
105
112template <typename it_t>
114 requires std::input_or_output_iterator<it_t>
116using iterator_concept_tag_t =
118 std::contiguous_iterator<it_t>,
119 std::contiguous_iterator_tag,
121 std::random_access_iterator<it_t>,
124 std::bidirectional_iterator<it_t>,
127 std::forward_iterator<it_t>,
130 std::input_iterator<it_t>,
133
134} // namespace seqan3::detail
135
136namespace seqan3::detail
137{
138// ----------------------------------------------------------------------------
139// iter_pointer
140// ----------------------------------------------------------------------------
141
152template <typename it_t>
153struct iter_pointer
154{
156 using type = void;
157};
158
160template <typename it_t>
161 requires requires { typename std::iterator_traits<it_t>::pointer; }
162struct iter_pointer<it_t>
163{
166 using type = typename std::iterator_traits<it_t>::pointer;
167};
169
175template <typename it_t>
176using iter_pointer_t = typename iter_pointer<it_t>::type;
177
178} // namespace seqan3::detail
The <iterator> header from C++20's standard library.
Provides platform and dependency checks.