31namespace seqan3::detail
36struct search_configuration_validator
42 template <
typename query_t>
43 static void validate_query_type()
46 if constexpr (range_dimension_v<pure_query_t> == 1u)
48 static_assert(std::ranges::random_access_range<pure_query_t>,
49 "The query sequence must model random_access_range.");
50 static_assert(std::ranges::sized_range<pure_query_t>,
"The query sequence must model sized_range.");
54 static_assert(std::ranges::forward_range<pure_query_t>,
"The query collection must model forward_range.");
55 static_assert(std::ranges::sized_range<pure_query_t>,
"The query collection must model sized_range.");
56 static_assert(std::ranges::random_access_range<std::ranges::range_value_t<pure_query_t>>,
57 "Elements of the query collection must model random_access_range.");
58 static_assert(std::ranges::sized_range<std::ranges::range_value_t<pure_query_t>>,
59 "Elements of the query collection must model sized_range.");
97template <
typename index_t,
98 std::ranges::forward_range queries_t,
100 requires std::ranges::forward_range<std::ranges::range_reference_t<queries_t>>
101 && std::same_as<range_innermost_value_t<queries_t>,
typename index_t::alphabet_type>
105 auto updated_cfg = detail::search_configurator::add_defaults(cfg);
107 detail::search_configuration_validator::validate_query_type<queries_t>();
109 size_t queries_size = std::ranges::distance(queries);
110 auto indexed_queries =
views::zip(std::views::iota(
size_t{0}, queries_size), std::forward<queries_t>(queries));
112 using indexed_queries_t =
decltype(indexed_queries);
114 using query_t = std::ranges::range_reference_t<indexed_queries_t>;
115 auto [algorithm, complete_config] = detail::search_configurator::configure_algorithm<query_t>(updated_cfg, index);
117 using complete_configuration_t =
decltype(complete_config);
118 using traits_t = detail::search_traits<complete_configuration_t>;
119 using algorithm_result_t =
typename traits_t::search_result_type;
121 detail::execution_handler_parallel,
122 detail::execution_handler_sequential>;
127 if constexpr (std::same_as<execution_handler_t, detail::execution_handler_parallel>)
129 auto thread_count = parallel.thread_count;
131 throw std::runtime_error{
"You must configure the number of threads in seqan3::search_cfg::parallel."};
133 return execution_handler_t{*thread_count};
137 return execution_handler_t{};
142 if constexpr (traits_t::has_user_callback)
144 select_execution_handler().bulk_execute(algorithm,
146 get<search_cfg::on_result>(complete_config).callback);
150 using executor_t = detail::algorithm_executor_blocking<indexed_queries_t,
153 execution_handler_t>;
156 std::move(algorithm),
157 algorithm_result_t{},
158 select_execution_handler()}};
165template <
typename index_t,
166 std::ranges::forward_range queries_t,
168 requires std::ranges::forward_range<std::ranges::range_reference_t<queries_t>>
169 && (!std::same_as<range_innermost_value_t<queries_t>,
typename index_t::alphabet_type>)
170inline auto search(queries_t && queries,
171 index_t
const & index,
174 static_assert(std::convertible_to<range_innermost_value_t<queries_t>,
typename index_t::alphabet_type>,
175 "The alphabet of the text collection must be convertible to the alphabet of the index.");
177 if constexpr (range_dimension_v<queries_t> == 2u)
178 return search(queries | views::deep{views::convert<typename index_t::alphabet_type>}, index, cfg);
180 return search(queries | views::convert<typename index_t::alphabet_type>, index, cfg);
185template <
typename index_t,
186 std::ranges::forward_range query_t,
195template <
typename index_t,
typename configuration_t = decltype(search_cfg::default_configuration)>
196inline auto search(
char const *
const queries,
197 index_t
const & index,
204template <
typename index_t,
typename configuration_t = decltype(search_cfg::default_configuration)>
206 index_t
const & index,
212 [&query](
char const *
const q)
216 return search(std::move(query) | detail::persist, index, cfg);
Provides seqan3::detail::algorithm_executor_blocking.
Provides seqan3::detail::algorithm_result_generator_range.
An input range over the algorithm results generated by the underlying algorithm executor.
Definition: algorithm_result_generator_range.hpp:48
Provides seqan3::configuration and utility functions.
Provides seqan3::views::deep.
Provides the default configuration for the seqan3::search() interface.
seqan3::detail::parallel_mode< std::integral_constant< detail::search_config_id, detail::search_config_id::parallel > > parallel
Enables the parallel execution of the search algorithm if possible for the given configuration.
Definition: parallel.hpp:35
constexpr configuration default_configuration
The default configuration: Compute all exact matches.
Definition: default_configuration.hpp:29
@ single
The text is a single range.
Definition: concept.hpp:93
auto search(queries_t &&queries, index_t const &index, configuration_t const &cfg=search_cfg::default_configuration)
Search a query or a range of queries in an index.
Definition: search.hpp:103
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:146
constexpr auto zip
A view adaptor that takes several views and returns tuple-like values from every i-th element of each...
Definition: zip.hpp:573
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides seqan3::search_cfg::on_result.
Provides seqan3::search_cfg::parallel configuration.
Provides seqan3::detail::persist.
Provides seqan3::detail::search_configurator.
Provides seqan3::detail::search_traits.
Provides seqan3::views::convert.
Provides seqan3::views::zip.