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;
86 namespace seqan3::detail
96 template <
bool single>
107 return detail::adaptor_from_functor{*
this, tf};
115 template <std::ranges::range urng_t>
116 constexpr
auto operator()(urng_t && urange,
translation_frames const tf = default_frames)
const
118 static_assert(std::ranges::viewable_range<urng_t>,
119 "The range parameter to views::translate[_single] cannot be a temporary of a non-view range.");
120 static_assert(std::ranges::sized_range<urng_t>,
121 "The range parameter to views::translate[_single] must model std::ranges::sized_range.");
122 static_assert(std::ranges::random_access_range<urng_t>,
123 "The range parameter to views::translate[_single] must model std::ranges::random_access_range.");
125 "The range parameter to views::translate[_single] must be over elements of seqan3::nucleotide_alphabet.");
128 return detail::view_translate_single{std::forward<urng_t>(urange), tf};
130 return detail::view_translate{std::forward<urng_t>(urange), tf};
134 template <std::ranges::range urng_t>
135 constexpr
friend auto operator|(urng_t && urange, translate_fn
const & me)
137 return me(std::forward<urng_t>(urange));
151 template <std::ranges::view urng_t>
153 requires std::ranges::sized_range<urng_t> &&
154 std::ranges::random_access_range<urng_t> &&
157 class view_translate_single :
public ranges::view_base
165 static constexpr small_string multiple_frame_error{
"Error: Invalid type of frame. Choose one out of FWD_FRAME_0, "
166 "REV_FRAME_0, FWD_FRAME_1, REV_FRAME_1, FWD_FRAME_2 and "
172 using reference = aa27;
175 using const_reference = aa27;
177 using value_type = aa27;
179 using size_type = size_type_t<urng_t>;
181 using difference_type = difference_type_t<urng_t>;
183 using iterator = detail::random_access_iterator<view_translate_single>;
185 using const_iterator = detail::random_access_iterator<view_translate_single const>;
191 view_translate_single() noexcept = default;
192 constexpr view_translate_single(view_translate_single const & rhs) noexcept = default;
193 constexpr view_translate_single(view_translate_single && rhs) noexcept = default;
194 constexpr view_translate_single & operator=(view_translate_single const & rhs) noexcept = default;
195 constexpr view_translate_single & operator=(view_translate_single && rhs) noexcept = default;
196 ~view_translate_single() noexcept = default;
210 if (__builtin_popcount(static_cast<uint8_t>(_tf)) > 1)
224 template <
typename rng_t>
227 std::ranges::viewable_range<rng_t> &&
231 : view_translate_single{
std::views::all(std::forward<rng_t>(_urange)), _tf}
251 iterator
begin() noexcept
257 const_iterator
begin() const noexcept
263 const_iterator
cbegin() const noexcept
281 iterator
end() noexcept
283 return {*
this,
size()};
287 const_iterator
end() const noexcept
289 return {*
this,
size()};
293 const_iterator
cend() const noexcept
322 return (std::max<size_type>(
seqan3::size(urange), 1) - 1) / 3;
327 return (std::max<size_type>(
seqan3::size(urange), 2) - 2) / 3;
336 size_type
size()
const
348 return (std::max<size_type>(
seqan3::size(urange), 1) - 1) / 3;
353 return (std::max<size_type>(
seqan3::size(urange), 2) - 2) / 3;
379 reference operator[](size_type
const n)
385 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
391 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
397 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
409 const_reference operator[](size_type
const n)
const
415 return translate_triplet((urange)[n * 3], (urange)[n * 3 + 1], (urange)[n * 3 + 2]);
421 return translate_triplet((urange)[n * 3 + 1], (urange)[n * 3 + 2], (urange)[n * 3 + 3]);
427 return translate_triplet((urange)[n * 3 + 2], (urange)[n * 3 + 3], (urange)[n * 3 + 4]);
441 template <
typename urng_t>
442 view_translate_single(urng_t &&,
translation_frames const) -> view_translate_single<std::ranges::all_view<urng_t>>;
446 template <
typename urng_t>
447 view_translate_single(urng_t &&) -> view_translate_single<std::ranges::all_view<urng_t>>;
512 namespace seqan3::detail
523 template <std::ranges::view urng_t>
525 requires std::ranges::sized_range<urng_t> &&
526 std::ranges::random_access_range<urng_t> &&
529 class view_translate :
public ranges::view_base
537 small_vector<translation_frames, 6> selected_frames{};
543 using reference = view_translate_single<urng_t>;
546 using const_reference = reference;
548 using value_type = reference;
550 using size_type = size_type_t<urng_t>;
552 using difference_type = difference_type_t<urng_t>;
554 using iterator = detail::random_access_iterator<view_translate>;
556 using const_iterator = detail::random_access_iterator<view_translate const>;
566 template <
typename t>
567 requires (dimension_v<t> == dimension_v<value_type> + 1) &&
568 std::is_same_v<remove_cvref_t<innermost_value_type_t<value_type>>,
569 remove_cvref_t<innermost_value_type_t<t>>>
570 static constexpr
bool is_compatible_this_aux =
true;
579 view_translate() noexcept = default;
580 constexpr view_translate(view_translate const & rhs) noexcept = default;
581 constexpr view_translate(view_translate && rhs) noexcept = default;
582 constexpr view_translate & operator=(view_translate const & rhs) noexcept = default;
583 constexpr view_translate & operator=(view_translate && rhs) noexcept = default;
584 ~view_translate() noexcept = default;
611 template <
typename rng_t>
614 std::ranges::viewable_range<rng_t> &&
638 iterator
begin() noexcept
644 const_iterator
begin() const noexcept
650 const_iterator
cbegin() const noexcept
668 iterator
end() noexcept
670 return {*
this,
size()};
674 const_iterator
end() const noexcept
676 return {*
this,
size()};
680 const_iterator
cend() const noexcept
697 size_type
size() noexcept
699 return (size_type) selected_frames.size();
703 size_type
size() const noexcept
705 return (size_type) selected_frames.size();
726 reference operator[](size_type
const n)
733 const_reference operator[](size_type
const n)
const
742 template <
typename urng_t>
744 requires std::ranges::sized_range<urng_t> &&
745 std::ranges::random_access_range<urng_t> &&