SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
char.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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 
26 #pragma once
27 
30 
31 namespace seqan3::detail
32 {
35 template <typename type>
36 constexpr bool is_char_adaptation_v = std::same_as<type, char> ||
40 } // namespace seqan3::detail
41 
42 namespace seqan3::custom
43 {
44 
49 template <typename char_type>
51  requires detail::is_char_adaptation_v<char_type>
53 struct alphabet<char_type>
54 {
56  static constexpr auto alphabet_size =
57  detail::min_viable_uint_t<detail::size_in_values_v<char_type>>{detail::size_in_values_v<char_type>};
58 
63  static constexpr char_type to_char(char_type const chr) noexcept
64  {
65  return chr;
66  }
67 
72  static constexpr auto to_rank(char_type const chr) noexcept
73  {
74  return static_cast<detail::min_viable_uint_t<alphabet_size - 1>>(chr);
75  }
76 
82  static constexpr char_type & assign_char_to(char_type const chr2, char_type & chr) noexcept
83  {
84  return chr = chr2;
85  }
86 
92  static constexpr char_type & assign_rank_to(decltype(alphabet::to_rank(char_type{})) const rank,
93  char_type & chr) noexcept
94  {
95  return chr = rank;
96  }
97 };
98 
99 } // namespace seqan3::custom
seqan3::custom::alphabet
A type that can be specialised to provide customisation point implementations so that third party typ...
Definition: concept.hpp:46
seqan3::to_rank
constexpr auto to_rank
Return the rank representation of a (semi-)alphabet object.
Definition: concept.hpp:142
same_as
The concept std::same_as<T, U> is satisfied if and only if T and U denote the same type.
seqan3::custom::alphabet< char_type >::assign_rank_to
static constexpr char_type & assign_rank_to(decltype(alphabet::to_rank(char_type{})) const rank, char_type &chr) noexcept
Assigning a rank to a char is the same as assigning it a numeric value.
Definition: char.hpp:92
seqan3::custom::alphabet< char_type >::to_char
static constexpr char_type to_char(char_type const chr) noexcept
Converting char to char is no-op (it will just return the value you pass in).
Definition: char.hpp:63
int_types.hpp
Provides metaprogramming utilities for integer types.
seqan3::custom::alphabet< char_type >::assign_char_to
static constexpr char_type & assign_char_to(char_type const chr2, char_type &chr) noexcept
Assign a char to the char type (same as calling =).
Definition: char.hpp:82
std::conditional_t
seqan3::alphabet_size
constexpr auto alphabet_size
A type trait that holds the size of a (semi-)alphabet.
Definition: concept.hpp:706
seqan3::custom::alphabet< char_type >::to_rank
static constexpr auto to_rank(char_type const chr) noexcept
Convert char to rank by casting to an unsigned integral type of same size.
Definition: char.hpp:72
concept.hpp
Core alphabet concept and free function/type trait wrappers.
seqan3::custom
A namespace for third party and standard library specialisations of SeqAn customisation points.
Definition: char.hpp:42