25 namespace seqan3::detail
40 template <std::ranges::view urng_t>
41 class view_translate_join :
public ranges::view_base
49 small_vector<translation_frames, 6> selected_frames{};
53 template <
typename,
typename>
54 friend class detail::random_access_iterator_base;
59 using reference = view_translate_single<std::ranges::all_view<reference_t<urng_t>>>;
62 using const_reference = reference;
64 using value_type = reference;
66 using size_type = size_type_t<reference_t<urng_t>>;
68 using difference_type = difference_type_t<reference_t<urng_t>>;
70 using iterator = detail::random_access_iterator<view_translate_join>;
72 using const_iterator = detail::random_access_iterator<view_translate_join const>;
77 static_assert(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<reference_t<urng_t>>,
82 "The inner range of the range parameter to views::translate_join cannot be a temporary of a non-view range.");
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<reference_t<urng_t>>,
86 "The inner range of the range parameter to views::translate_join must model std::ranges::sized_range.");
87 static_assert(std::ranges::random_access_range<urng_t>,
88 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
89 static_assert(std::ranges::random_access_range<reference_t<urng_t>>,
90 "The inner range of the range parameter to views::translate_join must model std::ranges::random_access_range.");
92 "The range parameter to views::translate_join must be over a range over elements of seqan3::nucleotide_alphabet.");
97 view_translate_join() noexcept = default;
98 constexpr view_translate_join(view_translate_join const & rhs) noexcept = default;
99 constexpr view_translate_join(view_translate_join && rhs) noexcept = default;
100 constexpr view_translate_join & operator=(view_translate_join const & rhs) noexcept = default;
101 constexpr view_translate_join & operator=(view_translate_join && rhs) noexcept = default;
102 ~view_translate_join() noexcept = default;
129 template <
typename rng_t>
132 std::ranges::viewable_range<rng_t> &&
136 : view_translate_join{
std::views::all(std::forward<rng_t>(_urange)), _tf}
156 iterator
begin() noexcept
162 const_iterator
begin() const noexcept
169 const_iterator
cbegin() const noexcept
188 iterator
end() noexcept
190 return {*
this,
size()};
194 const_iterator
end() const noexcept
197 return {*
this,
size()};
201 const_iterator
cend() const noexcept
219 size_type
size() noexcept
221 return (size_type)
seqan3::size(urange) * selected_frames.size();
225 size_type
size() const noexcept
228 return (size_type)
seqan3::size(urange) * selected_frames.size();
249 reference operator[](size_type
const n)
252 size_type index_frame = n % selected_frames.size();
253 size_type index_urange = (n - index_frame) / selected_frames.size();
258 const_reference operator[](size_type
const n)
const
262 size_type index_frame = n % selected_frames.size();
263 size_type index_urange = (n - index_frame) / selected_frames.size();
270 template <
typename urng_t>
278 struct translate_join_fn
283 return detail::adaptor_from_functor{*
this, tf};
291 template <std::ranges::range urng_t>
294 static_assert(dimension_v<urng_t> == 2,
295 "This adaptor only handles range-of-range (two dimensions) as input.");
296 static_assert(std::ranges::viewable_range<urng_t>,
297 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
298 static_assert(std::ranges::viewable_range<reference_t<urng_t>>,
299 "The inner range of the range parameter to views::translate_join cannot be a temporary of a non-view range.");
300 static_assert(std::ranges::sized_range<urng_t>,
301 "The range parameter to views::translate_join must model std::ranges::sized_range.");
302 static_assert(std::ranges::sized_range<reference_t<urng_t>>,
303 "The inner range of the range parameter to views::translate_join must model std::ranges::sized_range.");
304 static_assert(std::ranges::random_access_range<urng_t>,
305 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
306 static_assert(std::ranges::random_access_range<reference_t<urng_t>>,
307 "The inner range of the range parameter to views::translate_join must model std::ranges::random_access_range.");
309 "The range parameter to views::translate_join must be over a range over elements of seqan3::nucleotide_alphabet.");
311 return detail::view_translate_join{std::forward<urng_t>(urange), tf};
315 template <std::ranges::range urng_t>
316 constexpr
friend auto operator|(urng_t && urange, translate_join_fn
const & me)
318 return me(std::forward<urng_t>(urange));