SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
alignment_coordinate.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 <type_traits>
16 
22 #include <seqan3/std/concepts>
23 #include <seqan3/std/iterator>
24 
25 namespace seqan3::detail
26 {
27 
38 enum struct advanceable_alignment_coordinate_state : uint8_t
39 {
41  none,
43  column,
45  row
46 };
47 
63 template <advanceable_alignment_coordinate_state state = advanceable_alignment_coordinate_state::none>
64 class advanceable_alignment_coordinate
65 {
66 public:
67 
72  using difference_type = std::make_signed_t<size_t>;
75 
79  constexpr advanceable_alignment_coordinate() noexcept = default;
80  constexpr advanceable_alignment_coordinate(advanceable_alignment_coordinate const &) noexcept = default;
82  constexpr advanceable_alignment_coordinate(advanceable_alignment_coordinate &&) noexcept = default;
83  constexpr advanceable_alignment_coordinate & operator=(advanceable_alignment_coordinate const &) noexcept = default;
86  constexpr advanceable_alignment_coordinate & operator=(advanceable_alignment_coordinate &&) noexcept = default;
87  ~advanceable_alignment_coordinate() noexcept = default;
88 
90  template <advanceable_alignment_coordinate_state other_state>
92  requires (other_state != state)
94  constexpr advanceable_alignment_coordinate(advanceable_alignment_coordinate<other_state> const & other) :
95  first{other.first},
96  second{other.second}
97  {}
98 
100  template <advanceable_alignment_coordinate_state other_state>
102  requires (other_state != state)
104  constexpr advanceable_alignment_coordinate(advanceable_alignment_coordinate<other_state> && other) :
105  first{std::move(other.first)},
106  second{std::move(other.second)}
107  {}
108 
113  constexpr advanceable_alignment_coordinate(column_index_type<size_t> const c_idx,
114  row_index_type<size_t> const r_idx) noexcept :
115  first{c_idx.get()},
116  second{r_idx.get()}
117  {}
119 
121  constexpr friend bool operator==(advanceable_alignment_coordinate const & lhs,
122  advanceable_alignment_coordinate const & rhs) noexcept
123  {
124  return std::tie(lhs.first, lhs.second) == std::tie(rhs.first, rhs.second);
125  }
126 
127  constexpr friend bool operator!=(advanceable_alignment_coordinate const & lhs,
128  advanceable_alignment_coordinate const & rhs) noexcept
129  {
130  return std::tie(lhs.first, lhs.second) != std::tie(rhs.first, rhs.second);
131  }
132 
133  constexpr friend bool operator<=(advanceable_alignment_coordinate const & lhs,
134  advanceable_alignment_coordinate const & rhs) noexcept
135  {
136  return std::tie(lhs.first, lhs.second) <= std::tie(rhs.first, rhs.second);
137  }
138 
139  constexpr friend bool operator< (advanceable_alignment_coordinate const & lhs,
140  advanceable_alignment_coordinate const & rhs) noexcept
141  {
142  return std::tie(lhs.first, lhs.second) < std::tie(rhs.first, rhs.second);
143  }
144 
145  constexpr friend bool operator>=(advanceable_alignment_coordinate const & lhs,
146  advanceable_alignment_coordinate const & rhs) noexcept
147  {
148  return std::tie(lhs.first, lhs.second) >= std::tie(rhs.first, rhs.second);
149  }
150 
151  constexpr friend bool operator> (advanceable_alignment_coordinate const & lhs,
152  advanceable_alignment_coordinate const & rhs) noexcept
153  {
154  return std::tie(lhs.first, lhs.second) > std::tie(rhs.first, rhs.second);
155  }
157 
168  constexpr advanceable_alignment_coordinate & operator++(/*pre-increment*/) noexcept
170  requires (state != advanceable_alignment_coordinate_state::none)
172  {
173  if constexpr (state == advanceable_alignment_coordinate_state::column)
174  ++this->first;
175  else
176  ++this->second;
177  return *this;
178  }
179 
183  constexpr advanceable_alignment_coordinate operator++(int /*post-increment*/) noexcept
185  requires (state != advanceable_alignment_coordinate_state::none)
187  {
188  advanceable_alignment_coordinate tmp{*this};
189  ++(*this);
190  return tmp;
191  }
192 
196  constexpr advanceable_alignment_coordinate & operator--(/*pre-decrement*/) noexcept
198  requires (state != advanceable_alignment_coordinate_state::none)
200  {
201  if constexpr (state == advanceable_alignment_coordinate_state::column)
202  --this->first;
203  else
204  --this->second;
205  return *this;
206  }
207 
211  constexpr advanceable_alignment_coordinate operator--(int /*post-decrement*/) noexcept
213  requires (state != advanceable_alignment_coordinate_state::none)
215  {
216  advanceable_alignment_coordinate tmp{*this};
217  --(*this);
218  return tmp;
219  }
220 
225  constexpr advanceable_alignment_coordinate & operator+=(difference_type const offset) noexcept
227  requires (state != advanceable_alignment_coordinate_state::none)
229  {
230  if constexpr (state == advanceable_alignment_coordinate_state::column)
231  this->first += offset;
232  else
233  this->second += offset;
234  return *this;
235  }
236 
241  constexpr advanceable_alignment_coordinate & operator-=(difference_type const offset) noexcept
243  requires (state != advanceable_alignment_coordinate_state::none)
245  {
246  if constexpr (state == advanceable_alignment_coordinate_state::column)
247  this->first -= offset;
248  else
249  this->second -= offset;
250  return *this;
251  }
252 
257  constexpr advanceable_alignment_coordinate operator+(difference_type const offset) const noexcept
259  requires (state != advanceable_alignment_coordinate_state::none)
261  {
262  advanceable_alignment_coordinate tmp{*this};
263  tmp += offset;
264  return tmp;
265  }
266 
271  constexpr advanceable_alignment_coordinate operator-(difference_type const offset) const noexcept
273  requires (state != advanceable_alignment_coordinate_state::none)
275  {
276  advanceable_alignment_coordinate tmp{*this};
277  tmp -= offset;
278  return tmp;
279  }
280 
285  constexpr difference_type operator-(advanceable_alignment_coordinate const & other) const noexcept
287  requires (state != advanceable_alignment_coordinate_state::none)
289  {
290  if constexpr (state == advanceable_alignment_coordinate_state::column)
291  return this->first - other.first;
292  else
293  return this->second - other.second;
294  }
296 
299 
303  constexpr friend advanceable_alignment_coordinate operator+(difference_type const offset,
304  advanceable_alignment_coordinate const & me) noexcept
306  requires (state != advanceable_alignment_coordinate_state::none)
308  {
309  return me + offset;
310  }
312 
314  size_t first{};
316  size_t second{};
317 };
318 
319 } // namespace seqan3::detail
320 
321 namespace seqan3
322 {
323 
339  : public detail::advanceable_alignment_coordinate<detail::advanceable_alignment_coordinate_state::none>
341 {
344  using base_t = detail::advanceable_alignment_coordinate<detail::advanceable_alignment_coordinate_state::none>;
346 
347 public:
348 
352  constexpr alignment_coordinate() = default;
353  constexpr alignment_coordinate(alignment_coordinate const &) = default;
354  constexpr alignment_coordinate(alignment_coordinate &&) = default;
355  constexpr alignment_coordinate & operator=(alignment_coordinate const &) = default;
357  ~alignment_coordinate() = default;
358 
361  using base_t::base_t;
362 
364  constexpr alignment_coordinate(base_t const & base) : base_t{base}
365  {}
366 
368  constexpr alignment_coordinate(base_t && base) : base_t{std::move(base)}
369  {}
372 
373  using base_t::first;
374  using base_t::second;
375 
377  SEQAN3_DOXYGEN_ONLY(size_t first;)
379  SEQAN3_DOXYGEN_ONLY(size_t second;)
380 
383  constexpr operator detail::matrix_coordinate() const
384  {
385  return detail::matrix_coordinate{detail::row_index_type{second}, detail::column_index_type{first}};
386  }
387 };
388 
399 template <typename char_t, typename coordinate_type>
401  requires std::same_as<std::remove_cvref_t<coordinate_type>, alignment_coordinate> ||
402  detail::is_value_specialisation_of_v<std::remove_cvref_t<coordinate_type>,
403  detail::advanceable_alignment_coordinate>
405 inline debug_stream_type<char_t> & operator<<(debug_stream_type<char_t> & s, coordinate_type && c)
406 {
407  s << std::tie(c.first, c.second);
408  return s;
409 }
410 
411 } // namespace seqan3
matrix_coordinate.hpp
Provides seqan3::detail::alignment_coordinate and associated strong types.
seqan3::alignment_coordinate::first
size_t first
The begin/end position of the alignment in the first sequence.
Definition: alignment_coordinate.hpp:377
seqan3::alignment_coordinate::alignment_coordinate
constexpr alignment_coordinate(alignment_coordinate const &)=default
Defaulted.
std::rel_ops::operator!=
T operator!=(T... args)
seqan3::alignment_coordinate::operator=
constexpr alignment_coordinate & operator=(alignment_coordinate const &)=default
Defaulted.
strong_type.hpp
Provides basic data structure for strong types.
iterator
Provides C++20 additions to the <iterator> header.
template_inspection.hpp
Provides seqan3::type_list and auxiliary type traits.
debug_stream_type.hpp
Provides seqan3::debug_stream and related types.
seqan3::alignment_coordinate::alignment_coordinate
constexpr alignment_coordinate()=default
Defaulted.
concepts
The Concepts library.
std::tie
T tie(T... args)
seqan3::views::move
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
seqan3::alignment_coordinate::~alignment_coordinate
~alignment_coordinate()=default
Defaulted.
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
seqan3::alignment_coordinate
Represents the begin/end of the pairwise alignment in the respective sequences.
Definition: alignment_coordinate.hpp:341
std::make_signed_t
debug_stream_tuple.hpp
Provides seqan3::debug_stream and related types.
seqan3::alignment_coordinate::second
size_t second
The begin/end position of the alignment in the second sequence.
Definition: alignment_coordinate.hpp:379
seqan3::alignment_coordinate::operator=
constexpr alignment_coordinate & operator=(alignment_coordinate &&)=default
Defaulted.
seqan3::operator<<
debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &stream, alignment_t &&alignment)
Stream operator for alignments, which are represented as tuples of aligned sequences.
Definition: debug_stream_alignment.hpp:103
seqan3::none
@ none
No flag is set.
Definition: debug_stream_type.hpp:30
seqan3::alignment_coordinate::alignment_coordinate
constexpr alignment_coordinate(alignment_coordinate &&)=default
Defaulted.