SeqAn3 3.2.0-rc.1
The Modern C++ library for sequence analysis.
translate_join.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <concepts>
16#include <seqan3/std/ranges>
17#include <stdexcept>
18#include <vector>
19
23
24namespace seqan3::detail
25{
26
27// ============================================================================
28// view_translate_join (range definition)
29// ============================================================================
30
39template <std::ranges::view urng_t>
40class view_translate_join : public std::ranges::view_base
41{
42private:
44 urng_t urange;
49
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>>;
69
71 template <typename, template <typename ...> typename>
73
74public:
75
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 "
82 "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<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.");
94 "The range parameter to views::translate_join must be over a range over elements of "
95 "seqan3::nucleotide_alphabet.");
96
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;
106
111 view_translate_join(urng_t _urange, translation_frames const _tf = translation_frames::six_frames)
112 : urange{std::move(_urange)}, tf{_tf}
113 {
126 }
127
132 template <typename rng_t>
134 requires (!std::same_as<std::remove_cvref_t<rng_t>, view_translate_join>) &&
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}
140 {}
142
159 iterator begin() noexcept
160 {
161 return {*this, 0};
162 }
163
165 const_iterator begin() const noexcept
166 requires const_iterable_range<urng_t>
167 {
168 return {*this, 0};
169 }
170
184 iterator end() noexcept
185 {
186 return {*this, size()};
187 }
188
190 const_iterator end() const noexcept
191 requires const_iterable_range<urng_t>
192 {
193 return {*this, size()};
194 }
196
208 size_type size() noexcept
209 {
211 }
212
214 size_type size() const noexcept
215 requires const_iterable_range<urng_t>
216 {
218 }
219
239 {
240 assert(n < size());
241 size_type index_frame = n % selected_frames.size();
242 size_type index_urange = (n - index_frame) / selected_frames.size();
243 return urange[index_urange] | views::translate_single(selected_frames[index_frame]);
244 }
245
249 {
250 assert(n < size());
251 size_type index_frame = n % selected_frames.size();
252 size_type index_urange = (n - index_frame) / selected_frames.size();
253 return urange[index_urange] | views::translate_single(selected_frames[index_frame]);
254 }
256};
257
259template <typename urng_t>
260view_translate_join(urng_t &&, translation_frames const = translation_frames{}) -> view_translate_join<std::views::all_t<urng_t>>;
261
262// ============================================================================
263// translate_fn (adaptor definition for both views)
264// ============================================================================
265
268{
271 {
272 return detail::adaptor_from_functor{*this, tf};
273 }
274
280 template <std::ranges::range urng_t>
281 constexpr auto operator()(urng_t && urange, translation_frames const tf = translation_frames::six_frames) const
282 {
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.");
301 "The range parameter to views::translate_join must be over a range over elements of "
302 "seqan3::nucleotide_alphabet.");
303
304 return detail::view_translate_join{std::forward<urng_t>(urange), tf};
305 }
306
308 template <std::ranges::range urng_t>
309 constexpr friend auto operator|(urng_t && urange, translate_join_fn const & me)
310 {
311 return me(std::forward<urng_t>(urange));
312 }
313};
314
315} // namespace seqan3::detail
316
317// ============================================================================
318// translate (adaptor object)
319// ============================================================================
320
321namespace seqan3::views
322{
384
385} // namespace seqan3::views
Template for range adaptor closure objects that store arguments and wrap a proto-adaptor.
Definition: adaptor_from_functor.hpp:57
A CRTP base template for creating random access iterators.
Definition: random_access_iterator.hpp:42
A generic random access iterator that delegates most operations to the range.
Definition: random_access_iterator.hpp:312
The return type of seqan3::views::translate_join.
Definition: translate_join.hpp:41
const_iterator begin() const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: translate_join.hpp:165
std::ranges::range_size_t< std::ranges::range_reference_t< urng_t > > size_type
The size_type.
Definition: translate_join.hpp:61
view_translate_join() noexcept=default
Defaulted.
small_vector< translation_frames, 6 > selected_frames
The selected frames corresponding to the frames required.
Definition: translate_join.hpp:48
view_translate_single< std::views::all_t< std::ranges::range_reference_t< urng_t > > > reference
The reference_type.
Definition: translate_join.hpp:55
std::ranges::range_difference_t< std::ranges::range_reference_t< urng_t > > difference_type
A signed integer type, usually std::ptrdiff_t.
Definition: translate_join.hpp:63
iterator begin() noexcept
Returns an iterator to the first element of the container.
Definition: translate_join.hpp:159
const_iterator end() const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: translate_join.hpp:190
size_type size() noexcept
Returns the number of elements in the view.
Definition: translate_join.hpp:208
urng_t urange
The data members of view_translate_join.
Definition: translate_join.hpp:44
reference operator[](size_type const n)
Return the n-th element.
Definition: translate_join.hpp:238
const_reference operator[](size_type const n) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: translate_join.hpp:247
size_type size() const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: translate_join.hpp:214
translation_frames tf
The frames that should be used for translation.
Definition: translate_join.hpp:46
view_translate_join(rng_t &&_urange, translation_frames const _tf=translation_frames::six_frames)
Construct from another range.
Definition: translate_join.hpp:138
iterator end() noexcept
Returns an iterator to the element following the last element of the container.
Definition: translate_join.hpp:184
The return type of seqan3::views::translate_single.
Definition: translate.hpp:164
constexpr void push_back(value_type const value) noexcept
Appends the given element value to the end of the container.
Definition: small_vector.hpp:861
constexpr size_type size() const noexcept
Returns the number of elements in the container, i.e. std::distance(begin(), end()).
Definition: small_vector.hpp:590
Provides various transformation traits used by the range module.
constexpr auto translate_join
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames....
Definition: translate_join.hpp:383
constexpr auto translate_single
A view that translates nucleotide into aminoacid alphabet for one of the six frames.
Definition: translate.hpp:524
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
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 internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
view_translate_join(urng_t &&, translation_frames const =translation_frames{}) -> view_translate_join< std::views::all_t< urng_t > >
Class template argument deduction for view_translate_join.
The SeqAn namespace for views.
Definition: char_strictly_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.
The <ranges> header from C++20's standard library.
A constexpr string implementation to manipulate string literals at compile time.
Definition of the range adaptor object type for seqan3::views::translate_join.
Definition: translate_join.hpp:268
constexpr auto operator()(urng_t &&urange, translation_frames const tf=translation_frames::six_frames) const
Directly return an instance of the view, initialised with the given parameters.
Definition: translate_join.hpp:281
constexpr auto operator()(translation_frames const tf=translation_frames::six_frames) const
Store the argument and return a range adaptor closure object.
Definition: translate_join.hpp:270
constexpr friend auto operator|(urng_t &&urange, translate_join_fn const &me)
This adaptor is usable without setting the frames parameter in which case the default is chosen.
Definition: translate_join.hpp:309
Provides seqan3::views::translate and seqan3::views::translate_single.