SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
translate_join.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <concepts>
13#include <ranges>
14#include <stdexcept>
15#include <vector>
16
20
21namespace seqan3::detail
22{
23
24// ============================================================================
25// view_translate_join (range definition)
26// ============================================================================
27
36template <std::ranges::view urng_t>
37class view_translate_join : public std::ranges::view_base
38{
39private:
41 urng_t urange;
45 small_vector<translation_frames, 6> selected_frames{};
46
52 using reference = view_translate_single<std::views::all_t<std::ranges::range_reference_t<urng_t>>>;
54 using const_reference = reference;
56 using value_type = reference;
58 using size_type = std::ranges::range_size_t<std::ranges::range_reference_t<urng_t>>;
60 using difference_type = std::ranges::range_difference_t<std::ranges::range_reference_t<urng_t>>;
62 using iterator = detail::random_access_iterator<view_translate_join>;
64 using const_iterator = detail::random_access_iterator<view_translate_join const>;
66
68 template <typename range_type, template <typename...> typename derived_t_template, typename... args_t>
69 friend class detail::random_access_iterator_base;
70
71public:
72 static_assert(range_dimension_v<urng_t> == 2,
73 "This adaptor only handles range-of-range (two dimensions) as input.");
74 static_assert(std::ranges::viewable_range<urng_t>,
75 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
76 static_assert(std::ranges::viewable_range<std::ranges::range_reference_t<urng_t>>,
77 "The inner range of the range parameter to views::translate_join cannot be a temporary of "
78 "a non-view range.");
79 static_assert(std::ranges::sized_range<urng_t>,
80 "The range parameter to views::translate_join must model std::ranges::sized_range.");
81 static_assert(std::ranges::sized_range<std::ranges::range_reference_t<urng_t>>,
82 "The inner range of the range parameter to views::translate_join must model "
83 "std::ranges::sized_range.");
84 static_assert(std::ranges::random_access_range<urng_t>,
85 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
86 static_assert(std::ranges::random_access_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::random_access_range.");
90 "The range parameter to views::translate_join must be over a range over elements of "
91 "seqan3::nucleotide_alphabet.");
92
96 view_translate_join() noexcept = default;
97 constexpr view_translate_join(view_translate_join const & rhs) noexcept = default;
98 constexpr view_translate_join(view_translate_join && rhs) noexcept = default;
99 constexpr view_translate_join & operator=(view_translate_join const & rhs) noexcept = default;
100 constexpr view_translate_join & operator=(view_translate_join && rhs) noexcept = default;
101 ~view_translate_join() noexcept = default;
102
107 view_translate_join(urng_t _urange, translation_frames const _tf = translation_frames::six_frames) :
108 urange{std::move(_urange)},
109 tf{_tf}
110 {
112 selected_frames.push_back(translation_frames::forward_frame0);
114 selected_frames.push_back(translation_frames::forward_frame1);
116 selected_frames.push_back(translation_frames::forward_frame2);
118 selected_frames.push_back(translation_frames::reverse_frame0);
120 selected_frames.push_back(translation_frames::reverse_frame1);
122 selected_frames.push_back(translation_frames::reverse_frame2);
123 }
124
129 template <typename rng_t>
130 requires (!std::same_as<std::remove_cvref_t<rng_t>, view_translate_join>) && std::ranges::viewable_range<rng_t>
131 && std::constructible_from<urng_t, std::ranges::ref_view<std::remove_reference_t<rng_t>>>
132 view_translate_join(rng_t && _urange, translation_frames const _tf = translation_frames::six_frames) :
133 view_translate_join{std::views::all(std::forward<rng_t>(_urange)), _tf}
134 {}
136
153 iterator begin() noexcept
154 {
155 return {*this, 0};
156 }
157
159 const_iterator begin() const noexcept
160 requires const_iterable_range<urng_t>
161 {
162 return {*this, 0};
163 }
164
178 iterator end() noexcept
179 {
180 return {*this, size()};
181 }
182
184 const_iterator end() const noexcept
185 requires const_iterable_range<urng_t>
186 {
187 return {*this, size()};
188 }
190
202 size_type size() noexcept
203 {
204 return (size_type)std::ranges::size(urange) * selected_frames.size();
205 }
206
208 size_type size() const noexcept
209 requires const_iterable_range<urng_t>
210 {
211 return (size_type)std::ranges::size(urange) * selected_frames.size();
212 }
213
232 reference operator[](size_type const n)
233 {
234 assert(n < size());
235 size_type index_frame = n % selected_frames.size();
236 size_type index_urange = (n - index_frame) / selected_frames.size();
237 return urange[index_urange] | views::translate_single(selected_frames[index_frame]);
238 }
239
241 const_reference operator[](size_type const n) const
243 {
244 assert(n < size());
245 size_type index_frame = n % selected_frames.size();
246 size_type index_urange = (n - index_frame) / selected_frames.size();
247 return urange[index_urange] | views::translate_single(selected_frames[index_frame]);
248 }
250};
251
253template <typename urng_t>
254view_translate_join(urng_t &&, translation_frames const = translation_frames{})
255 -> view_translate_join<std::views::all_t<urng_t>>;
256
257// ============================================================================
258// translate_fn (adaptor definition for both views)
259// ============================================================================
260
262struct translate_join_fn
263{
265 constexpr auto operator()(translation_frames const tf = translation_frames::six_frames) const
266 {
267 return detail::adaptor_from_functor{*this, tf};
268 }
269
275 template <std::ranges::range urng_t>
276 constexpr auto operator()(urng_t && urange, translation_frames const tf = translation_frames::six_frames) const
277 {
278 static_assert(range_dimension_v<urng_t> == 2,
279 "This adaptor only handles range-of-range (two dimensions) as input.");
280 static_assert(std::ranges::viewable_range<urng_t>,
281 "The range parameter to views::translate_join cannot be a temporary of a non-view range.");
282 static_assert(std::ranges::viewable_range<std::ranges::range_reference_t<urng_t>>,
283 "The inner range of the range parameter to views::translate_join cannot be a "
284 "temporary of a non-view range.");
285 static_assert(std::ranges::sized_range<urng_t>,
286 "The range parameter to views::translate_join must model std::ranges::sized_range.");
287 static_assert(std::ranges::sized_range<std::ranges::range_reference_t<urng_t>>,
288 "The inner range of the range parameter to views::translate_join must model "
289 "std::ranges::sized_range.");
290 static_assert(std::ranges::random_access_range<urng_t>,
291 "The range parameter to views::translate_join must model std::ranges::random_access_range.");
292 static_assert(std::ranges::random_access_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::random_access_range.");
296 "The range parameter to views::translate_join must be over a range over elements of "
297 "seqan3::nucleotide_alphabet.");
298
299 return detail::view_translate_join{std::forward<urng_t>(urange), tf};
300 }
301
303 template <std::ranges::range urng_t>
304 constexpr friend auto operator|(urng_t && urange, translate_join_fn const & me)
305 {
306 return me(std::forward<urng_t>(urange));
307 }
308};
309
310} // namespace seqan3::detail
311
312// ============================================================================
313// translate (adaptor object)
314// ============================================================================
315
316namespace seqan3::views
317{
378inline constexpr auto translate_join = detail::translate_join_fn{};
379
380} // namespace seqan3::views
T begin(T... args)
Provides various transformation traits used by the range module.
T end(T... args)
constexpr auto translate_join
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames....
Definition translate_join.hpp:378
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition translate.hpp:520
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition validators.hpp:1121
constexpr size_t size
The size of a type pack.
Definition type_pack/traits.hpp:143
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_strictly_to.hpp:19
translation_frames
Specialisation values for single and multiple translation frames.
Definition translate.hpp:59
@ 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.
A constexpr string implementation to manipulate string literals at compile time.
Provides seqan3::views::translate and seqan3::views::translate_single.
Hide me