SeqAn3
rna4.hpp
Go to the documentation of this file.
1 // ============================================================================
2 // SeqAn - The Library for Sequence Analysis
3 // ============================================================================
4 //
5 // Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin
6 // Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 // * Neither the name of Knut Reinert or the FU Berlin nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
25 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 // DAMAGE.
32 //
33 // ============================================================================
34 
40 #pragma once
41 
42 #include <vector>
43 
46 
47 // ------------------------------------------------------------------
48 // rna4
49 // ------------------------------------------------------------------
50 
51 namespace seqan3
52 {
53 
71 class rna4 : public nucleotide_base<rna4, 4>
72 {
73 private:
76 
78  friend base_t;
80  friend base_t::base_t;
82 
83 public:
87  constexpr rna4() noexcept : base_t{} {}
88  constexpr rna4(rna4 const &) = default;
89  constexpr rna4(rna4 &&) = default;
90  constexpr rna4 & operator=(rna4 const &) = default;
91  constexpr rna4 & operator=(rna4 &&) = default;
92  ~rna4() = default;
93 
94  using base_t::base_t;
95 
97  constexpr rna4(dna4 const & r) noexcept
98  {
99  assign_rank(r.to_rank());
100  }
102 
103 protected:
105 
107  static constexpr char_type rank_to_char[value_size]
108  {
109  'A',
110  'C',
111  'G',
112  'U'
113  };
114 
116  static constexpr std::array<rank_type, 256> char_to_rank = dna4::char_to_rank;
117 
119  static const std::array<rna4, value_size> complement_table;
120 };
121 
122 // ------------------------------------------------------------------
123 // containers
124 // ------------------------------------------------------------------
125 
128 using rna4_vector = std::vector<rna4>;
129 
130 // ------------------------------------------------------------------
131 // literals
132 // ------------------------------------------------------------------
133 
142 constexpr rna4 operator""_rna4(char const c) noexcept
143 {
144  return rna4{}.assign_char(c);
145 }
146 
156 inline rna4_vector operator""_rna4(char const * s, std::size_t n)
157 {
158  rna4_vector r;
159  r.resize(n);
160 
161  for (size_t i = 0; i < n; ++i)
162  r[i].assign_char(s[i]);
163 
164  return r;
165 }
167 
168 // ------------------------------------------------------------------
169 // rna4 (deferred definition)
170 // ------------------------------------------------------------------
171 
172 constexpr std::array<rna4, rna4::value_size> rna4::complement_table
173 {
174  'U'_rna4, // complement of 'A'_rna4
175  'G'_rna4, // complement of 'C'_rna4
176  'C'_rna4, // complement of 'G'_rna4
177  'A'_rna4 // complement of 'U'_rna4
178 };
179 
180 } // namespace seqan3
The four letter DNA alphabet of A,C,G,T.
Definition: dna4.hpp:73
alphabet_concept && assign_char(alphabet_concept &&alph, char_type const chr)
Returns the alphabet letter&#39;s value in character representation.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
constexpr rna4(dna4 const &r) noexcept
Allow implicit construction from dna/rna of the same size.
Definition: rna4.hpp:97
constexpr rna4 & assign_rank(rank_type const c) noexcept
Assign from a numeric value.
Definition: alphabet_base.hpp:189
static detail::min_viable_uint_t< size > constexpr value_size
The size of the alphabet, i.e. the number of different values it can take.
Definition: alphabet_base.hpp:198
Provides seqan3::nucleotide_base.
char_t char_type
The type of the alphabet when converted to char (e.g. via to_char()).
Definition: alphabet_base.hpp:87
The four letter RNA alphabet of A,C,G,U.
Definition: rna4.hpp:71
A CRTP-base that refines seqan3::alphabet_base and is used by the nucleotides.
Definition: nucleotide_base.hpp:65
Contains seqan3::dna4, container aliases and string literals.
std::vector< rna4 > rna4_vector
Alias for an std::vector of seqan3::rna4.
Definition: rna4.hpp:128