30namespace seqan3::detail
33template <std::ranges::view urng_t>
34 requires std::ranges::sized_range<urng_t> && std::ranges::random_access_range<urng_t>
35 && nucleotide_alphabet<std::ranges::range_reference_t<urng_t>>
38template <std::ranges::view urng_t>
39 requires std::ranges::sized_range<urng_t> && std::ranges::random_access_range<urng_t>
40 && nucleotide_alphabet<std::ranges::range_reference_t<urng_t>>
41class view_translate_single;
78inline constexpr bool add_enum_bitwise_operators<translation_frames> =
true;
83namespace seqan3::detail
103 return detail::adaptor_from_functor{*
this, tf};
111 template <std::ranges::range urng_t>
112 constexpr auto operator()(urng_t && urange,
translation_frames const tf = default_frames)
const
114 static_assert(std::ranges::viewable_range<urng_t>,
115 "The range parameter to views::translate[_single] cannot be a temporary of a non-view range.");
116 static_assert(std::ranges::sized_range<urng_t>,
117 "The range parameter to views::translate[_single] must model std::ranges::sized_range.");
118 static_assert(std::ranges::random_access_range<urng_t>,
119 "The range parameter to views::translate[_single] must model std::ranges::random_access_range.");
121 nucleotide_alphabet<std::ranges::range_reference_t<urng_t>>,
122 "The range parameter to views::translate[_single] must be over elements of seqan3::nucleotide_alphabet.");
131 template <std::ranges::range urng_t>
132 constexpr friend auto operator|(urng_t && urange, translate_fn
const & me)
148template <std::ranges::view urng_t>
149 requires std::ranges::sized_range<urng_t> && std::ranges::random_access_range<urng_t>
150 && nucleotide_alphabet<std::ranges::range_reference_t<urng_t>>
151class view_translate_single :
public std::ranges::view_base
159 static constexpr small_string multiple_frame_error{
"Error: Invalid type of frame. Choose one out of "
160 "forward_frame0, reverse_frame0, forward_frame1, "
161 "reverse_frame1, forward_frame2 and reverse_frame2."};
168 using reference = aa27;
170 using const_reference = aa27;
172 using value_type = aa27;
174 using size_type = std::ranges::range_size_t<urng_t>;
176 using difference_type = std::ranges::range_difference_t<urng_t>;
178 using iterator = detail::random_access_iterator<view_translate_single>;
180 using const_iterator = detail::random_access_iterator<view_translate_single const>;
186 view_translate_single() noexcept = default;
187 constexpr view_translate_single(view_translate_single const & rhs) noexcept = default;
188 constexpr view_translate_single(view_translate_single && rhs) noexcept = default;
189 constexpr view_translate_single & operator=(view_translate_single const & rhs) noexcept = default;
190 constexpr view_translate_single & operator=(view_translate_single && rhs) noexcept = default;
191 ~view_translate_single() noexcept = default;
202 urange{std::move(_urange)},
205 if (__builtin_popcount(
static_cast<uint8_t
>(_tf)) > 1)
207 throw std::invalid_argument(multiple_frame_error.c_str());
219 template <
typename rng_t>
220 requires (!std::same_as<std::remove_cvref_t<rng_t>, view_translate_single>)
221 && std::ranges::viewable_range<rng_t>
222 && std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
244 iterator begin() noexcept
250 const_iterator begin() const noexcept
268 iterator end() noexcept
270 return {*
this, size()};
274 const_iterator end() const noexcept
276 return {*
this, size()};
298 return std::ranges::size(urange) / 3;
311 throw std::invalid_argument(multiple_frame_error.c_str());
317 size_type size()
const
324 return std::ranges::size(urange) / 3;
337 throw std::invalid_argument(multiple_frame_error.c_str());
360 reference operator[](size_type
const n)
370 catch (std::invalid_argument
const &)
377 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
381 complement((urange)[(urange).size() - n * 3 - 2]),
382 complement((urange)[(urange).size() - n * 3 - 3]));
385 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
389 complement((urange)[(urange).size() - n * 3 - 3]),
390 complement((urange)[(urange).size() - n * 3 - 4]));
393 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
397 complement((urange)[(urange).size() - n * 3 - 4]),
398 complement((urange)[(urange).size() - n * 3 - 5]));
401 throw std::invalid_argument(multiple_frame_error.c_str());
407 const_reference operator[](size_type
const n)
const
417 catch (std::invalid_argument
const &)
424 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
428 complement((urange)[(urange).size() - n * 3 - 2]),
429 complement((urange)[(urange).size() - n * 3 - 3]));
432 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
436 complement((urange)[(urange).size() - n * 3 - 3]),
437 complement((urange)[(urange).size() - n * 3 - 4]));
440 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
444 complement((urange)[(urange).size() - n * 3 - 4]),
445 complement((urange)[(urange).size() - n * 3 - 5]));
448 throw std::invalid_argument(multiple_frame_error.c_str());
456template <
typename urng_t>
457view_translate_single(urng_t &&,
translation_frames const) -> view_translate_single<std::views::all_t<urng_t>>;
460template <
typename urng_t>
461view_translate_single(urng_t &&) -> view_translate_single<std::views::all_t<urng_t>>;
528namespace seqan3::detail
539template <std::ranges::view urng_t>
540 requires std::ranges::sized_range<urng_t> && std::ranges::random_access_range<urng_t>
542class view_translate :
public std::ranges::view_base
557 using reference = view_translate_single<urng_t>;
559 using const_reference = reference;
561 using value_type = reference;
563 using size_type = std::ranges::range_size_t<urng_t>;
565 using difference_type = std::ranges::range_difference_t<urng_t>;
567 using iterator = detail::random_access_iterator<view_translate>;
569 using const_iterator = detail::random_access_iterator<view_translate const>;
580 template <
typename t>
584 static constexpr bool is_compatible_this_aux =
true;
592 view_translate() noexcept = default;
593 constexpr view_translate(view_translate const & rhs) noexcept = default;
594 constexpr view_translate(view_translate && rhs) noexcept = default;
595 constexpr view_translate & operator=(view_translate const & rhs) noexcept = default;
596 constexpr view_translate & operator=(view_translate && rhs) noexcept = default;
597 ~view_translate() noexcept = default;
604 urange{std::move(_urange)},
625 template <
typename rng_t>
626 requires (!std::same_as<std::remove_cvref_t<rng_t>, view_translate>) && std::ranges::viewable_range<rng_t>
627 && std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
649 iterator begin() noexcept
655 const_iterator begin() const noexcept
673 iterator end() noexcept
675 return {*
this, size()};
679 const_iterator end() const noexcept
681 return {*
this, size()};
695 size_type size() noexcept
697 return (size_type)selected_frames.size();
701 size_type size() const noexcept
703 return (size_type)selected_frames.size();
724 reference operator[](size_type
const n)
731 const_reference operator[](size_type
const n)
const
740template <
typename urng_t>
741 requires std::ranges::sized_range<urng_t> && std::ranges::random_access_range<urng_t>
742 && nucleotide_alphabet<std::ranges::range_reference_t<urng_t>>
743view_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.
small_string(char const(&)[N]) -> small_string< N - 1 >
Deduces small_string from string literals.
A wrapper type around an existing view adaptor that enables "deep view" behaviour for that view.
Definition deep.hpp:101
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:52
constexpr auto complement
Return the complement of a nucleotide object.
Definition alphabet/nucleotide/concept.hpp:102
constexpr auto translate
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames.
Definition translate.hpp:800
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition translate.hpp:520
typename range_innermost_value< t >::type range_innermost_value_t
Shortcut for seqan3::range_innermost_value (transformation_trait shortcut).
Definition core/range/type_traits.hpp:95
constexpr size_t range_dimension_v
Returns the number of times you can call seqan3::value_type_t recursively on t (type trait).
Definition core/range/type_traits.hpp:112
@ single
The text is a single range.
Definition search/fm_index/concept.hpp:71
A concept that indicates whether an alphabet represents nucleotides.
The SeqAn namespace for views.
Definition char_strictly_to.hpp:19
The main SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
small_vector(value_type const (&array)[capacity2]) -> small_vector< value_type, capacity2 >
Deducts the size and value type from an built-in array on construction.
translation_frames
Specialisation values for single and multiple translation frames.
Definition translate.hpp:59
@ forward_frame2
The third forward frame starting at position 2.
Definition translate.hpp:62
@ forward_frame0
The first forward frame starting at position 0.
Definition translate.hpp:60
@ reverse_frames
All reverse frames.
Definition translate.hpp:70
@ forward_frames
All forward frames.
Definition translate.hpp:69
@ six_frames
All frames.
Definition translate.hpp:71
@ reverse_frame0
The first reverse frame starting at position 0.
Definition translate.hpp:63
@ forward_reverse2
The first third and third reverse frame.
Definition translate.hpp:68
@ reverse_frame2
The third reverse frame starting at position 2.
Definition translate.hpp:65
@ forward_frame1
The second forward frame starting at position 1.
Definition translate.hpp:61
@ reverse_frame1
The second reverse frame starting at position 1.
Definition translate.hpp:64
@ forward_reverse0
The first forward and first reverse frame.
Definition translate.hpp:66
@ forward_reverse1
The second forward and second reverse frame.
Definition translate.hpp:67
A constexpr string implementation to manipulate string literals at compile time.
Provides functions for translating a triplet of nucleotides into an amino acid.