28namespace seqan3::detail
32template <
template <
typename ...>
typename container_type,
typename seq_alph_t,
typename ...rest_t>
36constexpr auto remove_gap_from_value_type(container_type<
gapped<seq_alph_t>, rest_t...>)
37 -> container_type<seq_alph_t, rest_t...>;
40template <
template <
typename ...>
typename container_type,
41 template <
typename ...>
typename allocator_type,
42 typename seq_alph_t,
typename ...rest_t>
47 -> container_type<seq_alph_t, allocator_type<seq_alph_t>, rest_t...>;
58 requires { remove_gap_from_value_type(std::declval<t>()); }
60struct unaligned_seq<t>
63 using type =
decltype(remove_gap_from_value_type(std::declval<t>()));
72struct unaligned_seq<t>
79using unaligned_seq_t =
typename unaligned_seq<t>::type;
114 std::equality_comparable_with<std::ranges::range_reference_t<t>, gap>;
226 std::ranges::forward_range<t> &&
227 requires {
typename detail::unaligned_seq_t<t>; } &&
228 requires (t v, detail::unaligned_seq_t<t> unaligned)
231 {insert_gap(v, std::ranges::begin(v))} -> std::same_as<std::ranges::iterator_t<t>>;
232 {insert_gap(v, std::ranges::begin(v), 2)} -> std::same_as<std::ranges::iterator_t<t>>;
233 {erase_gap(v, std::ranges::begin(v))} -> std::same_as<std::ranges::iterator_t<t>>;
234 {erase_gap(v, std::ranges::begin(v), std::ranges::end(v))} -> std::same_as<std::ranges::iterator_t<t>>;
235 {assign_unaligned(v, unaligned)} -> std::same_as<void>;
263template <sequence_container aligned_seq_t>
265 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
267inline typename aligned_seq_t::iterator
insert_gap(aligned_seq_t & aligned_seq,
268 typename aligned_seq_t::const_iterator pos_it)
289template <sequence_container aligned_seq_t>
291 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
293inline typename aligned_seq_t::iterator
insert_gap(aligned_seq_t & aligned_seq,
294 typename aligned_seq_t::const_iterator pos_it,
295 typename aligned_seq_t::size_type
size)
319template <sequence_container aligned_seq_t>
321 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
323inline typename aligned_seq_t::iterator
erase_gap(aligned_seq_t & aligned_seq,
324 typename aligned_seq_t::const_iterator pos_it)
326 if (*pos_it != gap{})
327 throw gap_erase_failure(
"The position to be erased does not contain a gap.");
329 return aligned_seq.erase(pos_it);
352template <sequence_container aligned_seq_t>
354 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
356inline typename aligned_seq_t::iterator
erase_gap(aligned_seq_t & aligned_seq,
357 typename aligned_seq_t::const_iterator first,
358 typename aligned_seq_t::const_iterator last)
360 for (
auto it = first; it != last; ++it)
362 throw gap_erase_failure(
"The range to be erased contains at least one non-gap character.");
364 return aligned_seq.erase(first, last);
389template <sequence_container aligned_seq_t, std::ranges::forward_range unaligned_sequence_type>
391 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>> &&
393 std::ranges::range_reference_t<unaligned_sequence_type>>
395inline void assign_unaligned(aligned_seq_t & aligned_seq, unaligned_sequence_type && unaligned_seq)
399 tmp.resize(std::ranges::distance(unaligned_seq));
400 std::ranges::copy(unaligned_seq, std::ranges::begin(tmp));
401 swap(aligned_seq, tmp);
425template <
typename range_type>
427 requires requires (range_type v)
429 v.insert_gap(std::ranges::iterator_t<range_type>{});
430 v.insert_gap(std::ranges::iterator_t<range_type>{},
typename range_type::size_type{});
433std::ranges::iterator_t<range_type>
insert_gap(range_type & rng,
434 std::ranges::iterator_t<range_type>
const pos_it,
435 typename range_type::size_type
const size = 1)
437 return rng.insert_gap(pos_it,
size);
456template <
typename range_type>
458 requires requires (range_type v) { v.erase_gap(std::ranges::iterator_t<range_type>{}); }
460std::ranges::iterator_t<range_type>
erase_gap(range_type & rng,
461 std::ranges::iterator_t<range_type>
const pos_it)
463 return rng.erase_gap(pos_it);
484template <
typename range_type>
486 requires requires (range_type v) { v.erase_gap(std::ranges::iterator_t<range_type>{}, std::ranges::iterator_t<range_type>{}); }
488std::ranges::iterator_t<range_type>
erase_gap(range_type & rng,
489 std::ranges::iterator_t<range_type>
const first,
490 std::ranges::iterator_t<range_type>
const last)
492 return rng.erase_gap(first, last);
497namespace seqan3::detail
503template <
typename ...elems>
509template <
typename ...elems>
510inline bool constexpr all_model_aligned_seq<type_list<elems...>> = all_model_aligned_seq<elems...>;
Includes customized exception types for the alignment module .
A combined alphabet that can hold values of either of its alternatives..
Definition: alphabet_variant.hpp:120
aligned_seq_t::iterator insert_gap(aligned_seq_t &aligned_seq, typename aligned_seq_t::const_iterator pos_it, typename aligned_seq_t::size_type size)
An implementation of seqan3::writable_aligned_sequence::insert_gap for sequence containers.
Definition: aligned_sequence_concept.hpp:293
void assign_unaligned(aligned_seq_t &aligned_seq, unaligned_sequence_type &&unaligned_seq)
An implementation of seqan3::writable_aligned_sequence::assign_unaligned_sequence for sequence contai...
Definition: aligned_sequence_concept.hpp:395
std::ranges::iterator_t< range_type > erase_gap(range_type &rng, std::ranges::iterator_t< range_type > const first, std::ranges::iterator_t< range_type > const last)
An implementation of seqan3::writable_aligned_sequence::erase_gap for ranges with the corresponding m...
Definition: aligned_sequence_concept.hpp:488
aligned_seq_t::iterator erase_gap(aligned_seq_t &aligned_seq, typename aligned_seq_t::const_iterator pos_it)
An implementation of seqan3::writable_aligned_sequence::erase_gap for sequence containers.
Definition: aligned_sequence_concept.hpp:323
std::ranges::iterator_t< range_type > erase_gap(range_type &rng, std::ranges::iterator_t< range_type > const pos_it)
An implementation of seqan3::writable_aligned_sequence::erase_gap for ranges with the corresponding m...
Definition: aligned_sequence_concept.hpp:460
aligned_seq_t::iterator erase_gap(aligned_seq_t &aligned_seq, typename aligned_seq_t::const_iterator first, typename aligned_seq_t::const_iterator last)
An implementation of seqan3::writable_aligned_sequence::erase_gap for sequence containers.
Definition: aligned_sequence_concept.hpp:356
std::ranges::iterator_t< range_type > insert_gap(range_type &rng, std::ranges::iterator_t< range_type > const pos_it, typename range_type::size_type const size=1)
An implementation of seqan3::writable_aligned_sequence::insert_gap for ranges with the corresponding ...
Definition: aligned_sequence_concept.hpp:433
aligned_seq_t::iterator insert_gap(aligned_seq_t &aligned_seq, typename aligned_seq_t::const_iterator pos_it)
An implementation of seqan3::writable_aligned_sequence::insert_gap for sequence containers.
Definition: aligned_sequence_concept.hpp:267
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
The generic concept for an aligned sequence.
The (most general) container concept as defined by the standard library.
The generic concept for a (biological) sequence.
Resolves to std::is_assignable_v<t>.
The generic concept for an aligned sequence that is writable.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
The <ranges> header from C++20's standard library.
Additional non-standard concepts for ranges.
Adaptations of concepts from the standard library.