SeqAn3  3.0.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-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 
18 #include <seqan3/core/platform.hpp>
19 
20 namespace seqan3
21 {
22 
42 template <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 
58 public:
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 
102  algorithm_range_iterator begin() const = delete;
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 
121 protected:
130  bool next()
131  {
132  if (!algorithm_executor_ptr)
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 
144 private:
146  std::unique_ptr<algorithm_executor_type> algorithm_executor_ptr{};
148  algorithm_result_type cache{};
149 };
150 
156 template <typename algorithm_executor_type>
158 algorithm_result_generator_range(algorithm_executor_type &&)
161 
165 template <typename algorithm_executor_type>
167 {
168 public:
175  using value_type = algorithm_result_type;
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 
208  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 
224  algorithm_range_iterator & operator++(/*pre*/)
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 
243  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 
272 private:
274  algorithm_result_generator_range * range_ptr{};
276  bool at_end{true};
277 };
278 
279 } // namespace seqan3
seqan3::algorithm_result_generator_range::algorithm_result_generator_range
algorithm_result_generator_range(algorithm_executor_type const &algorithm_executor)=delete
Explicit deletion to forbid copy construction of the underlying executor.
seqan3::algorithm_result_generator_range::algorithm_range_iterator::operator==
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
seqan3::algorithm_result_generator_range::algorithm_range_iterator::operator!=
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
std::input_iterator_tag
seqan3::algorithm_result_generator_range::end
constexpr std::default_sentinel_t end() noexcept
Returns a sentinel signaling the end of the algorithm range.
Definition: algorithm_result_generator_range.hpp:112
seqan3::algorithm_result_generator_range::algorithm_range_iterator::operator->
pointer operator->() const noexcept
Returns a pointer to the current algorithm result.
Definition: algorithm_result_generator_range.hpp:215
concepts
The Concepts library.
seqan3::algorithm_result_generator_range::algorithm_result_generator_range
algorithm_result_generator_range(algorithm_result_generator_range &&)=default
Defaulted.
std::add_lvalue_reference_t
std::add_pointer_t
seqan3::algorithm_result_generator_range::operator=
algorithm_result_generator_range & operator=(algorithm_result_generator_range &&)=default
Defaulted.
seqan3::algorithm_result_generator_range::end
constexpr std::default_sentinel_t end() const =delete
This range is not const-iterable.
seqan3::views::move
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
seqan3::algorithm_result_generator_range::algorithm_result_generator_range
algorithm_result_generator_range()=default
Defaulted.
seqan3::algorithm_result_generator_range::next
bool next()
Receives the next algorithm result from the executor buffer.
Definition: algorithm_result_generator_range.hpp:130
seqan3::algorithm_result_generator_range::algorithm_range_iterator
The iterator of seqan3::detail::algorithm_result_generator_range.
Definition: algorithm_result_generator_range.hpp:167
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
seqan3::algorithm_result_generator_range::operator=
algorithm_result_generator_range & operator=(algorithm_result_generator_range const &)=delete
This is a move-only type.
std::runtime_error
seqan3::reference
Exposes the reference of another type.
Definition: pre.hpp:106
seqan3::algorithm_result_generator_range::algorithm_range_iterator::operator!=
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
ranges
Adaptations of concepts from the Ranges TS.
seqan3::algorithm_result_generator_range::begin
constexpr algorithm_range_iterator begin()
Returns an iterator to the first element of the algorithm range.
Definition: algorithm_result_generator_range.hpp:96
platform.hpp
Provides platform and dependency checks.
std
SeqAn specific customisations in the standard namespace.
seqan3::algorithm_result_generator_range::algorithm_result_generator_range
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
std::ptrdiff_t
seqan3::algorithm_result_generator_range::algorithm_result_generator_range
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.
seqan3::algorithm_result_generator_range::algorithm_result_generator_range
algorithm_result_generator_range(algorithm_result_generator_range const &)=delete
This is a move-only type.
seqan3::algorithm_result_generator_range::algorithm_range_iterator::algorithm_range_iterator
constexpr algorithm_range_iterator() noexcept=default
Defaulted.
seqan3::algorithm_result_generator_range::algorithm_range_iterator::value_type
algorithm_result_type value_type
Value type of container elements.
Definition: algorithm_result_generator_range.hpp:175
seqan3::algorithm_result_generator_range::algorithm_range_iterator::operator++
void operator++(int)
Returns an iterator incremented by one.
Definition: algorithm_result_generator_range.hpp:234
seqan3::algorithm_result_generator_range::begin
algorithm_range_iterator begin() const =delete
This range is not const-iterable.
std::unique_ptr< algorithm_executor_type >
seqan3::algorithm_result_generator_range::~algorithm_result_generator_range
~algorithm_result_generator_range()=default
Defaulted.
seqan3::algorithm_result_generator_range
An input range over the algorithm results generated by the underlying algorithm executor.
Definition: algorithm_result_generator_range.hpp:44