31 namespace seqan3::detail
39 template <std::ranges::range urng_t>
40 class async_input_buffer_view :
public std::ranges::view_interface<async_input_buffer_view<urng_t>>
43 static_assert(std::ranges::input_range<urng_t>,
44 "The range parameter to async_input_buffer_view must be at least an std::ranges::input_range.");
45 static_assert(std::ranges::view<urng_t>,
46 "The range parameter to async_input_buffer_view must model std::ranges::view.");
47 static_assert(std::movable<std::ranges::range_value_t<urng_t>>,
48 "The range parameter to async_input_buffer_view must have a value_type that is std::movable.");
49 static_assert(std::constructible_from<std::ranges::range_value_t<urng_t>,
51 "The range parameter to async_input_buffer_view must have a value_type that is constructible by a moved "
52 "value of its reference type.");
55 using urng_iterator_type = std::ranges::iterator_t<urng_t>;
64 contrib::fixed_buffer_queue<std::ranges::range_value_t<urng_t>> buffer;
80 async_input_buffer_view() =
default;
81 async_input_buffer_view(async_input_buffer_view
const &) =
default;
82 async_input_buffer_view(async_input_buffer_view &&) =
default;
83 async_input_buffer_view & operator=(async_input_buffer_view
const &) =
default;
84 async_input_buffer_view & operator=(async_input_buffer_view &&) =
default;
85 ~async_input_buffer_view() =
default;
88 async_input_buffer_view(urng_t _urng,
size_t const buffer_size)
90 auto deleter = [] (state * p)
101 contrib::fixed_buffer_queue<std::ranges::range_value_t<urng_t>>{buffer_size},
105 auto runner = [&state = *state_ptr] ()
107 for (
auto && val : state.urange)
108 if (state.buffer.wait_push(
std::move(val)) == contrib::queue_op_status::closed)
111 state.buffer.close();
118 template <
typename other_urng_t>
121 std::ranges::viewable_range<other_urng_t> &&
122 std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<other_urng_t>>>
124 async_input_buffer_view(other_urng_t && _urng,
size_t const buffer_size) :
125 async_input_buffer_view{
std::views::all(_urng), buffer_size}
145 assert(state_ptr !=
nullptr);
146 return {state_ptr->buffer};
150 iterator
begin()
const =
delete;
153 std::default_sentinel_t
end()
155 return std::default_sentinel;
159 std::default_sentinel_t
end()
const =
delete;
164 template <
typename urng_t>
165 class async_input_buffer_view<urng_t>::iterator
168 using sentinel_type = std::default_sentinel_t;
171 contrib::fixed_buffer_queue<std::ranges::range_value_t<urng_t>> * buffer_ptr =
nullptr;
174 mutable std::ranges::range_value_t<urng_t> cached_value;
189 using pointer = detail::iter_pointer_t<urng_iterator_type>;
195 using iterator_concept = iterator_category;
202 iterator() =
default;
204 iterator(iterator
const & rhs) =
default;
205 iterator(iterator && rhs) =
default;
207 iterator & operator=(iterator
const & rhs) =
default;
208 iterator & operator=(iterator && rhs) =
default;
209 ~iterator() noexcept = default;
212 iterator(contrib::fixed_buffer_queue<
std::ranges::range_value_t<urng_t>> & buffer) noexcept : buffer_ptr{&buffer}
222 reference operator*() const noexcept
228 pointer operator->() const noexcept
238 iterator & operator++() noexcept
243 assert(buffer_ptr !=
nullptr);
245 if (buffer_ptr->wait_pop(cached_value) == contrib::queue_op_status::closed)
252 void operator++(
int) noexcept
262 friend constexpr
bool operator==(iterator
const & lhs, std::default_sentinel_t
const &) noexcept
268 friend constexpr
bool operator==(std::default_sentinel_t
const &, iterator
const & rhs) noexcept
270 return rhs == std::default_sentinel_t{};
274 friend constexpr
bool operator!=(iterator
const & lhs, std::default_sentinel_t
const &) noexcept
276 return !(lhs == std::default_sentinel_t{});
280 friend constexpr
bool operator!=(std::default_sentinel_t
const &, iterator
const & rhs) noexcept
282 return rhs != std::default_sentinel_t{};
293 template <std::ranges::viewable_range urng_t>
294 async_input_buffer_view(urng_t &&,
size_t const buffer_size) -> async_input_buffer_view<std::views::all_t<urng_t>>;
302 struct async_input_buffer_fn
305 constexpr
auto operator()(
size_t const buffer_size)
const
307 return detail::adaptor_from_functor{*
this, buffer_size};
315 template <std::ranges::range urng_t>
316 constexpr
auto operator()(urng_t && urange,
size_t const buffer_size)
const
318 static_assert(std::ranges::input_range<urng_t>,
319 "The range parameter to views::async_input_buffer must be at least an std::ranges::input_range.");
320 static_assert(std::ranges::viewable_range<urng_t>,
321 "The range parameter to views::async_input_buffer cannot be a temporary of a non-view range.");
322 static_assert(std::movable<std::ranges::range_value_t<urng_t>>,
323 "The range parameter to views::async_input_buffer must have a value_type that is std::movable.");
324 static_assert(std::constructible_from<std::ranges::range_value_t<urng_t>,
326 "The range parameter to views::async_input_buffer must have a value_type that is constructible by a moved "
327 "value of its reference type.");
329 if (buffer_size == 0)
332 return detail::async_input_buffer_view{std::forward<urng_t>(urange), buffer_size};
Provides seqan3::detail::adaptor_from_functor.
Provides seqan3::buffer_queue.
constexpr auto async_input_buffer
A view adapter that returns a concurrent-queue-like view over the underlying range.
Definition: async_input_buffer.hpp:483
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
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.