SeqAn3
char_operations.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 <array>
43 #include <cmath>
44 
47 
48 namespace seqan3::detail
49 {
50 
52 template <typename char_type>
53 inline std::array<char_type, detail::size_in_values_v<char_type>> constexpr to_lower_table
54 {
55  [] () constexpr
56  {
57  std::array<char_type, detail::size_in_values_v<char_type>> ret{};
58 
59  for (size_t i = 0; i < detail::size_in_values_v<char_type>; ++i)
60  ret[i] = i;
61 
62  for (size_t i = char_type{'A'}; i <= char_type{'Z'}; ++i)
63  ret[i] = ret[i] - char_type{'A'} + char_type{'a'};
64 
65  return ret;
66  } ()
67 };
68 
70 template <typename char_type>
71 inline std::array<char_type, detail::size_in_values_v<char_type>> constexpr to_upper_table
72 {
73  [] () constexpr
74  {
75  std::array<char_type, detail::size_in_values_v<char_type>> ret{};
76 
77  for (size_t i = 0; i < detail::size_in_values_v<char_type>; ++i)
78  ret[i] = i;
79 
80  for (size_t i = char_type{'a'}; i <= char_type{'z'}; ++i)
81  ret[i] = ret[i] - char_type{'a'} + char_type{'A'};
82 
83  return ret;
84  } ()
85 };
86 
87 } // namespace seqan3::detail
88 
89 namespace seqan3
90 {
91 
106 template <char_concept char_type>
107 constexpr char_type to_lower(char_type const c) noexcept
108 {
109  using u_t = std::make_unsigned_t<char_type>;
110  return detail::to_lower_table<char_type>[static_cast<u_t>(c)];
111 }
112 
122 template <char_concept char_type>
123 constexpr char_type to_upper(char_type const c) noexcept
124 {
125  using u_t = std::make_unsigned_t<char_type>;
126  return detail::to_upper_table<char_type>[static_cast<u_t>(c)];
127 }
129 
130 } // namespace seqan3
Provides concepts for core language types and relations that don&#39;t have concepts in C++20 (yet)...
Contains metaprogramming utilities for integer types.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
Definition: aligned_sequence_concept.hpp:288
constexpr char_type to_upper(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:123
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