SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
alignment_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 namespace seqan3
19 {
20 
40 template <typename alignment_executor_type>
42 {
43  static_assert(!std::is_const_v<alignment_executor_type>,
44  "Cannot create an alignment stream over a const buffer.");
45 
47 
49  friend class alignment_range_iterator;
50 
51 public:
53  using difference_type = typename alignment_executor_type::difference_type;
55  using value_type = typename alignment_executor_type::value_type;
57  using reference = typename alignment_executor_type::reference;
61  using const_iterator = void;
63  using sentinel = std::ranges::default_sentinel_t;
64 
68  alignment_range() = default;
69  alignment_range(alignment_range const &) = delete;
70  alignment_range(alignment_range &&) = default;
71  alignment_range & operator=(alignment_range const &) = delete;
72  alignment_range & operator=(alignment_range &&) = default;
73  ~alignment_range() = default;
74 
76  explicit alignment_range(alignment_executor_type const & _alignment_executor) = delete;
77 
87  explicit alignment_range(alignment_executor_type && _alignment_executor) :
88  alignment_executor{new alignment_executor_type{std::move(_alignment_executor)}}
89  {}
91 
103  constexpr iterator begin()
104  {
105  return iterator{*this};
106  }
107 
108  const_iterator begin() const = delete;
109  const_iterator cbegin() const = delete;
110 
119  constexpr sentinel end() noexcept
120  {
121  return {};
122  }
123 
124  constexpr sentinel end() const = delete;
125  constexpr sentinel cend() const = delete;
127 
128 protected:
137  bool next()
138  {
139  if (!alignment_executor)
140  throw std::runtime_error{"No alignment execution buffer available."};
141 
142  if (auto opt = alignment_executor->bump(); opt.has_value())
143  {
144  cache = std::move(*opt);
145  return true;
146  }
147 
148  return false;
149  }
150 
151 private:
153  std::unique_ptr<alignment_executor_type> alignment_executor{};
155  value_type cache{};
156 };
157 
163 template <typename alignment_executor_type>
165 alignment_range(alignment_executor_type &&) -> alignment_range<std::remove_reference_t<alignment_executor_type>>;
167 
171 template <typename alignment_executor_type>
172 class alignment_range<alignment_executor_type>::alignment_range_iterator
173 {
174 public:
185 
189  constexpr alignment_range_iterator() noexcept = default;
190  constexpr alignment_range_iterator(alignment_range_iterator const &) noexcept = default;
191  constexpr alignment_range_iterator(alignment_range_iterator &&) noexcept = default;
192  constexpr alignment_range_iterator & operator=(alignment_range_iterator const &) noexcept = default;
193  constexpr alignment_range_iterator & operator=(alignment_range_iterator &&) noexcept = default;
194  ~alignment_range_iterator() = default;
195 
197  constexpr alignment_range_iterator(alignment_range & range) : range_ptr(& range)
198  {
199  ++(*this); // Fetch the next element.
200  }
202 
210  reference operator*() const noexcept
212  {
213  return range_ptr->cache;
214  }
215 
217  pointer operator->() const noexcept
218  {
219  return &range_ptr->cache;
220  }
222 
226  alignment_range_iterator & operator++(/*pre*/)
228  {
229  assert(range_ptr != nullptr);
230 
231  at_end = !range_ptr->next();
232  return *this;
233  }
234 
236  void operator++(int /*post*/)
237  {
238  ++(*this);
239  }
241 
245  friend constexpr bool operator==(alignment_range_iterator const & lhs,
247  std::ranges::default_sentinel_t const &) noexcept
248  {
249  return lhs.at_end;
250  }
251 
253  friend constexpr bool operator==(std::ranges::default_sentinel_t const & lhs,
254  alignment_range_iterator const & rhs) noexcept
255  {
256  return rhs == lhs;
257  }
258 
260  friend constexpr bool operator!=(alignment_range_iterator const & lhs,
261  std::ranges::default_sentinel_t const & rhs) noexcept
262  {
263  return !(lhs == rhs);
264  }
265 
267  friend constexpr bool operator!=(std::ranges::default_sentinel_t const & lhs,
268  alignment_range_iterator const & rhs) noexcept
269  {
270  return rhs != lhs;
271  }
273 
274 private:
276  alignment_range * range_ptr{};
278  bool at_end{true};
279 };
280 
281 } // namespace seqan3
seqan3::alignment_range::next
bool next()
Receives the next alignment result from the executor buffer.
Definition: alignment_range.hpp:137
seqan3::alignment_range::sentinel
std::ranges::default_sentinel_t sentinel
The sentinel type.
Definition: alignment_range.hpp:63
seqan3::alignment_range::alignment_range_iterator::operator->
pointer operator->() const noexcept
Returns a pointer to the current alignment result.
Definition: alignment_range.hpp:217
seqan3::alignment_range::end
constexpr sentinel end() noexcept
Returns a sentinel signaling the end of the alignment range.
Definition: alignment_range.hpp:119
std::input_iterator_tag
seqan3::views::move
const auto move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
concepts
The Concepts library.
seqan3::alignment_range::alignment_range_iterator
friend class alignment_range_iterator
Befriend the iterator type.
Definition: alignment_range.hpp:46
seqan3::alignment_range::alignment_range_iterator::operator==
constexpr friend bool operator==(std::ranges::default_sentinel_t const &lhs, alignment_range_iterator const &rhs) noexcept
Checks whether lhs is equal to rhs.
Definition: alignment_range.hpp:253
std::add_pointer_t
seqan3::alignment_range::alignment_range_iterator::operator++
void operator++(int)
Returns an iterator incremented by one.
Definition: alignment_range.hpp:236
seqan3::alignment_range::alignment_range_iterator::difference_type
typename alignment_range::difference_type difference_type
Type for distances between iterators.
Definition: alignment_range.hpp:176
seqan3::alignment_range::alignment_range
alignment_range()=default
Defaulted.
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:36
std::runtime_error
seqan3::alignment_range::alignment_range_iterator
The iterator of seqan3::detail::alignment_range.
Definition: alignment_range.hpp:172
seqan3::alignment_range::alignment_range_iterator::operator!=
constexpr friend bool operator!=(std::ranges::default_sentinel_t const &lhs, alignment_range_iterator const &rhs) noexcept
Checks whether lhs is not equal to rhs.
Definition: alignment_range.hpp:267
seqan3::alignment_range::alignment_range_iterator::operator!=
constexpr friend bool operator!=(alignment_range_iterator const &lhs, std::ranges::default_sentinel_t const &rhs) noexcept
Checks whether *this is not equal to the sentinel.
Definition: alignment_range.hpp:260
seqan3::alignment_range::~alignment_range
~alignment_range()=default
Defaulted.
ranges
Adaptations of concepts from the Ranges TS.
seqan3::alignment_range
An input range over the alignment results generated by the underlying alignment executor.
Definition: alignment_range.hpp:41
seqan3::alignment_range::operator=
alignment_range & operator=(alignment_range const &)=delete
This is a move-only type.
seqan3::alignment_range::begin
constexpr iterator begin()
Returns an iterator to the first element of the alignment range.
Definition: alignment_range.hpp:103
seqan3::alignment_range::difference_type
typename alignment_executor_type::difference_type difference_type
The offset type.
Definition: alignment_range.hpp:53
seqan3::alignment_range::value_type
typename alignment_executor_type::value_type value_type
The alignment result type.
Definition: alignment_range.hpp:55
seqan3::alignment_range::alignment_range
alignment_range(alignment_executor_type &&_alignment_executor)
Constructs a new alignment range by taking ownership over the passed alignment buffer.
Definition: alignment_range.hpp:87
seqan3::alignment_range::const_iterator
void const_iterator
This range is never const-iterable. The const_iterator is always void.
Definition: alignment_range.hpp:61
seqan3::alignment_range::alignment_range_iterator::reference
typename alignment_range::reference reference
Use reference type defined by container.
Definition: alignment_range.hpp:180
seqan3::alignment_range::reference
typename alignment_executor_type::reference reference
The reference type.
Definition: alignment_range.hpp:57
std::unique_ptr< alignment_executor_type >
seqan3::alignment_range::alignment_range_iterator::value_type
typename alignment_range::value_type value_type
Value type of container elements.
Definition: alignment_range.hpp:178