24 namespace seqan3::detail
28 template <
typename view_t>
36 template <std::ranges::view urng_t>
38 class single_pass_input_view :
public std::ranges::view_interface<single_pass_input_view<urng_t>>
44 using urng_iterator_type = std::ranges::iterator_t<urng_t>;
47 template <
typename view_t>
48 friend class basic_iterator;
65 using iterator = basic_iterator<single_pass_input_view>;
68 using sentinel = std::ranges::sentinel_t<urng_t>;
76 constexpr single_pass_input_view() =
default;
79 constexpr single_pass_input_view(single_pass_input_view
const &) =
default;
81 constexpr single_pass_input_view(single_pass_input_view &&) =
default;
83 constexpr single_pass_input_view & operator=(single_pass_input_view
const &) =
default;
85 constexpr single_pass_input_view & operator=(single_pass_input_view &&) =
default;
87 ~single_pass_input_view() =
default;
90 explicit single_pass_input_view(urng_t _urng) :
95 template <
typename other_urng_t>
98 std::ranges::viewable_range<other_urng_t> &&
101 explicit single_pass_input_view(other_urng_t && _urng) :
102 single_pass_input_view{std::views::all(_urng)}
122 iterator
begin()
const =
delete;
127 return {std::ranges::end(state_ptr->urng)};
131 sentinel
end()
const =
delete;
140 template <std::ranges::viewable_range urng_t>
142 single_pass_input_view(urng_t &&) ->
143 single_pass_input_view<std::views::all_t<urng_t>>;
151 namespace seqan3::detail
160 template <
typename view_type>
161 class basic_iterator<single_pass_input_view<view_type>>
164 using base_iterator_type =
typename single_pass_input_view<view_type>::urng_iterator_type;
166 using sentinel_type =
typename single_pass_input_view<view_type>::sentinel;
169 single_pass_input_view<view_type> * view_ptr{};
172 template <
typename input_view_type>
173 friend class basic_iterator;
176 static_assert(std::sentinel_for<sentinel_type, base_iterator_type>);
188 using pointer = detail::iter_pointer_t<base_iterator_type>;
198 basic_iterator() =
default;
201 constexpr basic_iterator(basic_iterator
const & rhs) =
default;
203 constexpr basic_iterator(basic_iterator && rhs) =
default;
205 constexpr basic_iterator & operator=(basic_iterator
const & rhs) =
default;
207 constexpr basic_iterator & operator=(basic_iterator && rhs) =
default;
209 ~basic_iterator() =
default;
212 basic_iterator(single_pass_input_view<view_type> & view) noexcept : view_ptr{&view}
219 reference operator*() const noexcept
226 pointer operator->() const noexcept
228 requires (!
std::is_void_v<pointer>)
238 basic_iterator & operator++() noexcept
246 auto operator++(
int) noexcept
248 if constexpr (std::output_iterator<base_iterator_type, reference> &&
249 std::copy_constructible<base_iterator_type>)
251 basic_iterator tmp{*
this};
265 constexpr
bool operator==(sentinel_type
const & s)
const noexcept
268 return cached() == s;
272 friend constexpr
bool
273 operator==(sentinel_type
const & s, basic_iterator
const & rhs) noexcept
279 constexpr
bool operator!=(sentinel_type
const & rhs)
const noexcept
281 return !(*
this == rhs);
285 friend constexpr
bool
286 operator!=(sentinel_type
const & s, basic_iterator
const & rhs) noexcept
295 base_iterator_type & cached() const noexcept
297 assert(view_ptr !=
nullptr);
298 assert(view_ptr->state_ptr !=
nullptr);
299 return view_ptr->state_ptr->cached_urng_iter;
362 inline constexpr
auto single_pass_input = detail::adaptor_for_view_without_args<detail::single_pass_input_view>{};