28 namespace seqan3::detail
32 template <
template <
typename...>
typename container_type,
typename seq_alph_t,
typename... rest_t>
34 constexpr
auto remove_gap_from_value_type(container_type<
gapped<seq_alph_t>, rest_t...>)
35 -> container_type<seq_alph_t, rest_t...>;
38 template <
template <
typename...>
typename container_type,
39 template <
typename...>
40 typename allocator_type,
46 -> container_type<seq_alph_t, allocator_type<seq_alph_t>, rest_t...>;
56 &&
requires { remove_gap_from_value_type(std::declval<t>()); }
57 struct unaligned_seq<t>
60 using type = decltype(remove_gap_from_value_type(std::declval<t>()));
67 struct unaligned_seq<t>
74 using unaligned_seq_t =
typename unaligned_seq<t>::type;
106 template <
typename t>
216 template <
typename t>
219 &&
requires (t v, detail::unaligned_seq_t<t> unaligned) {
222 insert_gap(v, std::ranges::begin(v))
223 } -> std::same_as<std::ranges::iterator_t<t>>;
225 insert_gap(v, std::ranges::begin(v), 2)
226 } -> std::same_as<std::ranges::iterator_t<t>>;
228 erase_gap(v, std::ranges::begin(v))
229 } -> std::same_as<std::ranges::iterator_t<t>>;
231 erase_gap(v, std::ranges::begin(v), std::ranges::end(v))
232 } -> std::same_as<std::ranges::iterator_t<t>>;
234 assign_unaligned(v, unaligned)
235 } -> std::same_as<void>;
263 template <sequence_container aligned_seq_t>
264 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
265 inline typename aligned_seq_t::iterator insert_gap(aligned_seq_t & aligned_seq,
266 typename aligned_seq_t::const_iterator pos_it)
268 return aligned_seq.insert(pos_it, std::iter_value_t<aligned_seq_t>{gap{}});
287 template <sequence_container aligned_seq_t>
288 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
289 inline typename aligned_seq_t::iterator insert_gap(aligned_seq_t & aligned_seq,
290 typename aligned_seq_t::const_iterator pos_it,
291 typename aligned_seq_t::size_type
size)
293 return aligned_seq.insert(pos_it,
size, std::iter_value_t<aligned_seq_t>{gap{}});
315 template <sequence_container aligned_seq_t>
316 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
317 inline typename aligned_seq_t::iterator erase_gap(aligned_seq_t & aligned_seq,
318 typename aligned_seq_t::const_iterator pos_it)
320 if (*pos_it != gap{})
321 throw gap_erase_failure(
"The position to be erased does not contain a gap.");
323 return aligned_seq.erase(pos_it);
346 template <sequence_container aligned_seq_t>
347 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
348 inline typename aligned_seq_t::iterator erase_gap(aligned_seq_t & aligned_seq,
349 typename aligned_seq_t::const_iterator first,
350 typename aligned_seq_t::const_iterator last)
352 for (
auto it = first; it != last; ++it)
354 throw gap_erase_failure(
"The range to be erased contains at least one non-gap character.");
356 return aligned_seq.erase(first, last);
381 template <sequence_container aligned_seq_t, std::ranges::forward_range unaligned_sequence_type>
382 requires detail::is_gapped_alphabet<std::iter_value_t<aligned_seq_t>>
384 std::ranges::range_reference_t<unaligned_sequence_type>>
385 inline void assign_unaligned(aligned_seq_t & aligned_seq, unaligned_sequence_type && unaligned_seq)
389 tmp.resize(std::ranges::distance(unaligned_seq));
390 #if SEQAN3_WORKAROUND_GCC_BOGUS_MEMCPY
391 # pragma GCC diagnostic push
392 # pragma GCC diagnostic ignored "-Wstringop-overflow"
394 std::ranges::copy(unaligned_seq, std::ranges::begin(tmp));
395 #if SEQAN3_WORKAROUND_GCC_BOGUS_MEMCPY
396 # pragma GCC diagnostic pop
398 swap(aligned_seq, tmp);
422 template <
typename range_type>
424 v.insert_gap(std::ranges::iterator_t<range_type>{});
425 v.insert_gap(std::ranges::iterator_t<range_type>{},
typename range_type::size_type{});
427 std::ranges::iterator_t<range_type>
insert_gap(range_type & rng,
428 std::ranges::iterator_t<range_type>
const pos_it,
429 typename range_type::size_type
const size = 1)
431 return rng.insert_gap(pos_it,
size);
450 template <
typename range_type>
452 std::ranges::iterator_t<range_type>
erase_gap(range_type & rng, std::ranges::iterator_t<range_type>
const pos_it)
454 return rng.erase_gap(pos_it);
475 template <
typename range_type>
477 v.erase_gap(std::ranges::iterator_t<range_type>{}, std::ranges::iterator_t<range_type>{});
479 std::ranges::iterator_t<range_type>
erase_gap(range_type & rng,
480 std::ranges::iterator_t<range_type>
const first,
481 std::ranges::iterator_t<range_type>
const last)
483 return rng.erase_gap(first, last);
488 namespace seqan3::detail
494 template <
typename... elems>
500 template <
typename... elems>
501 inline constexpr
bool all_model_aligned_seq<type_list<elems...>> = all_model_aligned_seq<elems...>;
Includes customized exception types for the alignment module .
requires requires(range_type v)
An implementation of seqan3::writable_aligned_sequence::insert_gap for ranges with the corresponding ...
Definition: aligned_sequence_concept.hpp:423
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::insert_gap for ranges with the corresponding ...
Definition: aligned_sequence_concept.hpp:452
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:427
requires detail::is_gapped_alphabet< std::iter_value_t< aligned_seq_t > > &&weakly_assignable_from< std::ranges::range_reference_t< aligned_seq_t >, std::ranges::range_reference_t< unaligned_sequence_type > > 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:385
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::insert_gap for ranges with the corresponding ...
Definition: aligned_sequence_concept.hpp:479
alphabet_variant< alphabet_t, gap > gapped
Extends a given alphabet with a gap character.
Definition: gapped.hpp:41
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
constexpr size_t size
The size of a type pack.
Definition: type_pack/traits.hpp:146
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.