20 namespace seqan3::detail
25 template <
typename search_configuration_t>
26 #if !SEQAN3_WORKAROUND_GCC_93467
27 requires is_type_specialisation_of_v<search_configuration_t, configuration>
30 #endif // !SEQAN3_WORKAROUND_GCC_93467
31 struct policy_search_result_builder
35 using search_traits_type = detail::search_traits<search_configuration_t>;
37 using search_result_type =
typename search_traits_type::search_result_type;
39 static_assert(!std::same_as<search_result_type, typename search_traits_type::empty_search_result_type>,
40 "The search result type was not configured properly.");
45 policy_search_result_builder() =
default;
46 policy_search_result_builder(policy_search_result_builder &&) =
default;
47 policy_search_result_builder(policy_search_result_builder
const &) =
default;
48 policy_search_result_builder & operator=(policy_search_result_builder &&) =
default;
49 policy_search_result_builder & operator=(policy_search_result_builder
const &) =
default;
50 ~policy_search_result_builder() =
default;
53 explicit policy_search_result_builder(search_configuration_t
const &)
71 template <
typename index_cursor_t,
typename query_index_t,
typename callback_t>
74 return make_results_impl(
std::move(internal_hits), idx, std::forward<callback_t>(callback));
93 template <
typename index_cursor_t,
typename query_index_t,
typename callback_t>
95 requires search_traits_type::output_requires_locate_call &&
96 (!search_traits_type::search_single_best_hit)
103 make_results_impl(
std::move(internal_hits), idx, [&results] (
auto && search_result)
105 results.push_back(
std::move(search_result));
109 std::sort(results.begin(), results.end(), [] (
auto const & r1,
auto const & r2)
111 return (r1.reference_id() == r2.reference_id()) ? (r1.reference_begin_position() <
112 r2.reference_begin_position())
113 : (r1.reference_id() < r2.reference_id());
116 results.erase(
std::unique(results.begin(), results.end()), results.end());
118 for (
auto && search_result : results)
140 template <
typename index_cursor_t,
typename query_index_t,
typename callback_t>
142 [[maybe_unused]] query_index_t idx,
143 callback_t && callback)
145 auto maybe_locate = [] (
auto const & cursor)
147 if constexpr (search_traits_type::output_requires_locate_call)
148 return cursor.lazy_locate();
153 for (
auto const & cursor : internal_hits)
155 for (
auto && [ref_id, ref_pos] : maybe_locate(cursor))
157 search_result_type result{};
159 if constexpr (search_traits_type::output_query_id)
161 if constexpr (search_traits_type::output_index_cursor)
162 result.cursor_ = cursor;
163 if constexpr (search_traits_type::output_reference_id)
164 result.reference_id_ =
std::move(ref_id);
165 if constexpr (search_traits_type::output_reference_begin_position)
166 result.reference_begin_position_ =
std::move(ref_pos);
170 if constexpr (search_traits_type::search_single_best_hit)