SeqAn3 3.1.0
The Modern C++ library for sequence analysis.
aa27.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 <vector>
16
20
21namespace seqan3
22{
45class aa27 : public aminoacid_base<aa27, 27>
46{
47private:
50
52 friend base_t;
54 friend base_t::base_t;
56
57public:
61 constexpr aa27() noexcept = default;
62 constexpr aa27(aa27 const &) noexcept = default;
63 constexpr aa27(aa27 &&) noexcept = default;
64 constexpr aa27 & operator=(aa27 const &) noexcept = default;
65 constexpr aa27 & operator=(aa27 &&) noexcept = default;
66 ~aa27() noexcept = default;
67
68 using base_t::base_t;
70
71private:
73 static constexpr char_type rank_to_char_table[alphabet_size]
74 {
75 'A',
76 'B',
77 'C',
78 'D',
79 'E',
80 'F',
81 'G',
82 'H',
83 'I',
84 'J',
85 'K',
86 'L',
87 'M',
88 'N',
89 'O',
90 'P',
91 'Q',
92 'R',
93 'S',
94 'T',
95 'U',
96 'V',
97 'W',
98 'X',
99 'Y',
100 'Z',
101 '*'
102 };
103
105 static constexpr std::array<rank_type, 256> char_to_rank_table
106 {
107 [] () constexpr
108 {
110
111 // initialize with UNKNOWN (std::array::fill unfortunately not constexpr)
112 for (auto & c : ret)
113 c = 23; // value of 'X'
114
115 // reverse mapping for characters and their lowercase
116 for (rank_type rnk = 0u; rnk < alphabet_size; ++rnk)
117 {
118 ret[static_cast<rank_type>(rank_to_char_table[rnk])] = rnk;
119 ret[static_cast<rank_type>(to_lower(rank_to_char_table[rnk]))] = rnk;
120 }
121
122 return ret;
123 }()
124 };
125
127 static constexpr char_type rank_to_char(rank_type const rank)
128 {
129 return rank_to_char_table[rank];
130 }
131
133 static constexpr rank_type char_to_rank(char_type const chr)
134 {
135 using index_t = std::make_unsigned_t<char_type>;
136 return char_to_rank_table[static_cast<index_t>(chr)];
137 }
138};
139
140// ------------------------------------------------------------------
141// containers
142// ------------------------------------------------------------------
143
150
151// ------------------------------------------------------------------
152// literals
153// ------------------------------------------------------------------
154inline namespace literals
155{
156
171constexpr aa27 operator""_aa27(char const c) noexcept
172{
173 return aa27{}.assign_char(c);
174}
175
187inline aa27_vector operator""_aa27(char const * const s, size_t const n)
188{
189 aa27_vector r;
190 r.resize(n);
191
192 for (size_t i = 0; i < n; ++i)
193 r[i].assign_char(s[i]);
194
195 return r;
196}
198
199} // inline namespace literals
200
201} // namespace seqan3
Provides seqan3::aminoacid_alphabet.
Provides seqan3::aminoacid_base.
The twenty-seven letter amino acid alphabet..
Definition: aa27.hpp:46
constexpr aa27() noexcept=default
Defaulted.
A CRTP-base that makes defining a custom alphabet easier.
Definition: alphabet_base.hpp:57
constexpr derived_type & assign_char(char_type const chr) noexcept
Assign from a character, implicitly converts invalid characters.
Definition: alphabet_base.hpp:165
detail::min_viable_uint_t< size - 1 > rank_type
The type of the alphabet when represented as a number (e.g. via to_rank()).
Definition: alphabet_base.hpp:80
static constexpr detail::min_viable_uint_t< size > alphabet_size
The size of the alphabet, i.e. the number of different values it can take.
Definition: alphabet_base.hpp:203
std::conditional_t< std::same_as< char_t, void >, char, char_t > char_type
The char representation; conditional needed to make semi alphabet definitions legal.
Definition: alphabet_base.hpp:72
A CRTP-base that refines seqan3::alphabet_base and is used by the amino acids.
Definition: aminoacid_base.hpp:32
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
constexpr char_type to_lower(char_type const c) noexcept
Converts 'A'-'Z' to 'a'-'z' respectively; other characters are returned as is.
Definition: transform.hpp:81
T resize(T... args)
Provides utilities for modifying characters.