17namespace seqan3::detail
37template <
typename underlying_iterator_t>
38struct maybe_iterator_category
40#if SEQAN3_DOXYGEN_ONLY(1) 0
47 using iterator_category = MAYBE_PRESENT(std::iterator_traits<underlying_iterator_t>::iterator_category);
53concept has_iterator_category =
requires () {
typename t::iterator_category; };
57template <
typename underlying_iterator_t>
58 requires has_iterator_category<std::iterator_traits<underlying_iterator_t>>
59struct maybe_iterator_category<underlying_iterator_t>
61 using iterator_category =
typename std::iterator_traits<underlying_iterator_t>::iterator_category;
75template <
typename underling_iterator_t>
76struct maybe_inherited_iterator_category :
public maybe_iterator_category<underling_iterator_t>
80template <
typename underling_iterator_t>
81 requires has_iterator_category<underling_iterator_t>
82struct maybe_inherited_iterator_category<underling_iterator_t>
94template <
typename it_t>
95 requires std::input_or_output_iterator<it_t>
96using iterator_concept_tag_t = std::conditional_t<
97 std::contiguous_iterator<it_t>,
98 std::contiguous_iterator_tag,
99 std::conditional_t<std::random_access_iterator<it_t>,
100 std::random_access_iterator_tag,
101 std::conditional_t<std::bidirectional_iterator<it_t>,
102 std::bidirectional_iterator_tag,
103 std::conditional_t<std::forward_iterator<it_t>,
104 std::forward_iterator_tag,
105 std::conditional_t<std::input_iterator<it_t>,
106 std::input_iterator_tag,
107 std::output_iterator_tag>>>>>;
111namespace seqan3::detail
127template <
typename it_t>
135template <
typename it_t>
136 requires requires {
typename std::iterator_traits<it_t>::pointer; }
137struct iter_pointer<it_t>
141 using type =
typename std::iterator_traits<it_t>::pointer;
150template <
typename it_t>
151using iter_pointer_t =
typename iter_pointer<it_t>::type;