20namespace seqan3::detail
25template <
typename search_configuration_t>
26 requires is_type_specialisation_of_v<search_configuration_t, configuration>
27struct policy_search_result_builder
31 using search_traits_type = detail::search_traits<search_configuration_t>;
33 using search_result_type =
typename search_traits_type::search_result_type;
35 static_assert(!std::same_as<search_result_type, typename search_traits_type::empty_search_result_type>,
36 "The search result type was not configured properly.");
41 policy_search_result_builder() =
default;
42 policy_search_result_builder(policy_search_result_builder &&) =
default;
43 policy_search_result_builder(policy_search_result_builder
const &) =
default;
44 policy_search_result_builder & operator=(policy_search_result_builder &&) =
default;
45 policy_search_result_builder & operator=(policy_search_result_builder
const &) =
default;
46 ~policy_search_result_builder() =
default;
49 explicit policy_search_result_builder(search_configuration_t
const &)
67 template <
typename index_cursor_t,
typename query_index_t,
typename callback_t>
70 return make_results_impl(std::move(internal_hits), idx, std::forward<callback_t>(callback));
89 template <
typename index_cursor_t,
typename query_index_t,
typename callback_t>
90 requires search_traits_type::output_requires_locate_call && (!search_traits_type::search_single_best_hit)
96 make_results_impl(std::move(internal_hits),
98 [&results](
auto && search_result)
100 results.push_back(std::move(search_result));
106 [](
auto const & r1,
auto const & r2)
108 return (r1.reference_id() == r2.reference_id())
109 ? (r1.reference_begin_position() < r2.reference_begin_position())
110 : (r1.reference_id() < r2.reference_id());
113 results.erase(
std::unique(results.begin(), results.end()), results.end());
115 for (
auto && search_result : results)
116 callback(std::move(search_result));
137 template <
typename index_cursor_t,
typename query_index_t,
typename callback_t>
139 [[maybe_unused]] query_index_t idx,
140 callback_t && callback)
142 auto maybe_locate = [](
auto const & cursor)
144 if constexpr (search_traits_type::output_requires_locate_call)
145 return cursor.lazy_locate();
150 for (
auto const & cursor : internal_hits)
152 for (
auto && [ref_id, ref_pos] : maybe_locate(cursor))
154 search_result_type result{};
156 if constexpr (search_traits_type::output_query_id)
157 result.query_id_ = std::move(idx);
158 if constexpr (search_traits_type::output_index_cursor)
159 result.cursor_ = cursor;
160 if constexpr (search_traits_type::output_reference_id)
161 result.reference_id_ = std::move(ref_id);
162 if constexpr (search_traits_type::output_reference_begin_position)
163 result.reference_begin_position_ = std::move(ref_pos);
167 if constexpr (search_traits_type::search_single_best_hit)
@ single
The text is a single range.
Definition: concept.hpp:93
Provides the concept for seqan3::detail::sdsl_index.
Provides seqan3::search_result.
Provides seqan3::detail::search_traits.
Provides type traits for working with templates.