SeqAn3  3.1.0
The Modern C++ library for sequence analysis.
search_result.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
14 #pragma once
15 
16 #include <seqan3/std/concepts>
17 #include <exception>
18 
26 
27 namespace seqan3::detail
28 {
29 // forward declaration
30 template <typename search_configuration_t>
31 #if !SEQAN3_WORKAROUND_GCC_93467
32  requires is_type_specialisation_of_v<search_configuration_t, configuration>
33 #endif // !SEQAN3_WORKAROUND_GCC_93467
34 struct policy_search_result_builder;
35 } // namespace seqan3::detail
36 
37 namespace seqan3
38 {
39 
69 template <typename query_id_type,
70  typename cursor_type,
71  typename reference_id_type,
72  typename reference_begin_position_type>
74  requires (std::integral<query_id_type> || std::same_as<query_id_type, detail::empty_type>) &&
75  (detail::template_specialisation_of<cursor_type, fm_index_cursor> ||
76  detail::template_specialisation_of<cursor_type, bi_fm_index_cursor> ||
77  std::same_as<cursor_type, detail::empty_type>) &&
78  (std::integral<reference_id_type> || std::same_as<reference_id_type, detail::empty_type>) &&
79  (std::integral<reference_begin_position_type> || std::same_as<reference_begin_position_type,
80  detail::empty_type>)
83 {
84 private:
86  query_id_type query_id_{};
88  cursor_type cursor_{};
90  reference_id_type reference_id_{};
92  reference_begin_position_type reference_begin_position_{};
93 
94  // Grant the policy access to private constructors.
95  template <typename search_configuration_t>
96  #if !SEQAN3_WORKAROUND_GCC_93467
98  requires detail::is_type_specialisation_of_v<search_configuration_t, configuration>
100  #endif // !SEQAN3_WORKAROUND_GCC_93467
101  friend struct detail::policy_search_result_builder;
102 
103 public:
107  search_result() = default;
108  search_result(search_result const &) = default;
109  search_result(search_result &&) = default;
110  search_result & operator=(search_result const &) = default;
112  ~search_result() = default;
113 
115 
121  constexpr auto query_id() const noexcept
122  {
123  static_assert(!std::same_as<query_id_type, detail::empty_type>,
124  "You tried to access the query_id but it was not selected in the output "
125  "configuration of the search.");
126 
127  return query_id_;
128  }
129 
134  constexpr auto index_cursor() const noexcept(!(std::same_as<cursor_type, detail::empty_type>))
135  {
136  static_assert(!std::same_as<cursor_type, detail::empty_type>,
137  "You tried to access the index cursor but it was not selected in the output "
138  "configuration of the search.");
139 
140  return cursor_;
141  }
142 
149  constexpr auto reference_id() const noexcept(!(std::same_as<reference_id_type, detail::empty_type>))
150  {
151  static_assert(!std::same_as<reference_id_type, detail::empty_type>,
152  "You tried to access the reference id but it was not selected in the output "
153  "configuration of the search.");
154 
155  return reference_id_;
156  }
157 
159  constexpr auto reference_begin_position() const
160  noexcept(!(std::same_as<reference_begin_position_type, detail::empty_type>))
161  {
162  static_assert(!std::same_as<reference_begin_position_type, detail::empty_type>,
163  "You tried to access the reference begin position but it was not selected in the "
164  "output configuration of the search.");
165 
166  return reference_begin_position_;
167  }
169 
174  friend bool operator==(search_result const & lhs, search_result const & rhs) noexcept
175  {
176  bool equality = lhs.query_id_ == rhs.query_id_;
177  if constexpr (!std::is_same_v<cursor_type, detail::empty_type>)
178  equality &= lhs.cursor_ == rhs.cursor_;
179  if constexpr (!std::is_same_v<reference_id_type, detail::empty_type>)
180  equality &= lhs.reference_id_ == rhs.reference_id_;
181  if constexpr (!std::is_same_v<reference_begin_position_type, detail::empty_type>)
182  equality &= lhs.reference_begin_position_ == rhs.reference_begin_position_;
183 
184  return equality;
185  }
186 
188  friend bool operator!=(search_result const & lhs, search_result const & rhs) noexcept
189  {
190  return !(lhs == rhs);
191  }
193 };
194 
202 template <typename char_t, typename search_result_t>
204  requires detail::is_type_specialisation_of_v<std::remove_cvref_t<search_result_t>, search_result>
206 inline debug_stream_type<char_t> & operator<<(debug_stream_type<char_t> & stream, search_result_t && result)
207 {
208  using result_type_list = detail::transfer_template_args_onto_t<std::remove_cvref_t<search_result_t>, type_list>;
209 
210  stream << "<";
211  if constexpr (!std::same_as<list_traits::at<0, result_type_list>, detail::empty_type>)
212  stream << "query_id:" << result.query_id();
213  if constexpr (!std::same_as<list_traits::at<1, result_type_list>, detail::empty_type>)
214  stream << ", index cursor is present";
215  if constexpr (!std::same_as<list_traits::at<2, result_type_list>, detail::empty_type>)
216  stream << ", reference_id:" << result.reference_id();
217  if constexpr (!std::same_as<list_traits::at<3, result_type_list>, detail::empty_type>)
218  stream << ", reference_pos:" << result.reference_begin_position();
219  stream << ">";
220 
221  return stream;
222 }
223 
224 } // namespace seqan3
Provides the seqan3::bi_fm_index_cursor for searching in the bidirectional seqan3::bi_fm_index.
The result class generated by the seqan3::seach algorithm.
Definition: search_result.hpp:83
friend bool operator!=(search_result const &lhs, search_result const &rhs) noexcept
Returns whether lhs and rhs are not the same.
Definition: search_result.hpp:188
search_result()=default
Defaulted.
constexpr auto index_cursor() const noexcept(!(std::same_as< cursor_type, detail::empty_type >))
Returns the index cursor pointing to the suffix array range where the query was found.
Definition: search_result.hpp:134
constexpr auto reference_begin_position() const noexcept(!(std::same_as< reference_begin_position_type, detail::empty_type >))
Returns the reference begin positions where the query was found in the reference text (at reference i...
Definition: search_result.hpp:159
search_result(search_result &&)=default
Defaulted.
friend bool operator==(search_result const &lhs, search_result const &rhs) noexcept
Returns whether lhs and rhs are the same.
Definition: search_result.hpp:174
constexpr auto query_id() const noexcept
Returns the id of the query which produced this search result.
Definition: search_result.hpp:121
search_result(search_result const &)=default
Defaulted.
~search_result()=default
Defaulted.
constexpr auto reference_id() const noexcept(!(std::same_as< reference_id_type, detail::empty_type >))
Returns the reference id where the query was found.
Definition: search_result.hpp:149
search_result & operator=(search_result const &)=default
Defaulted.
search_result & operator=(search_result &&)=default
Defaulted.
The <concepts> header from C++20's standard library.
Provides seqan3::configuration and utility functions.
Provides seqan3::debug_stream and related types.
Provides seqan3::detail::empty_type.
Provides the seqan3::fm_index_cursor for searching in the unidirectional seqan3::fm_index.
debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &stream, alignment_t &&alignment)
Stream operator for alignments, which are represented as tuples of aligned sequences.
Definition: debug_stream_alignment.hpp:101
typename decltype(detail::at< idx >(list_t{}))::type at
Return the type at given index from the type list.
Definition: traits.hpp:260
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
SeqAn specific customisations in the standard namespace.
Provides the concept for seqan3::detail::sdsl_index.
Provides type traits for working with templates.