25 namespace seqan3::detail
29 template <
typename view_t>
38 template <std::ranges::view urng_t>
39 class single_pass_input_view :
public std::ranges::view_interface<single_pass_input_view<urng_t>>
45 using urng_iterator_type = std::ranges::iterator_t<urng_t>;
48 template <
typename view_t>
49 friend class basic_iterator;
67 using iterator = basic_iterator<single_pass_input_view>;
69 using sentinel = std::ranges::sentinel_t<urng_t>;
78 constexpr single_pass_input_view() =
default;
80 constexpr single_pass_input_view(single_pass_input_view
const &) =
default;
82 constexpr single_pass_input_view(single_pass_input_view &&) =
default;
84 constexpr single_pass_input_view & operator=(single_pass_input_view
const &) =
default;
86 constexpr single_pass_input_view & operator=(single_pass_input_view &&) =
default;
88 ~single_pass_input_view() =
default;
91 explicit single_pass_input_view(urng_t _urng) :
92 state_ptr{new state{
std::
move(_urng)}}
96 template <
typename other_urng_t>
99 std::ranges::viewable_range<other_urng_t> &&
102 explicit single_pass_input_view(other_urng_t && _urng) :
103 single_pass_input_view{std::views::all(_urng)}
123 iterator
begin()
const =
delete;
128 return {std::ranges::end(state_ptr->urng)};
132 sentinel
end()
const =
delete;
142 template <std::ranges::viewable_range urng_t>
143 single_pass_input_view(urng_t &&) ->
144 single_pass_input_view<std::views::all_t<urng_t>>;
152 namespace seqan3::detail
161 template <
typename view_type>
162 class basic_iterator<single_pass_input_view<view_type>>
165 using base_iterator_type =
typename single_pass_input_view<view_type>::urng_iterator_type;
167 using sentinel_type =
typename single_pass_input_view<view_type>::sentinel;
170 single_pass_input_view<view_type> * view_ptr{};
173 template <
typename input_view_type>
174 friend class basic_iterator;
177 static_assert(std::sentinel_for<sentinel_type, base_iterator_type>);
189 using pointer = detail::iter_pointer_t<base_iterator_type>;
200 basic_iterator() =
default;
202 constexpr basic_iterator(basic_iterator
const & rhs) =
default;
204 constexpr basic_iterator(basic_iterator && rhs) =
default;
206 constexpr basic_iterator & operator=(basic_iterator
const & rhs) =
default;
208 constexpr basic_iterator & operator=(basic_iterator && rhs) =
default;
210 ~basic_iterator() =
default;
213 basic_iterator(single_pass_input_view<view_type> & view) noexcept : view_ptr{&view}
221 reference operator*() const noexcept
227 pointer operator->() const noexcept
229 requires (!
std::is_void_v<pointer>)
240 basic_iterator & operator++() noexcept
247 auto operator++(
int) noexcept
249 if constexpr (std::output_iterator<base_iterator_type, reference> &&
250 std::copy_constructible<base_iterator_type>)
252 basic_iterator tmp{*
this};
267 constexpr
bool operator==(sentinel_type
const & s)
const noexcept
269 return cached() == s;
273 friend constexpr
bool
274 operator==(sentinel_type
const & s, basic_iterator
const & rhs) noexcept
280 constexpr
bool operator!=(sentinel_type
const & rhs)
const noexcept
282 return !(*
this == rhs);
286 friend constexpr
bool
287 operator!=(sentinel_type
const & s, basic_iterator
const & rhs) noexcept
296 base_iterator_type & cached() const noexcept
298 assert(view_ptr !=
nullptr);
299 assert(view_ptr->state_ptr !=
nullptr);
300 return view_ptr->state_ptr->cached_urng_iter;
363 inline constexpr
auto single_pass_input = detail::adaptor_for_view_without_args<detail::single_pass_input_view>{};
constexpr auto single_pass_input
A view adapter that decays most of the range properties and adds single pass behavior.
Definition: single_pass_input.hpp:363
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:70
Provides C++20 additions to the <iterator> header.
The SeqAn namespace for views.
Definition: char_to.hpp:22
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.