24 namespace seqan3::detail
39 template <std::ranges::view urng_t>
40 class view_translate_join :
public std::ranges::view_base
48 small_vector<translation_frames, 6> selected_frames{};
55 using reference = view_translate_single<std::views::all_t<std::ranges::range_reference_t<urng_t>>>;
57 using const_reference = reference;
59 using value_type = reference;
61 using size_type = std::ranges::range_size_t<std::ranges::range_reference_t<urng_t>>;
63 using difference_type = std::ranges::range_difference_t<std::ranges::range_reference_t<urng_t>>;
65 using iterator = detail::random_access_iterator<view_translate_join>;
67 using const_iterator = detail::random_access_iterator<view_translate_join const>;
71 template <
typename,
typename>
72 friend class detail::random_access_iterator_base;
76 static_assert(range_dimension_v<urng_t> == 2,
77 "This adaptor only handles range-of-range (two dimensions) as input.");
78 static_assert(std::ranges::viewable_range<urng_t>,
79 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
80 static_assert(std::ranges::viewable_range<std::ranges::range_reference_t<urng_t>>,
81 "The inner range of the range parameter to views::translate_join cannot be a temporary of "
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<std::ranges::range_reference_t<urng_t>>,
86 "The inner range of the range parameter to views::translate_join must model "
87 "std::ranges::sized_range.");
88 static_assert(std::ranges::random_access_range<urng_t>,
89 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
90 static_assert(std::ranges::random_access_range<std::ranges::range_reference_t<urng_t>>,
91 "The inner range of the range parameter to views::translate_join must model "
92 "std::ranges::random_access_range.");
93 static_assert(
nucleotide_alphabet<std::ranges::range_reference_t<std::ranges::range_reference_t<urng_t>>>,
94 "The range parameter to views::translate_join must be over a range over elements of "
95 "seqan3::nucleotide_alphabet.");
100 view_translate_join() noexcept = default;
101 constexpr view_translate_join(view_translate_join const & rhs) noexcept = default;
102 constexpr view_translate_join(view_translate_join && rhs) noexcept = default;
103 constexpr view_translate_join & operator=(view_translate_join const & rhs) noexcept = default;
104 constexpr view_translate_join & operator=(view_translate_join && rhs) noexcept = default;
105 ~view_translate_join() noexcept = default;
132 template <
typename rng_t>
135 std::ranges::viewable_range<rng_t> &&
136 std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
139 : view_translate_join{
std::views::all(
std::
forward<rng_t>(_urange)), _tf}
159 iterator
begin() noexcept
165 const_iterator
begin() const noexcept
184 iterator
end() noexcept
186 return {*
this,
size()};
190 const_iterator
end() const noexcept
193 return {*
this,
size()};
208 size_type
size() noexcept
214 size_type
size() const noexcept
238 reference operator[](size_type
const n)
241 size_type index_frame = n % selected_frames.size();
242 size_type index_urange = (n - index_frame) / selected_frames.size();
247 const_reference operator[](size_type
const n)
const
251 size_type index_frame = n % selected_frames.size();
252 size_type index_urange = (n - index_frame) / selected_frames.size();
259 template <
typename urng_t>
267 struct translate_join_fn
272 return detail::adaptor_from_functor{*
this, tf};
280 template <std::ranges::range urng_t>
283 static_assert(range_dimension_v<urng_t> == 2,
284 "This adaptor only handles range-of-range (two dimensions) as input.");
285 static_assert(std::ranges::viewable_range<urng_t>,
286 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
287 static_assert(std::ranges::viewable_range<std::ranges::range_reference_t<urng_t>>,
288 "The inner range of the range parameter to views::translate_join cannot be a "
289 "temporary of a non-view range.");
290 static_assert(std::ranges::sized_range<urng_t>,
291 "The range parameter to views::translate_join must model std::ranges::sized_range.");
292 static_assert(std::ranges::sized_range<std::ranges::range_reference_t<urng_t>>,
293 "The inner range of the range parameter to views::translate_join must model "
294 "std::ranges::sized_range.");
295 static_assert(std::ranges::random_access_range<urng_t>,
296 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
297 static_assert(std::ranges::random_access_range<std::ranges::range_reference_t<urng_t>>,
298 "The inner range of the range parameter to views::translate_join must model "
299 "std::ranges::random_access_range.");
300 static_assert(
nucleotide_alphabet<std::ranges::range_reference_t<std::ranges::range_reference_t<urng_t>>>,
301 "The range parameter to views::translate_join must be over a range over elements of "
302 "seqan3::nucleotide_alphabet.");
304 return detail::view_translate_join{std::forward<urng_t>(urange), tf};
308 template <std::ranges::range urng_t>
309 constexpr
friend auto operator|(urng_t && urange, translate_join_fn
const & me)
311 return me(std::forward<urng_t>(urange));
Provides seqan3::views::translate and seqan3::views::translate_single.
Provides various transformation traits used by the range module.
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1103
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
constexpr auto translate_join
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames....
Definition: translate_join.hpp:388
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition: translate.hpp:539
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
Specifies requirements of an input range type for which the const version of that type satisfies the ...
A concept that indicates whether an alphabet represents nucleotides.
The SeqAn namespace for views.
Definition: char_to.hpp:22
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_frame0
The first reverse frame starting at position 0.
@ 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.
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.
A constexpr string implementation to manipulate string literals at compile time.