35 namespace seqan3::detail
38 template <std::ranges::view urng_t>
40 requires std::ranges::sized_range<urng_t> &&
41 std::ranges::random_access_range<urng_t> &&
46 template <std::ranges::view urng_t>
48 requires std::ranges::sized_range<urng_t> &&
49 std::ranges::random_access_range<urng_t> &&
52 class view_translate_single;
89 constexpr
bool add_enum_bitwise_operators<translation_frames> =
true;
94 namespace seqan3::detail
104 template <
bool single>
115 return detail::adaptor_from_functor{*
this, tf};
123 template <std::ranges::range urng_t>
124 constexpr
auto operator()(urng_t && urange,
translation_frames const tf = default_frames)
const
126 static_assert(std::ranges::viewable_range<urng_t>,
127 "The range parameter to views::translate[_single] cannot be a temporary of a non-view range.");
128 static_assert(std::ranges::sized_range<urng_t>,
129 "The range parameter to views::translate[_single] must model std::ranges::sized_range.");
130 static_assert(std::ranges::random_access_range<urng_t>,
131 "The range parameter to views::translate[_single] must model std::ranges::random_access_range.");
133 "The range parameter to views::translate[_single] must be over elements of seqan3::nucleotide_alphabet.");
136 return detail::view_translate_single{std::forward<urng_t>(urange), tf};
138 return detail::view_translate{std::forward<urng_t>(urange), tf};
142 template <std::ranges::range urng_t>
143 constexpr
friend auto operator|(urng_t && urange, translate_fn
const & me)
145 return me(std::forward<urng_t>(urange));
159 template <std::ranges::view urng_t>
161 requires std::ranges::sized_range<urng_t> &&
162 std::ranges::random_access_range<urng_t> &&
165 class view_translate_single :
public std::ranges::view_base
173 static constexpr small_string multiple_frame_error{
"Error: Invalid type of frame. Choose one out of FWD_FRAME_0, "
174 "REV_FRAME_0, FWD_FRAME_1, REV_FRAME_1, FWD_FRAME_2 and "
181 using reference = aa27;
183 using const_reference = aa27;
185 using value_type = aa27;
187 using size_type = std::ranges::range_size_t<urng_t>;
189 using difference_type = std::ranges::range_difference_t<urng_t>;
191 using iterator = detail::random_access_iterator<view_translate_single>;
193 using const_iterator = detail::random_access_iterator<view_translate_single const>;
199 view_translate_single() noexcept = default;
200 constexpr view_translate_single(view_translate_single const & rhs) noexcept = default;
201 constexpr view_translate_single(view_translate_single && rhs) noexcept = default;
202 constexpr view_translate_single & operator=(view_translate_single const & rhs) noexcept = default;
203 constexpr view_translate_single & operator=(view_translate_single && rhs) noexcept = default;
204 ~view_translate_single() noexcept = default;
218 if (__builtin_popcount(
static_cast<uint8_t
>(_tf)) > 1)
232 template <
typename rng_t>
235 std::ranges::viewable_range<rng_t> &&
236 std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
239 : view_translate_single{
std::views::all(
std::
forward<rng_t>(_urange)), _tf}
259 iterator
begin() noexcept
265 const_iterator
begin() const noexcept
283 iterator
end() noexcept
285 return {*
this,
size()};
289 const_iterator
end() const noexcept
291 return {*
this,
size()};
332 size_type
size()
const
375 reference operator[](size_type
const n)
387 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]);
399 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
411 const_reference operator[](size_type
const n)
const
423 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
429 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
435 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
449 template <
typename urng_t>
450 view_translate_single(urng_t &&,
translation_frames const) -> view_translate_single<std::views::all_t<urng_t>>;
454 template <
typename urng_t>
455 view_translate_single(urng_t &&) -> view_translate_single<std::views::all_t<urng_t>>;
522 namespace seqan3::detail
533 template <std::ranges::view urng_t>
535 requires std::ranges::sized_range<urng_t> &&
536 std::ranges::random_access_range<urng_t> &&
539 class view_translate :
public std::ranges::view_base
547 small_vector<translation_frames, 6> selected_frames{};
554 using reference = view_translate_single<urng_t>;
556 using const_reference = reference;
558 using value_type = reference;
560 using size_type = std::ranges::range_size_t<urng_t>;
562 using difference_type = std::ranges::range_difference_t<urng_t>;
564 using iterator = detail::random_access_iterator<view_translate>;
566 using const_iterator = detail::random_access_iterator<view_translate const>;
577 template <
typename t>
578 requires (range_dimension_v<t> == range_dimension_v<value_type> + 1) &&
579 std::is_same_v<std::remove_cvref_t<range_innermost_value_t<value_type>>,
581 static constexpr
bool is_compatible_this_aux =
true;
590 view_translate() noexcept = default;
591 constexpr view_translate(view_translate const & rhs) noexcept = default;
592 constexpr view_translate(view_translate && rhs) noexcept = default;
593 constexpr view_translate & operator=(view_translate const & rhs) noexcept = default;
594 constexpr view_translate & operator=(view_translate && rhs) noexcept = default;
595 ~view_translate() noexcept = default;
622 template <
typename rng_t>
625 std::ranges::viewable_range<rng_t> &&
626 std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
629 : view_translate{
std::views::all(
std::
forward<rng_t>(_urange)), _tf}
633 #ifdef SEQAN3_DEPRECATED_310
634 template <
typename rng_t>
637 std::ranges::viewable_range<rng_t> &&
638 std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
640 view_translate(rng_t && _urange)
662 iterator
begin() noexcept
668 const_iterator
begin() const noexcept
686 iterator
end() noexcept
688 return {*
this,
size()};
692 const_iterator
end() const noexcept
694 return {*
this,
size()};
708 size_type
size() noexcept
710 return (size_type) selected_frames.size();
714 size_type
size() const noexcept
716 return (size_type) selected_frames.size();
737 reference operator[](size_type
const n)
744 const_reference operator[](size_type
const n)
const
755 #ifdef SEQAN3_DEPRECATED_310
756 template <
typename urng_t>
758 requires std::ranges::sized_range<urng_t> &&
759 std::ranges::random_access_range<urng_t> &&
762 view_translate (urng_t &&) -> view_translate<std::views::all_t<urng_t>>;
766 template <
typename urng_t>
768 requires std::ranges::sized_range<urng_t> &&
769 std::ranges::random_access_range<urng_t> &&
772 view_translate(urng_t &&,
translation_frames const) -> view_translate<std::views::all_t<urng_t>>;
Provides seqan3::aa27, container aliases and string literals.
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:103
Provides various transformation traits used by the range module.
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
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1104
constexpr auto complement
Return the complement of a nucleotide object.
Definition: concept.hpp:104
@ single
The text is a single range.
Definition: concept.hpp:84
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:150
constexpr auto translate
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames.
Definition: translate.hpp:834
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition: translate.hpp:514
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:70
A concept that indicates whether an alphabet represents nucleotides.
The SeqAn namespace for views.
Definition: char_to.hpp:22
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
translation_frames
Specialisation values for single and multiple translation frames.
Definition: translate.hpp:70
@ FWD_REV_0
The first forward and first reverse frame.
@ REV_FRAME_0
The first reverse frame starting at position 0.
@ REV_FRAME_1
The second reverse frame starting at position 1.
@ FWD_REV_2
The first third and third reverse frame.
@ FWD_FRAME_2
The third forward frame starting at position 2.
@ FWD_FRAME_1
The second forward frame starting at position 1.
@ REV_FRAME_2
The third reverse frame starting at position 2.
@ FWD_FRAME_0
The first forward frame starting at position 0.
@ FWD_REV_1
The second forward and second reverse frame.
SeqAn specific customisations in the standard namespace.
Provides the seqan3::detail::random_access_iterator class.
Adaptations of concepts from the standard library.
Adaptations of concepts from the Ranges TS.
A constexpr string implementation to manipulate string literals at compile time.
Provides functions for translating a triplet of nucleotides into an amino acid.
Provides seqan3::views::deep.