16 #include <type_traits>
24 namespace seqan3::detail
28 enum class error_type : uint8_t
61 template <
bool abort_on_hit,
typename query_t,
typename cursor_t,
typename delegate_t>
62 inline bool search_trivial(cursor_t cur,
64 typename cursor_t::size_type
const query_pos,
65 search_param
const error_left,
66 error_type
const prev_error,
67 delegate_t && delegate) noexcept(noexcept(delegate))
84 bool const allow_insertion = (cur.query_length() > 0) ? cur.last_rank() !=
seqan3::to_rank(query[query_pos]) : true;
86 if (allow_insertion && (prev_error != error_type::deletion || error_left.substitution == 0) &&
87 error_left.insertion > 0)
89 search_param error_left2{error_left};
90 error_left2.insertion--;
95 if (search_trivial<abort_on_hit>(cur,
98 error_type::insertion,
107 if (((query_pos > 0 && error_left.deletion > 0) || error_left.substitution > 0) && cur.extend_right())
112 if (error_left.substitution > 0)
115 search_param error_left2{error_left};
116 error_left2.total -= delta;
117 error_left2.substitution -= delta;
119 if (search_trivial<abort_on_hit>(cur,
135 if (error_left.substitution == 0 && cur.last_rank() ==
seqan3::to_rank(query[query_pos]))
137 if (search_trivial<abort_on_hit>(cur,
153 if ((prev_error != error_type::insertion || error_left.substitution == 0) &&
154 error_left.deletion > 0)
156 search_param error_left2{error_left};
158 error_left2.deletion--;
163 if (search_trivial<abort_on_hit>(cur,
167 error_type::deletion,
176 }
while (cur.cycle_back());
181 if (cur.extend_right(query[query_pos]))
183 if (search_trivial<abort_on_hit>(cur,
218 template <
bool abort_on_hit,
typename index_t,
typename query_t,
typename delegate_t>
219 inline void search_trivial(index_t
const & index,
221 search_param
const error_left,
222 delegate_t && delegate) noexcept(noexcept(delegate))
224 search_trivial<abort_on_hit>(index.begin(), query, 0, error_left, error_type::none, delegate);