33namespace seqan3::detail
36template <std::ranges::view urng_t>
38 requires std::ranges::sized_range<urng_t> &&
39 std::ranges::random_access_range<urng_t> &&
44template <std::ranges::view urng_t>
46 requires std::ranges::sized_range<urng_t> &&
47 std::ranges::random_access_range<urng_t> &&
50class view_translate_single;
87constexpr bool add_enum_bitwise_operators<translation_frames> =
true;
92namespace seqan3::detail
102template <
bool single>
113 return detail::adaptor_from_functor{*
this, tf};
121 template <std::ranges::range urng_t>
122 constexpr auto operator()(urng_t && urange,
translation_frames const tf = default_frames)
const
124 static_assert(std::ranges::viewable_range<urng_t>,
125 "The range parameter to views::translate[_single] cannot be a temporary of a non-view range.");
126 static_assert(std::ranges::sized_range<urng_t>,
127 "The range parameter to views::translate[_single] must model std::ranges::sized_range.");
128 static_assert(std::ranges::random_access_range<urng_t>,
129 "The range parameter to views::translate[_single] must model std::ranges::random_access_range.");
131 "The range parameter to views::translate[_single] must be over elements of seqan3::nucleotide_alphabet.");
134 return detail::view_translate_single{std::forward<urng_t>(urange), tf};
136 return detail::view_translate{std::forward<urng_t>(urange), tf};
140 template <std::ranges::range urng_t>
141 constexpr friend auto operator|(urng_t && urange, translate_fn
const & me)
143 return me(std::forward<urng_t>(urange));
157template <std::ranges::view urng_t>
159 requires std::ranges::sized_range<urng_t> &&
160 std::ranges::random_access_range<urng_t> &&
163class view_translate_single :
public std::ranges::view_base
171 static constexpr small_string multiple_frame_error{
"Error: Invalid type of frame. Choose one out of "
172 "forward_frame0, reverse_frame0, forward_frame1, "
173 "reverse_frame1, forward_frame2 and reverse_frame2."};
179 using reference = aa27;
181 using const_reference = aa27;
183 using value_type = aa27;
185 using size_type = std::ranges::range_size_t<urng_t>;
187 using difference_type = std::ranges::range_difference_t<urng_t>;
189 using iterator = detail::random_access_iterator<view_translate_single>;
191 using const_iterator = detail::random_access_iterator<view_translate_single const>;
197 view_translate_single() noexcept = default;
198 constexpr view_translate_single(view_translate_single const & rhs) noexcept = default;
199 constexpr view_translate_single(view_translate_single && rhs) noexcept = default;
200 constexpr view_translate_single & operator=(view_translate_single const & rhs) noexcept = default;
201 constexpr view_translate_single & operator=(view_translate_single && rhs) noexcept = default;
202 ~view_translate_single() noexcept = default;
214 : urange{std::move(_urange)}, tf{_tf}
216 if (__builtin_popcount(
static_cast<uint8_t
>(_tf)) > 1)
230 template <
typename rng_t>
232 requires (!std::same_as<std::remove_cvref_t<rng_t>, view_translate_single>) &&
233 std::ranges::viewable_range<rng_t> &&
237 : view_translate_single{std::views::all(std::forward<rng_t>(_urange)), _tf}
257 iterator
begin() noexcept
263 const_iterator
begin() const noexcept
281 iterator
end() noexcept
283 return {*
this,
size()};
287 const_iterator
end() const noexcept
289 return {*
this,
size()};
330 size_type
size()
const
373 reference operator[](size_type
const n)
385 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
393 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
401 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
415 const_reference operator[](size_type
const n)
const
427 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
435 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
443 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
459template <
typename urng_t>
460view_translate_single(urng_t &&,
translation_frames const) -> view_translate_single<std::views::all_t<urng_t>>;
464template <
typename urng_t>
465view_translate_single(urng_t &&) -> view_translate_single<std::views::all_t<urng_t>>;
532namespace seqan3::detail
543template <std::ranges::view urng_t>
545 requires std::ranges::sized_range<urng_t> &&
546 std::ranges::random_access_range<urng_t> &&
549class view_translate :
public std::ranges::view_base
557 small_vector<translation_frames, 6> selected_frames{};
564 using reference = view_translate_single<urng_t>;
566 using const_reference = reference;
568 using value_type = reference;
570 using size_type = std::ranges::range_size_t<urng_t>;
572 using difference_type = std::ranges::range_difference_t<urng_t>;
574 using iterator = detail::random_access_iterator<view_translate>;
576 using const_iterator = detail::random_access_iterator<view_translate const>;
587 template <
typename t>
588 requires (range_dimension_v<t> == range_dimension_v<value_type> + 1) &&
591 static constexpr bool is_compatible_this_aux =
true;
600 view_translate() noexcept = default;
601 constexpr view_translate(view_translate const & rhs) noexcept = default;
602 constexpr view_translate(view_translate && rhs) noexcept = default;
603 constexpr view_translate & operator=(view_translate const & rhs) noexcept = default;
604 constexpr view_translate & operator=(view_translate && rhs) noexcept = default;
605 ~view_translate() noexcept = default;
612 : urange{std::move(_urange)}, tf{_tf}
632 template <
typename rng_t>
634 requires (!std::same_as<std::remove_cvref_t<rng_t>, view_translate>) &&
635 std::ranges::viewable_range<rng_t> &&
639 : view_translate{std::views::all(std::forward<rng_t>(_urange)), _tf}
659 iterator
begin() noexcept
665 const_iterator
begin() const noexcept
683 iterator
end() noexcept
685 return {*
this,
size()};
689 const_iterator
end() const noexcept
691 return {*
this,
size()};
705 size_type
size() noexcept
707 return (size_type) selected_frames.size();
711 size_type
size() const noexcept
713 return (size_type) selected_frames.size();
734 reference operator[](size_type
const n)
741 const_reference operator[](size_type
const n)
const
750template <
typename urng_t>
752 requires std::ranges::sized_range<urng_t> &&
753 std::ranges::random_access_range<urng_t> &&
756view_translate(urng_t &&,
translation_frames const) -> view_translate<std::views::all_t<urng_t>>;
Provides seqan3::aa27, container aliases and string literals.
Provides seqan3::detail::adaptor_from_functor.
Provides seqan3::add_enum_bitwise_operators.
A wrapper type around an existing view adaptor that enables "deep view" behaviour for that view.
Definition: deep.hpp:104
The <concepts> header from C++20's standard library.
Provides various transformation traits used by the range module.
Provides seqan3::views::deep.
Provides seqan3::dna5, container aliases and string literals.
constexpr aa27 translate_triplet(nucl_type const &n1, nucl_type const &n2, nucl_type const &n3) noexcept
Translate one nucleotide triplet into single amino acid (single nucleotide interface).
Definition: translation.hpp:55
constexpr auto complement
Return the complement of a nucleotide object.
Definition: concept.hpp:104
constexpr auto translate
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames.
Definition: translate.hpp:813
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition: translate.hpp:524
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1120
@ single
The text is a single range.
Definition: concept.hpp:74
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
A concept that indicates whether an alphabet represents nucleotides.
The SeqAn namespace for views.
Definition: char_to.hpp:22
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
translation_frames
Specialisation values for single and multiple translation frames.
Definition: translate.hpp:68
@ forward_frame2
The third forward frame starting at position 2.
@ forward_frame0
The first forward frame starting at position 0.
@ reverse_frames
All reverse frames.
@ forward_frames
All forward frames.
@ reverse_frame0
The first reverse frame starting at position 0.
@ forward_reverse2
The first third and third reverse frame.
@ reverse_frame2
The third reverse frame starting at position 2.
@ forward_frame1
The second forward frame starting at position 1.
@ reverse_frame1
The second reverse frame starting at position 1.
@ forward_reverse0
The first forward and first reverse frame.
@ forward_reverse1
The second forward and second reverse frame.
The <ranges> header from C++20's standard library.
A constexpr string implementation to manipulate string literals at compile time.
Provides functions for translating a triplet of nucleotides into an amino acid.