SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
policy_search_result_builder.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
16
17namespace seqan3::detail
18{
19
22template <typename search_configuration_t>
23 requires seqan3::detail::is_type_specialisation_of_v<search_configuration_t, configuration>
24struct policy_search_result_builder
25{
26protected:
28 using search_traits_type = detail::search_traits<search_configuration_t>;
30 using search_result_type = typename search_traits_type::search_result_type;
31
32 static_assert(!std::same_as<search_result_type, typename search_traits_type::empty_search_result_type>,
33 "The search result type was not configured properly.");
34
38 policy_search_result_builder() = default;
39 policy_search_result_builder(policy_search_result_builder &&) = default;
40 policy_search_result_builder(policy_search_result_builder const &) = default;
41 policy_search_result_builder & operator=(policy_search_result_builder &&) = default;
42 policy_search_result_builder & operator=(policy_search_result_builder const &) = default;
43 ~policy_search_result_builder() = default;
44
46 explicit policy_search_result_builder(search_configuration_t const &)
47 {}
49
64 template <typename index_cursor_t, typename query_index_t, typename callback_t>
65 void make_results(std::vector<index_cursor_t> internal_hits, query_index_t idx, callback_t && callback)
66 {
67 return make_results_impl(std::move(internal_hits), idx, std::forward<callback_t>(callback));
68 }
69
86 template <typename index_cursor_t, typename query_index_t, typename callback_t>
87 requires search_traits_type::output_requires_locate_call && (!search_traits_type::search_single_best_hit)
88 void make_results(std::vector<index_cursor_t> internal_hits, query_index_t idx, callback_t && callback)
89 {
91 results.reserve(internal_hits.size()); // expect at least as many text positions as cursors, possibly more
92
93 make_results_impl(std::move(internal_hits),
94 idx,
95 [&results](auto && search_result)
96 {
97 results.push_back(std::move(search_result));
98 });
99
100 // sort by reference id or by reference position if both have the same reference id.
101 std::sort(results.begin(),
102 results.end(),
103 [](auto const & r1, auto const & r2)
104 {
105 return (r1.reference_id() == r2.reference_id())
106 ? (r1.reference_begin_position() < r2.reference_begin_position())
107 : (r1.reference_id() < r2.reference_id());
108 });
109
110 results.erase(std::unique(results.begin(), results.end()), results.end());
111
112 for (auto && search_result : results)
113 callback(std::move(search_result));
114 }
115
116private:
134 template <typename index_cursor_t, typename query_index_t, typename callback_t>
135 void make_results_impl(std::vector<index_cursor_t> internal_hits,
136 [[maybe_unused]] query_index_t idx,
137 callback_t && callback)
138 {
139 auto maybe_locate = [](auto const & cursor)
140 {
141 if constexpr (search_traits_type::output_requires_locate_call)
142 return cursor.lazy_locate();
143 else
144 return std::views::single(std::tuple{0, 0});
145 };
146
147 for (auto const & cursor : internal_hits)
148 {
149 for (auto && [ref_id, ref_pos] : maybe_locate(cursor))
150 {
151 search_result_type result{};
152
153 if constexpr (search_traits_type::output_query_id)
154 result.query_id_ = std::move(idx);
155 if constexpr (search_traits_type::output_index_cursor)
156 result.cursor_ = cursor;
157 if constexpr (search_traits_type::output_reference_id)
158 result.reference_id_ = std::move(ref_id);
159 if constexpr (search_traits_type::output_reference_begin_position)
160 result.reference_begin_position_ = std::move(ref_pos);
161
162 callback(result);
163
164 if constexpr (search_traits_type::search_single_best_hit)
165 return;
166 }
167 }
168 }
169};
170
171} // namespace seqan3::detail
@ ref_id
The identifier of the (reference) sequence that seqan3::field::seq was aligned to.
T move(T... args)
SeqAn specific customisations in the standard namespace.
T reserve(T... args)
Provides the concept for seqan3::detail::sdsl_index.
Provides seqan3::search_result.
Provides seqan3::detail::search_traits.
T size(T... args)
T sort(T... args)
Provides type traits for working with templates.
T unique(T... args)
Hide me