18 #include <range/v3/algorithm/for_each.hpp>
27 namespace seqan3::detail
37 template <
typename char_t,
tuple_like alignment_t,
size_t ...idx>
41 size_t const alignment_size = get<0>(align).size();
44 for (
size_t begin_pos = 0; begin_pos < alignment_size; begin_pos += 50)
46 size_t const end_pos =
std::min(begin_pos + 50, alignment_size);
52 stream <<
std::setw(7) << begin_pos <<
' ';
53 for (
size_t pos = begin_pos + 1; pos <= end_pos; ++pos)
57 else if (pos % 5 == 0)
66 [&stream] (
char ch) { stream << ch; });
68 auto stream_f = [&] (
auto const & previous_seq,
auto const & aligned_seq)
72 std::ranges::for_each(views::zip(previous_seq, aligned_seq) |
views::slice(begin_pos, end_pos),
73 [&stream] (
auto && ch) { stream << (get<0>(ch) == get<1>(ch) ?
'|' :
' '); });
78 [&stream] (
char ch) { stream << ch; });
80 (stream_f(get<idx>(align), get<idx + 1>(align)), ...);
98 template <
typename char_t,
typename alignment_t>
100 requires (detail::debug_streamable_tuple<alignment_t> &&
103 inline debug_stream_type<char_t> & operator<<(debug_stream_type<char_t> & stream, alignment_t && alignment)
105 constexpr
size_t sequence_count = std::tuple_size_v<std::remove_cvref_t<alignment_t>>;
107 static_assert(sequence_count >= 2,
"An alignment requires at least two sequences.");