25 namespace seqan3::detail
40 template <std::ranges::view urng_t>
41 class view_translate_join :
public std::ranges::view_base
49 small_vector<translation_frames, 6> selected_frames{};
55 using reference = view_translate_single<std::views::all_t<std::ranges::range_reference_t<urng_t>>>;
58 using const_reference = reference;
60 using value_type = reference;
62 using size_type = std::ranges::range_size_t<std::ranges::range_reference_t<urng_t>>;
64 using difference_type = std::ranges::range_difference_t<std::ranges::range_reference_t<urng_t>>;
66 using iterator = detail::random_access_iterator<view_translate_join>;
68 using const_iterator = detail::random_access_iterator<view_translate_join const>;
72 template <
typename,
typename>
73 friend class detail::random_access_iterator_base;
77 static_assert(range_dimension_v<urng_t> == 2,
78 "This adaptor only handles range-of-range (two dimensions) as input.");
79 static_assert(std::ranges::viewable_range<urng_t>,
80 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
81 static_assert(std::ranges::viewable_range<std::ranges::range_reference_t<urng_t>>,
82 "The inner range of the range parameter to views::translate_join cannot be a temporary of "
84 static_assert(std::ranges::sized_range<urng_t>,
85 "The range parameter to views::translate_join must model std::ranges::sized_range.");
86 static_assert(std::ranges::sized_range<std::ranges::range_reference_t<urng_t>>,
87 "The inner range of the range parameter to views::translate_join must model "
88 "std::ranges::sized_range.");
89 static_assert(std::ranges::random_access_range<urng_t>,
90 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
91 static_assert(std::ranges::random_access_range<std::ranges::range_reference_t<urng_t>>,
92 "The inner range of the range parameter to views::translate_join must model "
93 "std::ranges::random_access_range.");
94 static_assert(
nucleotide_alphabet<std::ranges::range_reference_t<std::ranges::range_reference_t<urng_t>>>,
95 "The range parameter to views::translate_join must be over a range over elements of "
96 "seqan3::nucleotide_alphabet.");
101 view_translate_join() noexcept = default;
102 constexpr view_translate_join(view_translate_join const & rhs) noexcept = default;
103 constexpr view_translate_join(view_translate_join && rhs) noexcept = default;
104 constexpr view_translate_join & operator=(view_translate_join const & rhs) noexcept = default;
105 constexpr view_translate_join & operator=(view_translate_join && rhs) noexcept = default;
106 ~view_translate_join() noexcept = default;
115 if ((_tf & translation_frames::FWD_FRAME_0) == translation_frames::FWD_FRAME_0)
116 selected_frames.push_back(translation_frames::FWD_FRAME_0);
117 if ((_tf & translation_frames::FWD_FRAME_1) == translation_frames::FWD_FRAME_1)
118 selected_frames.push_back(translation_frames::FWD_FRAME_1);
119 if ((_tf & translation_frames::FWD_FRAME_2) == translation_frames::FWD_FRAME_2)
120 selected_frames.push_back(translation_frames::FWD_FRAME_2);
121 if ((_tf & translation_frames::REV_FRAME_0) == translation_frames::REV_FRAME_0)
122 selected_frames.push_back(translation_frames::REV_FRAME_0);
123 if ((_tf & translation_frames::REV_FRAME_1) == translation_frames::REV_FRAME_1)
124 selected_frames.push_back(translation_frames::REV_FRAME_1);
125 if ((_tf & translation_frames::REV_FRAME_2) == translation_frames::REV_FRAME_2)
126 selected_frames.push_back(translation_frames::REV_FRAME_2);
133 template <
typename rng_t>
136 std::ranges::viewable_range<rng_t> &&
137 std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
140 : view_translate_join{std::views::all(std::forward<rng_t>(_urange)), _tf}
160 iterator
begin() noexcept
166 const_iterator
begin() const noexcept
185 iterator
end() noexcept
187 return {*
this,
size()};
191 const_iterator
end() const noexcept
194 return {*
this,
size()};
209 size_type
size() noexcept
215 size_type
size() const noexcept
239 reference operator[](size_type
const n)
242 size_type index_frame = n % selected_frames.size();
243 size_type index_urange = (n - index_frame) / selected_frames.size();
248 const_reference operator[](size_type
const n)
const
252 size_type index_frame = n % selected_frames.size();
253 size_type index_urange = (n - index_frame) / selected_frames.size();
260 template <
typename urng_t>
268 struct translate_join_fn
273 return detail::adaptor_from_functor{*
this, tf};
281 template <std::ranges::range urng_t>
284 static_assert(range_dimension_v<urng_t> == 2,
285 "This adaptor only handles range-of-range (two dimensions) as input.");
286 static_assert(std::ranges::viewable_range<urng_t>,
287 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
288 static_assert(std::ranges::viewable_range<std::ranges::range_reference_t<urng_t>>,
289 "The inner range of the range parameter to views::translate_join cannot be a "
290 "temporary of a non-view range.");
291 static_assert(std::ranges::sized_range<urng_t>,
292 "The range parameter to views::translate_join must model std::ranges::sized_range.");
293 static_assert(std::ranges::sized_range<std::ranges::range_reference_t<urng_t>>,
294 "The inner range of the range parameter to views::translate_join must model "
295 "std::ranges::sized_range.");
296 static_assert(std::ranges::random_access_range<urng_t>,
297 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
298 static_assert(std::ranges::random_access_range<std::ranges::range_reference_t<urng_t>>,
299 "The inner range of the range parameter to views::translate_join must model "
300 "std::ranges::random_access_range.");
301 static_assert(
nucleotide_alphabet<std::ranges::range_reference_t<std::ranges::range_reference_t<urng_t>>>,
302 "The range parameter to views::translate_join must be over a range over elements of "
303 "seqan3::nucleotide_alphabet.");
305 return detail::view_translate_join{std::forward<urng_t>(urange), tf};
309 template <std::ranges::range urng_t>
310 constexpr
friend auto operator|(urng_t && urange, translate_join_fn
const & me)
312 return me(std::forward<urng_t>(urange));