40 template <std::ranges::view urng_t>
41 class view_translate_join :
public ranges::view_base
49 small_vector<translation_frames, 6> selected_frames{};
53 template <
typename,
typename>
54 friend class detail::random_access_iterator_base;
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>;
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.");
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;
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);
129 template <
typename rng_t>
132 std::ranges::viewable_range<rng_t> &&
136 : view_translate_join{
std::views::all(std::forward<rng_t>(_urange)), _tf}
156 iterator
begin() noexcept
162 const_iterator
begin() const noexcept
163 requires const_iterable_range<urng_t>
169 const_iterator
cbegin() const noexcept
170 requires const_iterable_range<urng_t>
188 iterator
end() noexcept
190 return {*
this,
size()};
194 const_iterator
end() const noexcept
195 requires const_iterable_range<urng_t>
197 return {*
this,
size()};
201 const_iterator
cend() const noexcept
202 requires const_iterable_range<urng_t>
219 size_type
size() noexcept
221 return (size_type)
seqan3::size(urange) * selected_frames.size();
225 size_type
size() const noexcept
226 requires const_iterable_range<urng_t>
228 return (size_type)
seqan3::size(urange) * selected_frames.size();
249 reference operator[](size_type
const n)
252 size_type index_frame = n % selected_frames.size();
253 size_type index_urange = (n - index_frame) / selected_frames.size();
258 const_reference operator[](size_type
const n)
const 259 requires const_iterable_range<urng_t>
262 size_type index_frame = n % selected_frames.size();
263 size_type index_urange = (n - index_frame) / selected_frames.size();
270 template <
typename urng_t>
278 struct translate_join_fn
283 return detail::adaptor_from_functor{*
this, tf};
291 template <std::ranges::range urng_t>
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.");
311 return detail::view_translate_join{std::forward<urng_t>(urange), tf};
315 template <std::ranges::range urng_t>
316 constexpr
friend auto operator|(urng_t && urange, translate_join_fn
const & me)
318 return me(std::forward<urng_t>(urange));
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition: translate.hpp:504
constexpr auto translate_join
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames. Input and output range are always two-dimensional.
Definition: translate_join.hpp:391
Provides the seqan3::detail::random_access_iterator class.
detail::search_mode_all constexpr all
Configuration element to receive all hits within the error bounds.
Definition: mode.hpp:43
The SeqAn namespace for views.
Definition: view_to_simd.hpp:672
Provides seqan3::views::translate and seqan3::views::translate_single.
Adaptations of concepts from the Ranges TS.
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:116
The second forward frame starting at position 1.
Definition: aligned_sequence_concept.hpp:36
A constexpr string implementation to manipulate string literals at compile time.
The std::constructible_from concept specifies that a variable of type T can be initialized with the g...
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1023
Provides various transformation traits used by the range module.
typename reference< t >::type reference_t
Shortcut for seqan3::reference (transformation_trait shortcut).
Definition: pre.hpp:77
The third forward frame starting at position 2.
The first forward frame starting at position 0.
The second reverse frame starting at position 1.
The concept std::same_as<T, U> is satisfied if and only if T and U denote the same type...
The first reverse frame starting at position 0.
translation_frames
Specialisation values for single and multiple translation frames.
Definition: translate.hpp:64
The third reverse frame starting at position 2.