SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
translate_join.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 
13 #pragma once
14 
15 #include <vector>
16 #include <stdexcept>
17 
22 #include <seqan3/std/concepts>
23 #include <seqan3/std/ranges>
24 
25 namespace seqan3::detail
26 {
27 
28 // ============================================================================
29 // view_translate_join (range definition)
30 // ============================================================================
31 
40 template <std::ranges::view urng_t>
41 class view_translate_join : public ranges::view_base
42 {
43 private:
45  urng_t urange;
49  small_vector<translation_frames, 6> selected_frames{};
50 
51 protected:
53  template <typename, typename>
54  friend class detail::random_access_iterator_base;
55 
59  using reference = view_translate_single<std::ranges::all_view<reference_t<urng_t>>>;
62  using const_reference = reference;
64  using value_type = reference;
66  using size_type = size_type_t<reference_t<urng_t>>;
68  using difference_type = difference_type_t<reference_t<urng_t>>;
70  using iterator = detail::random_access_iterator<view_translate_join>;
72  using const_iterator = detail::random_access_iterator<view_translate_join const>;
74 
75 public:
76 
77  static_assert(dimension_v<urng_t> == 2,
78  "This adaptor only handles range-of-range (two dimensions) as input.");
79  static_assert(std::ranges::viewable_range<urng_t>,
80  "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
81  static_assert(std::ranges::viewable_range<reference_t<urng_t>>,
82  "The inner range of the range parameter to views::translate_join cannot be a temporary of a non-view range.");
83  static_assert(std::ranges::sized_range<urng_t>,
84  "The range parameter to views::translate_join must model std::ranges::sized_range.");
85  static_assert(std::ranges::sized_range<reference_t<urng_t>>,
86  "The inner range of the range parameter to views::translate_join must model std::ranges::sized_range.");
87  static_assert(std::ranges::random_access_range<urng_t>,
88  "The range parameter to views::translate_join must model std::ranges::random_access_range.");
89  static_assert(std::ranges::random_access_range<reference_t<urng_t>>,
90  "The inner range of the range parameter to views::translate_join must model std::ranges::random_access_range.");
91  static_assert(nucleotide_alphabet<reference_t<reference_t<urng_t>>>,
92  "The range parameter to views::translate_join must be over a range over elements of seqan3::nucleotide_alphabet.");
93 
97  view_translate_join() noexcept = default;
98  constexpr view_translate_join(view_translate_join const & rhs) noexcept = default;
99  constexpr view_translate_join(view_translate_join && rhs) noexcept = default;
100  constexpr view_translate_join & operator=(view_translate_join const & rhs) noexcept = default;
101  constexpr view_translate_join & operator=(view_translate_join && rhs) noexcept = default;
102  ~view_translate_join() noexcept = default;
103 
108  view_translate_join(urng_t _urange, translation_frames const _tf = translation_frames::SIX_FRAME)
109  : urange{std::move(_urange)}, tf{_tf}
110  {
112  selected_frames.push_back(translation_frames::FWD_FRAME_0);
114  selected_frames.push_back(translation_frames::FWD_FRAME_1);
116  selected_frames.push_back(translation_frames::FWD_FRAME_2);
118  selected_frames.push_back(translation_frames::REV_FRAME_0);
120  selected_frames.push_back(translation_frames::REV_FRAME_1);
122  selected_frames.push_back(translation_frames::REV_FRAME_2);
123  }
124 
129  template <typename rng_t>
131  requires !std::same_as<remove_cvref_t<rng_t>, view_translate_join> &&
132  std::ranges::viewable_range<rng_t> &&
135  view_translate_join(rng_t && _urange, translation_frames const _tf = translation_frames::SIX_FRAME)
136  : view_translate_join{std::views::all(std::forward<rng_t>(_urange)), _tf}
137  {}
139 
156  iterator begin() noexcept
157  {
158  return {*this, 0};
159  }
160 
162  const_iterator begin() const noexcept
163  requires const_iterable_range<urng_t>
164  {
165  return {*this, 0};
166  }
167 
169  const_iterator cbegin() const noexcept
170  requires const_iterable_range<urng_t>
171  {
172  return begin();
173  }
174 
188  iterator end() noexcept
189  {
190  return {*this, size()};
191  }
192 
194  const_iterator end() const noexcept
195  requires const_iterable_range<urng_t>
196  {
197  return {*this, size()};
198  }
199 
201  const_iterator cend() const noexcept
202  requires const_iterable_range<urng_t>
203  {
204  return end();
205  }
207 
219  size_type size() noexcept
220  {
221  return (size_type) seqan3::size(urange) * selected_frames.size();
222  }
223 
225  size_type size() const noexcept
226  requires const_iterable_range<urng_t>
227  {
228  return (size_type) seqan3::size(urange) * selected_frames.size();
229  }
230 
249  reference operator[](size_type const n)
250  {
251  assert(n < size());
252  size_type index_frame = n % selected_frames.size();
253  size_type index_urange = (n - index_frame) / selected_frames.size();
254  return urange[index_urange] | views::translate_single(selected_frames[index_frame]);
255  }
256 
258  const_reference operator[](size_type const n) const
260  {
261  assert(n < size());
262  size_type index_frame = n % selected_frames.size();
263  size_type index_urange = (n - index_frame) / selected_frames.size();
264  return urange[index_urange] | views::translate_single(selected_frames[index_frame]);
265  }
267 };
268 
270 template <typename urng_t>
271 view_translate_join(urng_t &&, translation_frames const = translation_frames{}) -> view_translate_join<std::ranges::all_view<urng_t>>;
272 
273 // ============================================================================
274 // translate_fn (adaptor definition for both views)
275 // ============================================================================
276 
278 struct translate_join_fn
279 {
281  constexpr auto operator()(translation_frames const tf = translation_frames::SIX_FRAME) const
282  {
283  return detail::adaptor_from_functor{*this, tf};
284  }
285 
291  template <std::ranges::range urng_t>
292  constexpr auto operator()(urng_t && urange, translation_frames const tf = translation_frames::SIX_FRAME) const
293  {
294  static_assert(dimension_v<urng_t> == 2,
295  "This adaptor only handles range-of-range (two dimensions) as input.");
296  static_assert(std::ranges::viewable_range<urng_t>,
297  "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
298  static_assert(std::ranges::viewable_range<reference_t<urng_t>>,
299  "The inner range of the range parameter to views::translate_join cannot be a temporary of a non-view range.");
300  static_assert(std::ranges::sized_range<urng_t>,
301  "The range parameter to views::translate_join must model std::ranges::sized_range.");
302  static_assert(std::ranges::sized_range<reference_t<urng_t>>,
303  "The inner range of the range parameter to views::translate_join must model std::ranges::sized_range.");
304  static_assert(std::ranges::random_access_range<urng_t>,
305  "The range parameter to views::translate_join must model std::ranges::random_access_range.");
306  static_assert(std::ranges::random_access_range<reference_t<urng_t>>,
307  "The inner range of the range parameter to views::translate_join must model std::ranges::random_access_range.");
308  static_assert(nucleotide_alphabet<reference_t<reference_t<urng_t>>>,
309  "The range parameter to views::translate_join must be over a range over elements of seqan3::nucleotide_alphabet.");
310 
311  return detail::view_translate_join{std::forward<urng_t>(urange), tf};
312  }
313 
315  template <std::ranges::range urng_t>
316  constexpr friend auto operator|(urng_t && urange, translate_join_fn const & me)
317  {
318  return me(std::forward<urng_t>(urange));
319  }
320 };
321 
322 } // namespace seqan3::detail
323 
324 // ============================================================================
325 // translate (adaptor object)
326 // ============================================================================
327 
328 namespace seqan3::views
329 {
330 
391 inline constexpr auto translate_join = detail::translate_join_fn{};
393 
394 } // namespace seqan3::views
seqan3::translation_frames::FWD_FRAME_2
The third forward frame starting at position 2.
seqan3::translation_frames::SIX_FRAME
All frames.
seqan3::views
The SeqAn namespace for views.
Definition: view_to_simd.hpp:672
seqan3::views::translate_join
constexpr auto translate_join
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames....
Definition: translate_join.hpp:391
constructible_from
The std::constructible_from concept specifies that a variable of type T can be initialized with the g...
seqan3::reference_t
typename reference< t >::type reference_t
Shortcut for seqan3::reference (transformation_trait shortcut).
Definition: pre.hpp:77
vector
seqan3::views::move
const auto move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
seqan3::translation_frames::REV_FRAME_1
The second reverse frame starting at position 1.
seqan3::operator|
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1023
concepts
The Concepts library.
same_as
The concept std::same_as<T, U> is satisfied if and only if T and U denote the same type.
stdexcept
random_access_iterator.hpp
Provides the seqan3::detail::random_access_iterator class.
translate.hpp
Provides seqan3::views::translate and seqan3::views::translate_single.
seqan3::translation_frames::FWD_FRAME_1
The second forward frame starting at position 1.
nucleotide_alphabet
A concept that indicates whether an alphabet represents nucleotides.
small_string.hpp
A constexpr string implementation to manipulate string literals at compile time.
range.hpp
Provides various transformation traits used by the range module.
const_iterable_range
Specifies requirements of an input range type for which the const version of that type satisfies the ...
seqan3::search_cfg::all
constexpr detail::search_mode_all all
Configuration element to receive all hits within the error bounds.
Definition: mode.hpp:43
seqan3::pack_traits::size
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:116
ranges
Adaptations of concepts from the Ranges TS.
std::begin
T begin(T... args)
std::end
T end(T... args)
seqan3::translation_frames
translation_frames
Specialisation values for single and multiple translation frames.
Definition: translate.hpp:64
seqan3::translation_frames::FWD_FRAME_0
The first forward frame starting at position 0.
seqan3::views::translate_single
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition: translate.hpp:504
seqan3::translation_frames::REV_FRAME_0
The first reverse frame starting at position 0.
seqan3::translation_frames::REV_FRAME_2
The third reverse frame starting at position 2.