17 #include <type_traits>
31 namespace seqan3::detail
47 template <std::ranges::viewable_range resource_t,
48 typename alignment_algorithm_t,
49 typename execution_handler_t = execution_handler_sequential>
51 requires std::ranges::forward_range<resource_t> &&
54 class alignment_executor_two_way
60 using chunked_resource_type =
typename chunked_indexed_sequence_pairs<resource_t>::type;
63 using chunked_resource_iterator = std::ranges::iterator_t<chunked_resource_type>;
69 using alignment_result_type =
typename alignment_algorithm_t::result_type;
72 using buffer_value_type = std::ranges::range_value_t<alignment_result_type>;
76 using buffer_pointer = std::ranges::iterator_t<buffer_type>;
84 using value_type = buffer_value_type;
89 using difference_type =
typename buffer_type::difference_type;
96 alignment_executor_two_way() =
delete;
99 alignment_executor_two_way(alignment_executor_two_way
const &) =
delete;
118 alignment_executor_two_way(alignment_executor_two_way && other) noexcept
124 alignment_executor_two_way & operator=(alignment_executor_two_way
const &) =
delete;
128 alignment_executor_two_way & operator=(alignment_executor_two_way && other)
135 ~alignment_executor_two_way() =
default;
153 template <
typename exec_policy_t = sequenced_policy>
155 requires is_execution_policy_v<exec_policy_t>
157 alignment_executor_two_way(resource_t resrc,
158 alignment_algorithm_t fn,
159 size_t chunk_size = 1u,
160 exec_policy_t
const & SEQAN3_DOXYGEN_ONLY(exec) =
seq) :
162 _chunk_size{chunk_size}
165 if (chunk_size == 0u)
168 chunked_resource = views::zip(std::forward<resource_t>(resrc), std::views::iota(0)) | views::chunk(_chunk_size);
169 chunked_resource_it = chunked_resource.begin();
172 init_buffer(std::ranges::distance(resrc));
174 init_buffer(_chunk_size);
197 if (underflow() == eof)
198 return {std::nullopt};
200 assert(gptr < egptr);
205 constexpr
size_t in_avail() const noexcept
217 return chunked_resource_it == std::ranges::end(chunked_resource);
221 constexpr
size_t chunk_size() const noexcept
233 void setg(buffer_pointer beg, buffer_pointer end)
250 setg(std::ranges::begin(buffer), std::ranges::end(buffer));
256 size_t buffer_limit = in_avail();
258 for (
size_t current_chunk_size = std::ranges::distance(*chunked_resource_it);
260 count += current_chunk_size, gptr += current_chunk_size, ++chunked_resource_it)
262 auto && current_chunk = std::ranges::iter_move(chunked_resource_it);
263 current_chunk_size = std::ranges::distance(current_chunk);
264 assert(in_avail() >= current_chunk_size);
266 exec_handler.execute(kernel,
std::move(current_chunk), [write_to = gptr] (
auto && alignment_results)
275 setg(std::ranges::begin(buffer), std::ranges::begin(buffer) +
count);
288 void init_buffer(
size_t const size)
291 setg(std::ranges::end(buffer), std::ranges::end(buffer));
296 void move_initialise(alignment_executor_two_way && other) noexcept
299 _chunk_size =
std::move(other._chunk_size);
301 std::ptrdiff_t old_resource_pos = std::ranges::distance(other.chunked_resource.begin(),
302 other.chunked_resource_it);
304 chunked_resource =
std::move(other.chunked_resource);
305 chunked_resource_it = std::ranges::next(chunked_resource.begin(), old_resource_pos);
312 setg(buffer.begin() + old_gptr_pos, buffer.begin() + old_egptr_pos);
320 execution_handler_t exec_handler{};
323 chunked_resource_type chunked_resource{};
325 chunked_resource_iterator chunked_resource_it{};
327 alignment_algorithm_t kernel{};
330 buffer_type buffer{};
332 buffer_pointer gptr{};
334 buffer_pointer egptr{};
336 size_t _chunk_size{};
344 template <
typename resource_rng_t,
typename func_t>
346 alignment_executor_two_way(resource_rng_t &&, func_t) ->
347 alignment_executor_two_way<resource_rng_t, func_t, execution_handler_sequential>;
350 template <
typename resource_rng_t,
typename func_t,
typename exec_policy_t>
351 requires is_execution_policy_v<exec_policy_t>
352 alignment_executor_two_way(resource_rng_t &&, func_t,
size_t, exec_policy_t
const &) ->
353 alignment_executor_two_way<resource_rng_t,
356 execution_handler_parallel,
357 execution_handler_sequential>>;