SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
gap_decorator.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 
14 #pragma once
15 
16 #include <seqan3/std/algorithm>
17 #include <limits>
18 #include <seqan3/std/ranges>
19 #include <set>
20 #include <tuple>
21 #include <type_traits>
22 
28 
29 namespace seqan3
30 {
31 
77 template <std::ranges::viewable_range inner_type>
79  requires std::ranges::random_access_range<inner_type> && std::ranges::sized_range<inner_type> &&
80  (std::is_const_v<std::remove_reference_t<inner_type>> || std::ranges::view<inner_type>)
83 {
84 private:
85  // Declaration of class's iterator types; for the definition see below.
87 
92  using const_iterator = iterator;
93 
95  using ungapped_view_type = decltype(views::type_reduce(std::declval<inner_type &&>()));
96 
97 public:
106 
112 
119 
124  using size_type = std::ranges::range_size_t<inner_type>;
125 
130  using difference_type = std::ranges::range_difference_t<inner_type>;
132 
137  using unaligned_sequence_type = inner_type;
138 
139 #ifdef SEQAN3_DEPRECATED_310
142 #endif // SEQAN3_DEPRECATED_310
143 
154  gap_decorator() = default;
155  gap_decorator(gap_decorator const &) = default;
156  gap_decorator & operator=(gap_decorator const &) = default;
157  gap_decorator(gap_decorator && rhs) = default;
158  gap_decorator & operator=(gap_decorator && rhs) = default;
159  ~gap_decorator() = default;
160 
165  template <typename other_range_t>
167  requires (!std::same_as<other_range_t, gap_decorator>) &&
168  std::same_as<std::remove_cvref_t<other_range_t>, std::remove_cvref_t<inner_type>> &&
169  std::ranges::viewable_range<other_range_t> // at end, otherwise it competes with the move ctor
171  gap_decorator(other_range_t && range) : ungapped_view{views::type_reduce(std::forward<inner_type>(range))}
172  {} // TODO (@smehringer) only works for copyable views. Has to be changed once views are not required to be copyable anymore.
173  // !\}
174 
188  size_type size() const
189  {
190  if (anchors.size())
191  return anchors.rbegin()->second + ungapped_view.size();
192 
193  return ungapped_view.size();
194  }
195 
212  {
213  if (!count) // [[unlikely]]
214  return it;
215 
216  size_type const pos = it - begin();
217  assert(pos <= size());
218 
219  set_iterator_type it_set = anchors.upper_bound(anchor_gap_t{pos, bound_dummy});
220 
221  if (it_set == anchors.begin()) // will also catch if anchors is empty since begin() == end()
222  {
223  anchors.emplace_hint(anchors.begin(), anchor_gap_t{pos, count});
224  }
225  else // there are gaps before pos
226  {
227  --it_set;
228  auto gap_len{it_set->second};
229  if (it_set != anchors.begin())
230  gap_len -= (*(std::prev(it_set))).second;
231 
232  if (it_set->first + gap_len >= pos) // extend existing gap
233  {
234  anchor_gap_t gap{it_set->first, it_set->second + count};
235  it_set = anchors.erase(it_set);
236  anchors.insert(it_set, gap);
237  }
238  else // insert new gap
239  {
240  anchor_gap_t gap{pos, it_set->second + count};
241  ++it_set;
242  anchors.insert(it_set, gap);
243  }
244  }
245 
246  // post-processing: reverse update of succeeding gaps
247  rupdate(pos, count);
248  return iterator{*this, pos};
249  }
250 
265  {
266  // check if [it, it+gap_len[ covers [first, last[
267  if ((*it) != gap{}) // [[unlikely]]
268  throw gap_erase_failure("The range to be erased does not correspond to a consecutive gap.");
269 
270  return erase_gap(it, std::next(it));
271  }
272 
289  {
290  size_type const pos1 = first - begin();
291  size_type const pos2 = last - begin();
292  set_iterator_type it = anchors.upper_bound(anchor_gap_t{pos1, bound_dummy}); // first element greater than pos1
293 
294  if (it == anchors.begin())
295  throw gap_erase_failure{"There is no gap to erase in range [" + std::to_string(pos1) + "," +
296  std::to_string(pos2) + "]."};
297 
298  --it;
299  size_type const gap_len = gap_length(it);
300 
301  // check if [it, it+gap_len[ covers [first, last[
302  if ((it->first + gap_len) < pos2) // [[unlikely]]
303  {
304  throw gap_erase_failure{"The range to be erased does not correspond to a consecutive gap."};
305  }
306  // case 1: complete gap is deleted
307  else if (gap_len == pos2 - pos1)
308  {
309  it = anchors.erase(it);
310  }
311  // case 2: gap to be deleted in tail or larger than 1 (equiv. to shift tail left, i.e. pos remains unchanged)
312  else
313  {
314  anchor_gap_t gap{it->first, it->second - pos2 + pos1};
315  it = anchors.erase(it);
316  it = anchors.insert(it, gap); // amortized constant because of hint
317  ++it; // update node after the current
318  }
319 
320  // post-processing: forward update of succeeding gaps
321  update(it, pos2 - pos1);
322 
323  return iterator{*this, pos1};
324  }
325 
333  template <typename unaligned_sequence_t> // generic template to use forwarding reference
335  requires std::assignable_from<gap_decorator &, unaligned_sequence_t>
337  friend void assign_unaligned(gap_decorator & dec, unaligned_sequence_t && unaligned)
338  {
339  dec = unaligned;
340  }
342 
361  const_iterator begin() const noexcept
362  {
363  return iterator{*this};
364  }
365 
367  const_iterator cbegin() const noexcept
368  {
369  return const_iterator{*this};
370  }
371 
387  const_iterator end() const noexcept
388  {
389  return iterator{*this, size()};
390  }
391 
393  const_iterator cend() const noexcept
394  {
395  return const_iterator{*this, size()};
396  }
398 
417  {
418  if (i >= size()) // [[unlikely]]
419  throw std::out_of_range{"Trying to access element behind the last in gap_decorator."};
420  return (*this)[i];
421  }
422 
424  const_reference at(size_type const i) const
425  {
426  if (i >= size()) // [[unlikely]]
427  throw std::out_of_range{"Trying to access element behind the last in gap_decorator."};
428  return (*this)[i];
429  }
430 
444  {
445  return *iterator{*this, i};
446  }
448 
472  friend bool operator==(gap_decorator const & lhs, gap_decorator const & rhs)
473  {
474  if (lhs.size() == rhs.size() &&
475  lhs.anchors == rhs.anchors &&
476  std::ranges::equal(lhs.ungapped_view, rhs.ungapped_view))
477  {
478  return true;
479  }
480 
481  return false;
482  }
483 
488  friend bool operator!=(gap_decorator const & lhs, gap_decorator const & rhs)
489  {
490  return !(lhs == rhs);
491  }
492 
497  friend bool operator<(gap_decorator const & lhs, gap_decorator const & rhs)
498  {
499  auto lit = lhs.begin();
500  auto rit = rhs.begin();
501 
502  while (lit != lhs.end() && rit != rhs.end() && *lit == *rit)
503  ++lit, ++rit;
504 
505  if (rit == rhs.end())
506  return false; // lhs == rhs, or rhs prefix of lhs
507  else if (lit == lhs.end())
508  return true; // lhs prefix of rhs
509 
510  return *lit < *rit;
511  }
512 
517  friend bool operator<=(gap_decorator const & lhs, gap_decorator const & rhs)
518  {
519  auto lit = lhs.begin();
520  auto rit = rhs.begin();
521 
522  while (lit != lhs.end() && rit != rhs.end() && *lit == *rit)
523  ++lit, ++rit;
524 
525  if (lit == lhs.end())
526  return true; // lhs == rhs, or lhs prefix of rhs
527  else if (rit == rhs.end())
528  return false; // rhs prefix of lhs
529 
530  return *lit < *rit;
531  }
532 
537  friend bool operator>(gap_decorator const & lhs, gap_decorator const & rhs)
538  {
539  return !(lhs <= rhs);
540  }
541 
546  friend bool operator>=(gap_decorator const & lhs, gap_decorator const & rhs)
547  {
548  return !(lhs < rhs);
549  }
551 
552 private:
554  using anchor_gap_t = typename std::pair<size_t, size_t>;
555 
557  using anchor_set_type = std::set<anchor_gap_t>;
558 
560  using set_iterator_type = typename anchor_set_type::iterator;
561 
563  constexpr static size_t bound_dummy{std::numeric_limits<size_t>::max()};
564 
577  size_type gap_length(set_iterator_type it) const
578  {
579  return (it == anchors.begin()) ? it->second : it->second - (*std::prev(it)).second;
580  }
581 
594  void rupdate(size_type const pos, size_type const offset)
595  {
596  for (auto it = std::prev(anchors.end(), 1); it->first > pos;)
597  {
598  anchors.emplace_hint(it, anchor_gap_t{it->first + offset, it->second + offset});
599  anchors.erase(*it--);
600  }
601  }
602 
615  void update(set_iterator_type it, size_type const offset)
616  {
617  while (it != anchors.end())
618  {
619  anchor_gap_t gap{it->first - offset, it->second - offset};
620  it = anchors.erase(it);
621  it = anchors.insert(it, gap);
622  ++it;
623  }
624  }
625 
627  ungapped_view_type ungapped_view{};
628 
630  anchor_set_type anchors{};
631 };
632 
640 template <std::ranges::viewable_range urng_t>
642  requires (!std::ranges::view<std::remove_reference_t<urng_t>>)
644 gap_decorator(urng_t && range) -> gap_decorator<std::remove_reference_t<urng_t> const &>;
645 
650 template <std::ranges::view urng_t>
651 gap_decorator(urng_t range) -> gap_decorator<urng_t>;
653 
670 template <std::ranges::viewable_range inner_type>
672  requires std::ranges::random_access_range<inner_type> && std::ranges::sized_range<inner_type> &&
673  (std::is_const_v<std::remove_reference_t<inner_type>> || std::ranges::view<inner_type>)
676 {
677 protected:
681  typename gap_decorator::size_type pos{0u};
683  int64_t ungapped_view_pos{0}; // must be signed because we need this value to be -1 in case of leading gaps.
686  typename gap_decorator::size_type left_gap_end{0};
689  typename gap_decorator::set_iterator_type anchor_set_it{};
691  bool is_at_gap{true};
692 
694  void jump(typename gap_decorator::size_type const new_pos)
695  {
696  assert(new_pos <= host->size());
697  pos = new_pos;
698 
699  anchor_set_it = host->anchors.upper_bound(anchor_gap_t{pos, host->bound_dummy});
700  ungapped_view_pos = pos;
701 
702  if (anchor_set_it != host->anchors.begin())
703  {
704  typename gap_decorator::set_iterator_type prev{std::prev(anchor_set_it)};
705  size_type gap_len{prev->second};
706 
707  if (prev != host->anchors.begin())
708  gap_len -= std::prev(prev)->second;
709 
710  ungapped_view_pos -= prev->second;
711  left_gap_end = prev->first + gap_len;
712  }
713 
714  if (ungapped_view_pos != static_cast<int64_t>(host->ungapped_view.size()) &&
715  pos >= left_gap_end && (anchor_set_it == host->anchors.end() || pos < anchor_set_it->first))
716  is_at_gap = false;
717  else
718  is_at_gap = true;
719  }
720 
721 public:
732  using pointer = value_type *;
736 
746 
748  explicit gap_decorator_iterator(gap_decorator const & host_) :
749  host(&host_), anchor_set_it{host_.anchors.begin()}
750  {
751  if (host_.anchors.size() && (*host_.anchors.begin()).first == 0) // there are gaps at the very front
752  {
753  --ungapped_view_pos; // set ungapped_view_pos to -1 so operator++ works without an extra if-branch.
754  left_gap_end = anchor_set_it->second;
755  ++anchor_set_it;
756  }
757  else
758  {
759  is_at_gap = false;
760  }
761  }
762 
764  gap_decorator_iterator(gap_decorator const & host_, typename gap_decorator::size_type const pos_) : host(&host_)
765  {
766  jump(pos_); // random access to pos
767  }
769 
775  {
776  assert(host); // host is set
777  ++pos;
778 
779  if (pos < left_gap_end) // we stay within the preceding gap stretch
780  return *this;
781 
782  if (anchor_set_it == host->anchors.end() || pos < anchor_set_it->first)
783  { // proceed within the view since we are right of the previous gap but didn't arrive at the right gap yet
784  ++ungapped_view_pos;
785  if (ungapped_view_pos != static_cast<int64_t>(host->ungapped_view.size()))
786  is_at_gap = false;
787  }
788  else
789  { // we arrived at the right gap and have to update the variables. ungapped_view_pos remains unchanged.
790  left_gap_end = anchor_set_it->first + anchor_set_it->second -
791  ((anchor_set_it != host->anchors.begin()) ? (std::prev(anchor_set_it))->second : 0);
792  ++anchor_set_it;
793  is_at_gap = true;
794 
795  if (left_gap_end == host->size()) // very last gap
796  ++ungapped_view_pos;
797  }
798 
799  return *this;
800  }
801 
804  {
805  gap_decorator_iterator cpy{*this};
806  ++(*this);
807  return cpy;
808  }
809 
812  {
813  this->jump(this->pos + skip);
814  return *this;
815  }
816 
819  {
820  return gap_decorator_iterator{*(this->host), this->pos + skip};
821  }
822 
825  {
826  return it + skip;
827  }
828 
831  {
832  assert(host); // host is set
833  --pos;
834 
835  if (pos < left_gap_end)
836  { // there was no gap before but we arrive at the left gap and have to update the variables.
837  (anchor_set_it != host->anchors.begin()) ? --anchor_set_it : anchor_set_it;
838 
839  if (anchor_set_it != host->anchors.begin())
840  {
841  auto prev = std::prev(anchor_set_it);
842  left_gap_end = prev->first + prev->second -
843  ((prev != host->anchors.begin()) ? std::prev(prev)->second : 0);
844  }
845  else // [[unlikely]]
846  {
847  left_gap_end = 0;
848  }
849  is_at_gap = true;
850  }
851  else if (anchor_set_it == host->anchors.end() || pos < anchor_set_it->first)
852  { // we are neither at the left nor right gap
853  --ungapped_view_pos;
854  is_at_gap = false;
855  }
856  // else -> no op (we are still within the right gap stretch)
857 
858  return *this;
859  }
860 
863  {
864  gap_decorator_iterator cpy{*this};
865  --(*this);
866  return cpy;
867  }
868 
871  {
872  this->jump(this->pos - skip);
873  return *this;
874  }
875 
878  {
879  return gap_decorator_iterator{*(this->host), this->pos - skip};
880  }
881 
884  {
885  return it - skip;
886  }
887 
890  {
891  return static_cast<difference_type>(this->pos - lhs.pos);
892  }
894 
900  {
901  return (is_at_gap) ? reference{gap{}} : reference{host->ungapped_view[ungapped_view_pos]};
902  }
903 
906  {
907  return *(*this + n);
908  }
910 
917  friend bool operator==(gap_decorator_iterator const & lhs, gap_decorator_iterator const & rhs) noexcept
918  {
919  return lhs.pos == rhs.pos;
920  }
921 
923  friend bool operator!=(gap_decorator_iterator const & lhs, gap_decorator_iterator const & rhs) noexcept
924  {
925  return lhs.pos != rhs.pos;
926  }
927 
929  friend bool operator<(gap_decorator_iterator const & lhs, gap_decorator_iterator const & rhs) noexcept
930  {
931  return lhs.pos < rhs.pos;
932  }
933 
935  friend bool operator>(gap_decorator_iterator const & lhs, gap_decorator_iterator const & rhs) noexcept
936  {
937  return lhs.pos > rhs.pos;
938  }
939 
941  friend bool operator<=(gap_decorator_iterator const & lhs, gap_decorator_iterator const & rhs) noexcept
942  {
943  return lhs.pos <= rhs.pos;
944  }
945 
947  friend bool operator>=(gap_decorator_iterator const & lhs, gap_decorator_iterator const & rhs) noexcept
948  {
949  return lhs.pos >= rhs.pos;
950  }
952 };
953 
954 } // namespace seqan
Adaptations of algorithms from the Ranges TS.
Includes customized exception types for the alignment module .
Core alphabet concept and free function/type trait wrappers.
T begin(T... args)
A combined alphabet that can hold values of either of its alternatives.
Definition: alphabet_variant.hpp:131
The iterator type over a seqan3::gap_decorator.
Definition: gap_decorator.hpp:676
friend bool operator<=(gap_decorator_iterator const &lhs, gap_decorator_iterator const &rhs) noexcept
Checks whether *this is less than or equal to rhs.
Definition: gap_decorator.hpp:941
reference operator*() const
Dereference operator returns a copy of the element currently pointed at.
Definition: gap_decorator.hpp:899
gap_decorator_iterator & operator--()
Decrements iterator.
Definition: gap_decorator.hpp:830
gap_decorator_iterator & operator=(gap_decorator_iterator const &)=default
Defaulted.
typename gap_decorator::difference_type difference_type
The difference type.
Definition: gap_decorator.hpp:726
gap_decorator_iterator & operator=(gap_decorator_iterator &&)=default
Defaulted.
friend gap_decorator_iterator operator+(difference_type const skip, gap_decorator_iterator const &it)
Returns an iterator copy advanced by skip many positions.
Definition: gap_decorator.hpp:824
gap_decorator_iterator operator--(int)
Returns a decremented iterator copy.
Definition: gap_decorator.hpp:862
gap_decorator_iterator operator+(difference_type const skip) const
Returns an iterator copy advanced by skip many positions.
Definition: gap_decorator.hpp:818
difference_type operator-(gap_decorator_iterator const lhs) const noexcept
Returns the distance between two iterators.
Definition: gap_decorator.hpp:889
gap_decorator_iterator operator++(int)
Returns an incremented iterator copy.
Definition: gap_decorator.hpp:803
gap_decorator_iterator & operator+=(difference_type const skip)
Advances iterator by skip many positions.
Definition: gap_decorator.hpp:811
gap_decorator_iterator & operator++()
Increments iterator.
Definition: gap_decorator.hpp:774
typename gap_decorator::const_reference reference
The reference type.
Definition: gap_decorator.hpp:730
gap_decorator_iterator operator-(difference_type const skip) const
Returns an iterator copy advanced by skip many positions.
Definition: gap_decorator.hpp:877
friend bool operator<(gap_decorator_iterator const &lhs, gap_decorator_iterator const &rhs) noexcept
Checks whether *this is less than rhs.
Definition: gap_decorator.hpp:929
gap_decorator_iterator(gap_decorator const &host_)
Construct from seqan3::gap_decorator and initialising to first position.
Definition: gap_decorator.hpp:748
gap_decorator_iterator(gap_decorator_iterator &&)=default
Defaulted.
friend gap_decorator_iterator operator-(difference_type const skip, gap_decorator_iterator const &it)
Returns an iterator copy advanced by skip many positions.
Definition: gap_decorator.hpp:883
friend bool operator!=(gap_decorator_iterator const &lhs, gap_decorator_iterator const &rhs) noexcept
Checks whether *this is not equal to rhs.
Definition: gap_decorator.hpp:923
gap_decorator_iterator(gap_decorator const &host_, typename gap_decorator::size_type const pos_)
Construct from seqan3::gap_decorator and explicit position.
Definition: gap_decorator.hpp:764
friend bool operator>=(gap_decorator_iterator const &lhs, gap_decorator_iterator const &rhs) noexcept
Checks whether *this is greater than or equal to rhs.
Definition: gap_decorator.hpp:947
friend bool operator>(gap_decorator_iterator const &lhs, gap_decorator_iterator const &rhs) noexcept
Checks whether *this is greater than rhs.
Definition: gap_decorator.hpp:935
gap_decorator_iterator(gap_decorator_iterator const &)=default
Defaulted.
gap_decorator_iterator & operator-=(difference_type const skip)
Advances iterator by skip many positions.
Definition: gap_decorator.hpp:870
friend bool operator==(gap_decorator_iterator const &lhs, gap_decorator_iterator const &rhs) noexcept
Checks whether *this is equal to rhs.
Definition: gap_decorator.hpp:917
value_type * pointer
The pointer type.
Definition: gap_decorator.hpp:732
typename gap_decorator::value_type value_type
The value type.
Definition: gap_decorator.hpp:728
void jump(typename gap_decorator::size_type const new_pos)
A helper function that performs the random access into the anchor set, updating all member variables.
Definition: gap_decorator.hpp:694
reference operator[](difference_type const n) const
Return underlying container value currently pointed at.
Definition: gap_decorator.hpp:905
A gap decorator allows the annotation of sequences with gap symbols while leaving the underlying sequ...
Definition: gap_decorator.hpp:83
gap_decorator & operator=(gap_decorator &&rhs)=default
Defaulted.
reference at(size_type const i)
Return the i-th element as a reference.
Definition: gap_decorator.hpp:416
friend bool operator==(gap_decorator const &lhs, gap_decorator const &rhs)
Checks whether lhs is equal to rhs.
Definition: gap_decorator.hpp:472
gap_decorator(gap_decorator &&rhs)=default
Defaulted.
const_reference at(size_type const i) const
Return the i-th element as a reference.
Definition: gap_decorator.hpp:424
std::ranges::range_difference_t< inner_type > difference_type
The difference type of the underlying sequence.
Definition: gap_decorator.hpp:130
const_iterator cend() const noexcept
Returns an iterator pointing behind the last element of the decorator.
Definition: gap_decorator.hpp:393
const_iterator end() const noexcept
Returns an iterator pointing behind the last element of the decorator.
Definition: gap_decorator.hpp:387
inner_type unaligned_sequence_type
The underlying ungapped range type.
Definition: gap_decorator.hpp:137
gap_decorator(other_range_t &&range)
Construct with the ungapped range type.
Definition: gap_decorator.hpp:171
reference operator[](size_type const i) const
Return the i-th element as a reference.
Definition: gap_decorator.hpp:443
friend bool operator!=(gap_decorator const &lhs, gap_decorator const &rhs)
Checks whether lhs is not equal to rhs.
Definition: gap_decorator.hpp:488
iterator erase_gap(const_iterator const it)
Erase one gap symbol at the indicated iterator postion.
Definition: gap_decorator.hpp:264
const_iterator begin() const noexcept
Returns an iterator to the first element of the container.
Definition: gap_decorator.hpp:361
unaligned_sequence_type unaligned_seq_type
Definition: gap_decorator.hpp:141
iterator insert_gap(const_iterator const it, size_type const count=1)
Insert a gap of length count at the aligned sequence iterator position.
Definition: gap_decorator.hpp:211
~gap_decorator()=default
Defaulted.
iterator erase_gap(const_iterator const first, const_iterator const last)
Erase gap symbols at the iterator postions [first, last[.
Definition: gap_decorator.hpp:288
gap_decorator(gap_decorator const &)=default
Defaulted.
friend bool operator<=(gap_decorator const &lhs, gap_decorator const &rhs)
Checks whether lhs is less than or equal to rhs.
Definition: gap_decorator.hpp:517
size_type size() const
Returns the total length of the aligned sequence.
Definition: gap_decorator.hpp:188
reference const_reference
const_reference type equals reference type equals value type because the underlying sequence must not...
Definition: gap_decorator.hpp:118
gap_decorator & operator=(gap_decorator const &)=default
Defaulted.
gapped< std::ranges::range_value_t< inner_type > > value_type
The variant type of the alphabet type and gap symbol type (see seqan3::gapped).
Definition: gap_decorator.hpp:105
friend bool operator>(gap_decorator const &lhs, gap_decorator const &rhs)
Checks whether lhs is greater than rhs.
Definition: gap_decorator.hpp:537
friend bool operator>=(gap_decorator const &lhs, gap_decorator const &rhs)
Checks whether lhs is greater than or equal to rhs.
Definition: gap_decorator.hpp:546
gap_decorator()=default
Default constructor.
friend bool operator<(gap_decorator const &lhs, gap_decorator const &rhs)
Checks whether lhs is less than rhs.
Definition: gap_decorator.hpp:497
std::ranges::range_size_t< inner_type > size_type
The size_type of the underlying sequence.
Definition: gap_decorator.hpp:124
friend void assign_unaligned(gap_decorator &dec, unaligned_sequence_t &&unaligned)
Assigns a new sequence of type seqan3::gap_decorator::unaligned_sequence_type to the decorator.
Definition: gap_decorator.hpp:337
const_iterator cbegin() const noexcept
Returns an iterator to the first element of the container.
Definition: gap_decorator.hpp:367
Thrown in function seqan3::erase_gap, if a position does not contain a gap.
Definition: exception.hpp:24
The alphabet of a gap character '-'.
Definition: gap.hpp:39
Provides seqan3::gap.
Provides seqan3::gapped.
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
constexpr ptrdiff_t count
Count the occurrences of a type in a pack.
Definition: traits.hpp:169
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
constexpr auto type_reduce
A view adaptor that behaves like std::views::all, but type erases certain ranges.
Definition: type_reduce.hpp:158
T max(T... args)
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
SeqAn specific customisations in the standard namespace.
T next(T... args)
#define SEQAN3_DEPRECATED_310
Deprecation message for SeqAn 3.1.0 release.
Definition: platform.hpp:203
T prev(T... args)
Adaptations of concepts from the Ranges TS.
T size(T... args)
T to_string(T... args)
Provides seqan3::views::type_reduce.