15 #include <type_traits>
25 namespace seqan3::detail
41 template <
typename score_t>
42 struct alignment_optimum
43 #if SEQAN3_DOXYGEN_ONLY(1)0
46 using index_t = IMPLEMENTATION_DEFINED;
49 index_t column_index{};
53 score_t score = IMPLEMENTATION_DEFINED;
71 template <
typename column_index_t,
typename row_index_t>
72 void update_if_new_optimal_score(score_t
const & compare_score,
73 column_index_type<column_index_t> column_index,
74 row_index_type<row_index_t> row_index) noexcept;
76 #endif //SEQAN3_DOXYGEN_ONLY(1): This code block is only dis
80 template <arithmetic score_t>
81 struct alignment_optimum<score_t>
83 size_t column_index{};
87 template <std::
integral column_index_t, std::
integral row_index_t>
88 constexpr
void update_if_new_optimal_score(score_t
const & compare_score,
89 column_index_type<column_index_t> column_index,
90 row_index_type<row_index_t> row_index) noexcept
92 score = (compare_score > score)
93 ? (this->column_index = column_index.get(), this->row_index = row_index.get(), compare_score)
98 template <simd_concept score_t>
99 struct alignment_optimum<score_t>
101 using scalar_t =
typename simd_traits<score_t>::scalar_type;
103 score_t column_index{};
107 template <std::
integral column_index_t, std::
integral row_index_t>
108 constexpr
void update_if_new_optimal_score(score_t
const & compare_score,
109 column_index_type<column_index_t> column_index,
110 row_index_type<row_index_t> row_index) noexcept
112 auto mask = compare_score > score;
113 score = mask ? compare_score : score;
114 this->column_index = mask ? simd::fill<score_t>(column_index.get()) : this->column_index;
115 this->row_index = mask ? simd::fill<score_t>(row_index.get()) : this->row_index;
124 alignment_optimum() -> alignment_optimum<int32_t>;
128 template <
typename column_index_t,
typename row_index_t,
typename score_t>
129 alignment_optimum(column_index_t, row_index_t, score_t) -> alignment_optimum<score_t>;