SeqAn3
rna5.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 // rna5
49 // ------------------------------------------------------------------
50 
51 namespace seqan3
52 {
53 
71 class rna5 : public nucleotide_base<rna5, 5>
72 {
73 private:
76 
78  friend base_t;
80  friend base_t::base_t;
82 
83 public:
87  constexpr rna5() noexcept : base_t{} {}
88  constexpr rna5(rna5 const &) = default;
89  constexpr rna5(rna5 &&) = default;
90  constexpr rna5 & operator=(rna5 const &) = default;
91  constexpr rna5 & operator=(rna5 &&) = default;
92  ~rna5() = default;
93 
94  using base_t::base_t;
95 
97  constexpr rna5(dna5 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  'N',
113  'U'
114  };
115 
117  static constexpr std::array<rank_type, 256> char_to_rank = dna5::char_to_rank;
118 
120  static const std::array<rna5, value_size> complement_table;
121 };
122 
123 // ------------------------------------------------------------------
124 // containers
125 // ------------------------------------------------------------------
126 
129 using rna5_vector = std::vector<rna5>;
130 
131 // ------------------------------------------------------------------
132 // literals
133 // ------------------------------------------------------------------
134 
143 constexpr rna5 operator""_rna5(char const c) noexcept
144 {
145  return rna5{}.assign_char(c);
146 }
147 
157 inline rna5_vector operator""_rna5(char const * s, std::size_t n)
158 {
159  rna5_vector r;
160  r.resize(n);
161 
162  for (size_t i = 0; i < n; ++i)
163  r[i].assign_char(s[i]);
164 
165  return r;
166 }
168 
169 // ------------------------------------------------------------------
170 // rna5 (deferred definition)
171 // ------------------------------------------------------------------
172 
173 constexpr std::array<rna5, rna5::value_size> rna5::complement_table
174 {
175  'U'_rna5, // complement of 'A'_rna5
176  'G'_rna5, // complement of 'C'_rna5
177  'C'_rna5, // complement of 'G'_rna5
178  'N'_rna5, // complement of 'N'_rna5
179  'A'_rna5 // complement of 'U'_rna5
180 };
181 
182 } // namespace seqan3
The five letter RNA alphabet of A,C,G,U and the unknown character N.
Definition: rna5.hpp:71
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
Contains seqan3::dna5, container aliases and string literals.
The five letter DNA alphabet of A,C,G,T and the unknown character N.
Definition: dna5.hpp:73
constexpr rna5 & 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.
constexpr rna5(dna5 const &r) noexcept
Allow implicit construction from dna/rna of the same size.
Definition: rna5.hpp:97
char_t char_type
The type of the alphabet when converted to char (e.g. via to_char()).
Definition: alphabet_base.hpp:87
A CRTP-base that refines seqan3::alphabet_base and is used by the nucleotides.
Definition: nucleotide_base.hpp:65
std::vector< rna5 > rna5_vector
Alias for an std::vector of seqan3::rna5.
Definition: rna5.hpp:129