22 namespace seqan3::detail
26 template <
typename configuration_t>
27 #if !SEQAN3_WORKAROUND_GCC_93467
28 requires is_type_specialisation_of_v<configuration_t, configuration>
31 #endif // !SEQAN3_WORKAROUND_GCC_93467
32 class policy_alignment_result_builder;
46 template <
typename sequence1_id_t,
47 typename sequence2_id_t,
54 struct alignment_result_value_type
57 sequence1_id_t sequence1_id{};
59 sequence2_id_t sequence2_id{};
63 end_positions_t end_positions{};
65 begin_positions_t begin_positions{};
67 alignment_t alignment{};
70 score_debug_matrix_t score_debug_matrix{};
72 trace_debug_matrix_t trace_debug_matrix{};
79 alignment_result_value_type()
81 -> alignment_result_value_type<std::nullopt_t *, std::nullopt_t *, std::nullopt_t *>;
84 template <
typename sequence1_
id_t,
typename sequence2_
id_t,
typename score_t>
85 alignment_result_value_type(sequence1_id_t, sequence2_id_t, score_t)
86 -> alignment_result_value_type<sequence1_id_t, sequence2_id_t, score_t>;
89 template <
typename sequence1_
id_t,
typename sequence2_
id_t,
typename score_t,
typename end_positions_t>
90 alignment_result_value_type(sequence1_id_t, sequence2_id_t, score_t, end_positions_t)
91 -> alignment_result_value_type<sequence1_id_t, sequence2_id_t, score_t, end_positions_t>;
94 template <
typename sequence1_id_t,
95 typename sequence2_id_t,
97 typename end_positions_t,
98 typename begin_positions_t>
99 alignment_result_value_type(sequence1_id_t, sequence2_id_t, score_t, end_positions_t, begin_positions_t)
100 -> alignment_result_value_type<sequence1_id_t, sequence2_id_t, score_t, end_positions_t, begin_positions_t>;
103 template <
typename sequence1_id_t,
104 typename sequence2_id_t,
106 typename end_positions_t,
107 typename begin_positions_t,
108 typename alignment_t>
109 alignment_result_value_type(sequence1_id_t, sequence2_id_t, score_t, end_positions_t, begin_positions_t, alignment_t)
110 -> alignment_result_value_type<sequence1_id_t,
119 template <
typename result_t>
120 struct alignment_result_value_type_accessor;
150 template <
typename alignment_result_value_t>
152 requires detail::is_type_specialisation_of_v<alignment_result_value_t, detail::alignment_result_value_type>
158 alignment_result_value_t data{};
164 using sequence1_id_t = decltype(data.sequence1_id);
167 using sequence2_id_t = decltype(data.sequence2_id);
169 using score_t = decltype(data.score);
171 using end_positions_t = decltype(data.end_positions);
173 using begin_positions_t = decltype(data.begin_positions);
175 using alignment_t = decltype(data.alignment);
179 template <
typename configuration_t>
180 #if !SEQAN3_WORKAROUND_GCC_93467
181 requires detail::is_type_specialisation_of_v<configuration_t, configuration>
184 #endif // !SEQAN3_WORKAROUND_GCC_93467
185 friend class detail::policy_alignment_result_builder;
218 static_assert(!std::is_same_v<sequence1_id_t, std::nullopt_t *>,
219 "Trying to access the id of the first sequence, although it was not requested in the"
220 " alignment configuration.");
221 return data.sequence1_id;
229 static_assert(!std::is_same_v<sequence2_id_t, std::nullopt_t *>,
230 "Trying to access the id of the second sequence, although it was not requested in the"
231 " alignment configuration.");
232 return data.sequence2_id;
238 constexpr score_t
score() const noexcept
240 static_assert(!std::is_same_v<score_t, std::nullopt_t *>,
241 "Trying to access the score, although it was not requested in the alignment configuration.");
253 static_assert(!std::is_same_v<end_positions_t, std::nullopt_t *>,
254 "Trying to access the end position of the first sequence, although it was not requested in the"
255 " alignment configuration.");
256 return data.end_positions.first;
267 static_assert(!std::is_same_v<end_positions_t, std::nullopt_t *>,
268 "Trying to access the end position of the second sequence, although it was not requested in the"
269 " alignment configuration.");
270 return data.end_positions.second;
285 static_assert(!std::is_same_v<begin_positions_t, std::nullopt_t *>,
286 "Trying to access the begin position of the first sequence, although it was not requested in the"
287 " alignment configuration.");
288 return data.begin_positions.first;
303 static_assert(!std::is_same_v<begin_positions_t, std::nullopt_t *>,
304 "Trying to access the begin position of the second sequence, although it was not requested in the"
305 " alignment configuration.");
306 return data.begin_positions.second;
315 constexpr alignment_t
const &
alignment() const noexcept
317 static_assert(!std::is_same_v<alignment_t, std::nullopt_t *>,
318 "Trying to access the alignment, although it was not requested in the alignment configuration.");
319 return data.alignment;
335 constexpr
auto const & score_matrix() const noexcept
338 "Trying to access the score matrix, although it was not requested in the alignment configuration.");
339 return data.score_debug_matrix;
353 constexpr
auto const & trace_matrix() const noexcept
356 "Trying to access the trace matrix, although it was not requested in the alignment configuration.");
357 return data.trace_debug_matrix;
363 namespace seqan3::detail
375 template <
typename result_value_t>
376 struct alignment_result_value_type_accessor<alignment_result<result_value_t>>
379 using type = result_value_t;
395 template <
typename char_t,
typename alignment_result_t>
397 requires detail::is_type_specialisation_of_v<std::remove_cvref_t<alignment_result_t>, alignment_result>
399 inline debug_stream_type<char_t> &
operator<<(debug_stream_type<char_t> & stream, alignment_result_t && result)
402 using result_data_t =
403 typename detail::alignment_result_value_type_accessor<std::remove_cvref_t<alignment_result_t>>::type;
405 constexpr
bool has_sequence1_id = !std::is_same_v<decltype(std::declval<result_data_t>().sequence1_id), disabled_t>;
406 constexpr
bool has_sequence2_id = !std::is_same_v<decltype(std::declval<result_data_t>().sequence2_id), disabled_t>;
407 constexpr
bool has_score = !std::is_same_v<decltype(std::declval<result_data_t>().score), disabled_t>;
408 constexpr
bool has_end_positions = !std::is_same_v<decltype(std::declval<result_data_t>().end_positions),
410 constexpr
bool has_begin_positions = !std::is_same_v<decltype(std::declval<result_data_t>().begin_positions),
412 constexpr
bool has_alignment = !std::is_same_v<decltype(std::declval<result_data_t>().alignment), disabled_t>;
414 bool prepend_comma =
false;
415 auto append_to_stream = [&] (
auto && ...args)
417 ((stream << (prepend_comma ?
std::string{
", "} :
std::string{})) << ... << std::forward<decltype(args)>(args));
418 prepend_comma =
true;
422 if constexpr (has_sequence1_id)
423 append_to_stream(
"sequence1 id: ", result.sequence1_id());
424 if constexpr (has_sequence2_id)
425 append_to_stream(
"sequence2 id: ", result.sequence2_id());
426 if constexpr (has_score)
427 append_to_stream(
"score: ", result.score());
428 if constexpr (has_begin_positions)
429 append_to_stream(
"begin: (", result.sequence1_begin_position(),
",", result.sequence2_begin_position(),
")");
430 if constexpr (has_end_positions)
431 append_to_stream(
"end: (", result.sequence1_end_position(),
",", result.sequence2_end_position(),
")");
432 if constexpr (has_alignment)
433 append_to_stream(
"\nalignment:\n", result.alignment());