SeqAn3
dna5.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 // dna5
49 // ------------------------------------------------------------------
50 
51 namespace seqan3
52 {
53 
54 class rna5;
55 
73 class dna5 : public nucleotide_base<dna5, 5>
74 {
75 private:
78 
80  friend base_t;
82  friend base_t::base_t;
85  friend rna5;
86 
87 public:
91  constexpr dna5() noexcept : base_t{} {}
92  constexpr dna5(dna5 const &) = default;
93  constexpr dna5(dna5 &&) = default;
94  constexpr dna5 & operator=(dna5 const &) = default;
95  constexpr dna5 & operator=(dna5 &&) = default;
96  ~dna5() = default;
97 
98  using base_t::base_t;
99 
101  template <std::Same<rna5> t> // Accept incomplete type
102  constexpr dna5(t const & r) noexcept
103  {
104  assign_rank(r.to_rank());
105  }
107 
108 protected:
110 
112  static constexpr char_type rank_to_char[value_size]
113  {
114  'A',
115  'C',
116  'G',
117  'N',
118  'T'
119  };
120 
122  static constexpr std::array<rank_type, 256> char_to_rank
123  {
124  [] () constexpr
125  {
126  std::array<rank_type, 256> ret{};
127 
128  // initialize with UNKNOWN (std::array::fill unfortunately not constexpr)
129  for (auto & c : ret)
130  c = 3; // == 'N'
131 
132  // reverse mapping for characters and their lowercase
133  for (size_t rnk = 0u; rnk < value_size; ++rnk)
134  {
135  ret[ rank_to_char[rnk] ] = rnk;
136  ret[to_lower(rank_to_char[rnk])] = rnk;
137  }
138 
139  // set U equal to T
140  ret['U'] = ret['T']; ret['u'] = ret['t'];
141 
142  // iupac characters are implicitly "UNKNOWN"
143  return ret;
144  }()
145  };
146 
148  static const std::array<dna5, value_size> complement_table;
149 };
150 
151 // ------------------------------------------------------------------
152 // containers
153 // ------------------------------------------------------------------
154 
157 using dna5_vector = std::vector<dna5>;
158 
159 // ------------------------------------------------------------------
160 // literals
161 // ------------------------------------------------------------------
162 
171 constexpr dna5 operator""_dna5(char const c) noexcept
172 {
173  return dna5{}.assign_char(c);
174 }
175 
185 inline dna5_vector operator""_dna5(char const * s, std::size_t n)
186 {
187  dna5_vector r;
188  r.resize(n);
189 
190  for (size_t i = 0; i < n; ++i)
191  r[i].assign_char(s[i]);
192 
193  return r;
194 }
196 
197 // ------------------------------------------------------------------
198 // dna5 (deferred definition)
199 // ------------------------------------------------------------------
200 
201 constexpr std::array<dna5, dna5::value_size> dna5::complement_table
202 {
203  'T'_dna5, // complement of 'A'_dna5
204  'G'_dna5, // complement of 'C'_dna5
205  'C'_dna5, // complement of 'G'_dna5
206  'N'_dna5, // complement of 'N'_dna5
207  'A'_dna5 // complement of 'T'_dna5
208 };
209 
210 } // namespace seqan3
char char_type
The type of the alphabet when converted to char (e.g. via to_char()).
Definition: alphabet_base.hpp:87
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
std::vector< dna5 > dna5_vector
Alias for an std::vector of seqan3::dna5.
Definition: dna5.hpp:157
The five letter DNA alphabet of A,C,G,T and the unknown character N.
Definition: dna5.hpp:73
constexpr dna5 & 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.
Provides utilities for modifying characters.
A CRTP-base that refines seqan3::alphabet_base and is used by the nucleotides.
Definition: nucleotide_base.hpp:65
constexpr dna5(t const &r) noexcept
Allow implicit construction from dna/rna of the same size.
Definition: dna5.hpp:102
constexpr char_type to_lower(char_type const c) noexcept
Converts &#39;A&#39;-&#39;Z&#39; to &#39;a&#39;-&#39;z&#39; respectively; other characters are returned as is.
Definition: char_operations.hpp:107