SeqAn3 3.1.0-rc.2
The Modern C++ library for sequence analysis.
algorithm_result_generator_range.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <seqan3/std/concepts>
16#include <seqan3/std/ranges>
17
19
20namespace seqan3
21{
22
42template <typename algorithm_executor_type>
44{
45 static_assert(!std::is_const_v<algorithm_executor_type>,
46 "Cannot create an algorithm stream over a const buffer.");
47
49 using optional_type = decltype(std::declval<algorithm_executor_type>().next_result());
51 using algorithm_result_type = typename optional_type::value_type;
52
54
57
58public:
68
70 explicit algorithm_result_generator_range(algorithm_executor_type const & algorithm_executor) = delete;
71
80 explicit algorithm_result_generator_range(algorithm_executor_type && algorithm_executor) :
81 algorithm_executor_ptr{std::make_unique<algorithm_executor_type>(std::move(algorithm_executor))}
82 {}
84
97 {
98 return algorithm_range_iterator{*this};
99 }
100
103
112 constexpr std::default_sentinel_t end() noexcept
113 {
114 return std::default_sentinel;
115 }
116
118 constexpr std::default_sentinel_t end() const = delete;
120
121protected:
130 bool next()
131 {
133 throw std::runtime_error{"No algorithm execution buffer available."};
134
135 if (auto opt = algorithm_executor_ptr->next_result(); opt.has_value())
136 {
137 cache = std::move(*opt);
138 return true;
139 }
140
141 return false;
142 }
143
144private:
149};
150
157template <typename algorithm_executor_type>
158algorithm_result_generator_range(algorithm_executor_type &&)
161
165template <typename algorithm_executor_type>
167{
168public:
183
187 constexpr algorithm_range_iterator() noexcept = default;
188 constexpr algorithm_range_iterator(algorithm_range_iterator const &) noexcept = default;
189 constexpr algorithm_range_iterator(algorithm_range_iterator &&) noexcept = default;
190 constexpr algorithm_range_iterator & operator=(algorithm_range_iterator const &) noexcept = default;
191 constexpr algorithm_range_iterator & operator=(algorithm_range_iterator &&) noexcept = default;
193
195 explicit constexpr algorithm_range_iterator(algorithm_result_generator_range & range) : range_ptr(std::addressof(range))
196 {
197 ++(*this); // Fetch the next element.
198 }
200
209 reference operator*() const noexcept
210 {
211 return range_ptr->cache;
212 }
213
215 pointer operator->() const noexcept
216 {
217 return &range_ptr->cache;
218 }
220
226 {
227 assert(range_ptr != nullptr);
228
229 at_end = !range_ptr->next();
230 return *this;
231 }
232
234 void operator++(int /*post*/)
235 {
236 ++(*this);
237 }
239
244 friend constexpr bool operator==(algorithm_range_iterator const & lhs,
245 std::default_sentinel_t const &) noexcept
246 {
247 return lhs.at_end;
248 }
249
251 friend constexpr bool operator==(std::default_sentinel_t const & lhs,
252 algorithm_range_iterator const & rhs) noexcept
253 {
254 return rhs == lhs;
255 }
256
258 friend constexpr bool operator!=(algorithm_range_iterator const & lhs,
259 std::default_sentinel_t const & rhs) noexcept
260 {
261 return !(lhs == rhs);
262 }
263
265 friend constexpr bool operator!=(std::default_sentinel_t const & lhs,
266 algorithm_range_iterator const & rhs) noexcept
267 {
268 return rhs != lhs;
269 }
271
272private:
276 bool at_end{true};
277};
278
279} // namespace seqan3
The iterator of seqan3::detail::algorithm_result_generator_range.
Definition: algorithm_result_generator_range.hpp:167
constexpr algorithm_range_iterator() noexcept=default
Defaulted.
algorithm_range_iterator & operator++()
Increments the iterator by one.
Definition: algorithm_result_generator_range.hpp:225
void operator++(int)
Returns an iterator incremented by one.
Definition: algorithm_result_generator_range.hpp:234
reference operator*() const noexcept
Access the pointed-to element.
Definition: algorithm_result_generator_range.hpp:209
constexpr friend bool operator==(algorithm_range_iterator const &lhs, std::default_sentinel_t const &) noexcept
Checks whether lhs is equal to the sentinel.
Definition: algorithm_result_generator_range.hpp:244
constexpr friend bool operator!=(algorithm_range_iterator const &lhs, std::default_sentinel_t const &rhs) noexcept
Checks whether *this is not equal to the sentinel.
Definition: algorithm_result_generator_range.hpp:258
algorithm_result_type value_type
Value type of container elements.
Definition: algorithm_result_generator_range.hpp:175
constexpr friend bool operator==(std::default_sentinel_t const &lhs, algorithm_range_iterator const &rhs) noexcept
Checks whether lhs is equal to rhs.
Definition: algorithm_result_generator_range.hpp:251
constexpr friend bool operator!=(std::default_sentinel_t const &lhs, algorithm_range_iterator const &rhs) noexcept
Checks whether lhs is not equal to rhs.
Definition: algorithm_result_generator_range.hpp:265
pointer operator->() const noexcept
Returns a pointer to the current algorithm result.
Definition: algorithm_result_generator_range.hpp:215
An input range over the algorithm results generated by the underlying algorithm executor.
Definition: algorithm_result_generator_range.hpp:44
constexpr std::default_sentinel_t end() noexcept
Returns a sentinel signaling the end of the algorithm range.
Definition: algorithm_result_generator_range.hpp:112
std::unique_ptr< algorithm_executor_type > algorithm_executor_ptr
The underlying executor buffer.
Definition: algorithm_result_generator_range.hpp:146
constexpr std::default_sentinel_t end() const =delete
This range is not const-iterable.
algorithm_result_generator_range(algorithm_executor_type const &algorithm_executor)=delete
Explicit deletion to forbid copy construction of the underlying executor.
algorithm_result_generator_range & operator=(algorithm_result_generator_range &&)=default
Defaulted.
algorithm_result_generator_range(algorithm_result_generator_range &&)=default
Defaulted.
decltype(std::declval< algorithm_executor_type >().next_result()) optional_type
The optional type returned by the seqan3::detail::algorithm_executor_blocking.
Definition: algorithm_result_generator_range.hpp:49
algorithm_result_generator_range(algorithm_result_generator_range const &)=delete
This is a move-only type.
algorithm_result_generator_range & operator=(algorithm_result_generator_range const &)=delete
This is a move-only type.
bool next()
Receives the next algorithm result from the executor buffer.
Definition: algorithm_result_generator_range.hpp:130
algorithm_range_iterator begin() const =delete
This range is not const-iterable.
algorithm_result_type cache
Stores last read element.
Definition: algorithm_result_generator_range.hpp:148
algorithm_result_generator_range()=default
Defaulted.
constexpr algorithm_range_iterator begin()
Returns an iterator to the first element of the algorithm range.
Definition: algorithm_result_generator_range.hpp:96
algorithm_result_generator_range(algorithm_executor_type &&algorithm_executor)
Constructs a new algorithm range by taking ownership over the passed algorithm buffer.
Definition: algorithm_result_generator_range.hpp:80
typename optional_type::value_type algorithm_result_type
The actual algorithm result type.
Definition: algorithm_result_generator_range.hpp:51
algorithm_result_generator_range(algorithm_executor_type &&) -> algorithm_result_generator_range< std::remove_reference_t< algorithm_executor_type > >
Deduces from the passed algorithm_executor_type.
~algorithm_result_generator_range()=default
Defaulted.
The Concepts library.
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
SeqAn specific customisations in the standard namespace.
Provides platform and dependency checks.
Adaptations of concepts from the Ranges TS.