57 template <
typename view_t>
58 class single_pass_input_iterator;
65 template <std::ranges::InputRange urng_t>
66 class single_pass_input_view :
public detail::view_base
71 using pure_range_type = std::remove_reference_t<urng_t>;
76 template <
typename view_t>
77 friend class single_pass_input_iterator;
85 urng_iterator_type cached_urng_iter{};
89 std::shared_ptr<view_state> view_state_ptr{};
95 using iterator = single_pass_input_iterator<single_pass_input_view>;
98 using const_iterator = void;
102 using value_type =
typename iterator::value_type;
104 using reference =
typename iterator::reference;
106 using const_reference = void;
113 constexpr single_pass_input_view() =
default;
114 constexpr single_pass_input_view(single_pass_input_view
const &) =
default;
115 constexpr single_pass_input_view(single_pass_input_view &&) =
default;
116 constexpr single_pass_input_view & operator=(single_pass_input_view
const &) =
default;
117 constexpr single_pass_input_view & operator=(single_pass_input_view &&) =
default;
118 ~single_pass_input_view() =
default;
121 single_pass_input_view(urng_t && urng) :
122 view_state_ptr{
new view_state{std::forward<urng_t>(urng), seqan3::begin(urng)}}
138 return iterator{*
this};
142 const_iterator
begin()
const =
delete;
145 const_iterator
cbegin()
const =
delete;
150 return {seqan3::end(view_state_ptr->urng)};
154 sentinel
end()
const =
delete;
157 sentinel
cend()
const =
delete;
165 template <std::ranges::InputRange urng_t>
167 single_pass_input_view(urng_t &&) -> single_pass_input_view<urng_t>;
184 template <
typename view_type>
185 class single_pass_input_iterator<single_pass_input_view<view_type>>
188 using base_iterator_type =
typename single_pass_input_view<view_type>::urng_iterator_type;
190 using sentinel_type =
typename single_pass_input_view<view_type>::sentinel;
193 single_pass_input_view<view_type> * view_ptr{};
196 template <
typename input_view_type>
197 friend class single_pass_input_iterator;
207 using difference_type = difference_type_t<base_iterator_type>;
210 using value_type = value_type_t<base_iterator_type>;
212 using pointer =
typename std::iterator_traits<base_iterator_type>::pointer;
214 using reference = reference_t<base_iterator_type>;
216 using iterator_category = std::input_iterator_tag;
222 single_pass_input_iterator() =
default;
225 constexpr single_pass_input_iterator(single_pass_input_iterator
const & rhs) =
default;
227 constexpr single_pass_input_iterator(single_pass_input_iterator && rhs) =
default;
229 constexpr single_pass_input_iterator & operator=(single_pass_input_iterator
const & rhs) =
default;
231 constexpr single_pass_input_iterator & operator=(single_pass_input_iterator && rhs) =
default;
233 ~single_pass_input_iterator() =
default;
236 single_pass_input_iterator(single_pass_input_view<view_type> & view) noexcept : view_ptr{&view}
243 reference operator*() const noexcept
253 single_pass_input_iterator & operator++() noexcept
261 void operator++(
int) noexcept
270 constexpr
bool operator==(sentinel_type
const & s)
const noexcept
273 return cached() == s;
277 constexpr
bool operator!=(sentinel_type
const & rhs)
const noexcept
279 return !(*
this == rhs);
283 friend constexpr
bool 284 operator==(sentinel_type
const & s,
285 single_pass_input_iterator<single_pass_input_view<view_type>>
const & rhs) noexcept
291 friend constexpr
bool 292 operator!=(sentinel_type
const & s,
293 single_pass_input_iterator<single_pass_input_view<view_type>>
const & rhs) noexcept
302 base_iterator_type & cached() const noexcept
304 return view_ptr->view_state_ptr->cached_urng_iter;
364 inline constexpr
auto single_pass_input = detail::generic_pipable_view_adaptor<detail::single_pass_input_view>{};
::ranges::cbegin cbegin
Alias for ranges::cbegin. Returns an iterator to the beginning of a range.
Definition: ranges:245
Provides C++20 additions to the <iterator> header.
Contains various shortcuts for common std::ranges functions.
The Sentinel concept specifies the relationship between an std::Iterator type and a std::Semiregular ...
Auxiliary header for the view submodule .
::ranges::iterator_t iterator_t
Alias for ranges::iterator_t. Obtains the iterator type of a range.
Definition: ranges:225
Adaptations of concepts from the Ranges TS.
::ranges::sentinel_t sentinel_t
Alias for ranges::sentinel_t. Obtains the sentinel type of a range.
Definition: ranges:220
::ranges::begin begin
Alias for ranges::begin. Returns an iterator to the beginning of a range.
Definition: ranges:185
The SeqAn3 namespace for views.
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:364
Definition: aligned_sequence_concept.hpp:288
::ranges::cend cend
Alias for ranges::cend. Returns an iterator to the end of a range.
Definition: ranges:250
::ranges::end end
Alias for ranges::end. Returns an iterator to the end of a range.
Definition: ranges:190