32template <
typename other_t,
typename... alternative_types>
36 other_t>)&&(!(std::same_as<other_t, alternative_types> || ...))
40template <
typename lhs_t,
typename rhs_t,
bool lhs_rhs_switched,
typename... alternative_types>
45 variant_general_guard<rhs_t, alternative_types...>)&&!(lhs_rhs_switched
46 && is_type_specialisation_of_v<rhs_t,
113template <
typename... alternative_types>
114 requires (detail::writable_constexpr_alphabet<alternative_types> && ...) && (std::regular<alternative_types> && ...)
115 && (
sizeof...(alternative_types) >= 2)
118 (static_cast<size_t>(alphabet_size<alternative_types>) + ...),
124 (
static_cast<size_t>(alphabet_size<alternative_types>) + ...),
127 static_assert((std::is_same_v<alphabet_char_t<alternative_types>,
char> && ...),
128 "The alphabet_variant is currently only tested for alphabets with char_type char. "
129 "Contact us on GitHub if you have a different use case: https://github.com/seqan/seqan3 .");
137 static_assert(((seqan3::list_traits::count<alternative_types, alternatives> == 1) && ... &&
true),
138 "All types in a alphabet_variant must be distinct.");
171 template <
typename alternative_t>
195 template <typename alternative_t>
198 && (!list_traits::contains<
200 detail::transformation_trait_or_t<detail::recursive_required_types<alternative_t>,
type_list<>>>)
225 template <
typename indirect_alternative_t>
227 (detail::instantiate_if_v<detail::lazy<std::is_convertible, indirect_alternative_t, alternative_types>,
233 constexpr auto alternative_position =
234 seqan3::list_traits::find_if<alternative_predicate::template invoke, alternatives>;
255 template <
typename indirect_alternative_t>
257 (!(detail::instantiate_if_v<detail::lazy<std::is_convertible, indirect_alternative_t, alternative_types>,
261 detail::variant_general_guard<indirect_alternative_t, alternative_types...>>
266 constexpr auto alternative_position =
267 seqan3::list_traits::find_if<alternative_predicate::template invoke, alternatives>;
283 template <
typename indirect_alternative_t>
289 constexpr auto alternative_position =
290 seqan3::list_traits::find_if<alternative_predicate::template invoke, alternatives>;
292 alternative_t alternative{};
308 template <
size_t index>
311 static_assert(index <
alphabet_size,
"The alphabet_variant contains less alternatives than you are checking.");
321 template <
size_t index>
324 return convert_impl<index, true>();
332 template <
size_t index>
335 return convert_impl<index, false>();
347 template <
typename alternative_t>
351 constexpr size_t index = seqan3::list_traits::find<alternative_t, alternatives>;
352 return holds_alternative<index>();
361 template <
typename alternative_t>
365 constexpr size_t index = seqan3::list_traits::find<alternative_t, alternatives>;
366 return convert_impl<index, true>();
374 template <
typename alternative_t>
378 constexpr size_t index = seqan3::list_traits::find<alternative_t, alternatives>;
379 return convert_impl<index, false>();
405 template <
typename alphabet_variant_t,
typename indirect_alternative_type>
406 friend constexpr auto
412 constexpr auto alternative_position =
413 seqan3::list_traits::find_if<alternative_predicate::template invoke, alternatives>;
415 return lhs.template holds_alternative<alternative_t>()
416 && (lhs.template convert_unsafely_to<alternative_t>() == rhs);
420 template <
typename alphabet_variant_t,
typename indirect_alternative_type>
421 friend constexpr auto
426 return !(lhs == rhs);
430 template <
typename alphabet_variant_t,
typename indirect_alternative_type,
typename =
void>
431 friend constexpr auto operator==(indirect_alternative_type
const lhs, alphabet_variant_t
const rhs)
noexcept
440 template <
typename alphabet_variant_t,
typename indirect_alternative_type,
typename =
void>
441 friend constexpr auto operator!=(indirect_alternative_type
const lhs, alphabet_variant_t
const rhs)
noexcept
467 template <
size_t index,
bool throws>
470 static_assert(index <
alphabet_size,
"The alphabet_variant contains less alternatives than you are checking.");
473 if constexpr (
throws)
475 if (!holds_alternative<index>())
489 template <
size_t index,
typename alternative_t>
490 requires (is_alternative<alternative_t>())
501 template <
typename alternative_t>
502 requires (is_alternative<alternative_t>())
505 constexpr size_t index = seqan3::list_traits::find<alternative_t, alternatives>;
506 return rank_by_index_<index>(alternative);
543 constexpr size_t N =
sizeof...(alternative_types) + 1;
547 for (
size_t i = 1u; i < N; ++i)
548 partial_sum[i] += partial_sum[i - 1];
558 auto assign_value_to_char = [](
auto alternative,
auto & value_to_char,
auto & value)
constexpr
560 using alternative_t =
std::decay_t<
decltype(alternative)>;
561 for (
size_t i = 0u; i < seqan3::alphabet_size<alternative_t>; ++i, ++value)
572 ((assign_value_to_char(alternative_types{}, value_to_char, value)), ...);
574 return value_to_char;
584 constexpr size_t alternative_size =
sizeof...(alternative_types);
585 constexpr size_t table_size = detail::size_in_values_v<char_type>;
590 for (
size_t i = 0u; i < table_size; ++i)
596 auto found_it =
std::find(valid_chars.begin(), valid_chars.end(),
true);
597 lookup_table[i] = found_it - valid_chars.begin();
608 constexpr size_t alternative_size =
sizeof...(alternative_types);
609 constexpr size_t table_size = detail::size_in_values_v<char_type>;
613 for (
size_t i = 0u; i < table_size; ++i)
Provides implementation detail for seqan3::alphabet_variant and seqan3::alphabet_tuple_base.
Provides seqan3::alphabet_base.
A CRTP-base that makes defining a custom alphabet easier.
Definition: alphabet_base.hpp:57
constexpr rank_type to_rank() const noexcept
Return the letter's numeric value (rank in the alphabet).
Definition: alphabet_base.hpp:137
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:199
constexpr char_type to_char() const noexcept
Return the letter as a character of char_type.
Definition: alphabet_base.hpp:115
std::conditional_t< std::same_as< char, void >, char, char > char_type
The char representation; conditional needed to make semi alphabet definitions legal.
Definition: alphabet_base.hpp:72
constexpr alphabet_variant< alternative_types... > & assign_rank(rank_type const c) noexcept
Assign from a numeric value.
Definition: alphabet_base.hpp:187
rank_type rank
The value of the alphabet letter is stored as the rank.
Definition: alphabet_base.hpp:261
A combined alphabet that can hold values of either of its alternatives..
Definition: alphabet_variant.hpp:120
static constexpr bool char_is_valid(char_type const chr) noexcept
Validate whether a character is valid in the combined alphabet.
Definition: alphabet_variant.hpp:454
static constexpr bool is_alternative() noexcept
Returns true if alternative_t is one of the given alternative types.
Definition: alphabet_variant.hpp:172
constexpr alternative_t convert_to() const
Convert to the specified alphabet (throws if holds_alternative() would be false).
Definition: alphabet_variant.hpp:362
static constexpr rank_type rank_by_type_(alternative_t const &alternative) noexcept
Converts an object of one of the given alternatives into the internal representation.
Definition: alphabet_variant.hpp:503
static constexpr std::array< rank_type, sizeof...(alternative_types)+1 > partial_sum_sizes
Compile-time generated lookup table which contains the partial sum up to the position of each alterna...
Definition: alphabet_variant.hpp:541
constexpr bool holds_alternative() const noexcept
Whether the variant alphabet currently holds a value of the given alternative.
Definition: alphabet_variant.hpp:309
constexpr auto convert_impl() const noexcept(!throws) -> seqan3::list_traits::at< index, alternatives >
Implementation function for convert_to() and convert_unsafely_to().
Definition: alphabet_variant.hpp:468
static constexpr rank_type char_to_rank(char_type const chr)
Compile-time generated lookup table which maps the char to rank.
Definition: alphabet_variant.hpp:526
constexpr bool holds_alternative() const noexcept
Whether the variant alphabet currently holds a value of the given alternative.
Definition: alphabet_variant.hpp:348
constexpr alphabet_variant(indirect_alternative_t const rhs) noexcept
Constructor for arguments explicitly (but not implicitly) convertible to an alternative.
Definition: alphabet_variant.hpp:263
friend base_t
Befriend the base type.
Definition: alphabet_variant.hpp:132
friend constexpr auto operator==(alphabet_variant_t const lhs, indirect_alternative_type const rhs) noexcept -> std::enable_if_t< detail::variant_comparison_guard< alphabet_variant_t, indirect_alternative_type, false, alternative_types... >, bool >
(In-)Equality comparison against types comparable with alternatives but not convertible to the varian...
Definition: alphabet_variant.hpp:407
constexpr alternative_t convert_unsafely_to() const noexcept
Convert to the specified alphabet (undefined behaviour if holds_alternative() would be false).
Definition: alphabet_variant.hpp:375
friend constexpr auto operator!=(alphabet_variant_t const lhs, indirect_alternative_type const rhs) noexcept -> std::enable_if_t< detail::variant_comparison_guard< alphabet_variant_t, indirect_alternative_type, false, alternative_types... >, bool >
(In-)Equality comparison against types comparable with alternatives but not convertible to the varian...
Definition: alphabet_variant.hpp:422
friend constexpr auto operator==(indirect_alternative_type const lhs, alphabet_variant_t const rhs) noexcept -> std::enable_if_t< detail::variant_comparison_guard< alphabet_variant_t, indirect_alternative_type, true, alternative_types... >, bool >
(In-)Equality comparison against types comparable with alternatives but not convertible to the varian...
Definition: alphabet_variant.hpp:431
constexpr auto convert_to() const
Convert to the specified alphabet (throws if holds_alternative() would be false).
Definition: alphabet_variant.hpp:322
static constexpr rank_type rank_by_index_(alternative_t const &alternative) noexcept
Converts an object of one of the given alternatives into the internal representation.
Definition: alphabet_variant.hpp:491
constexpr alphabet_variant(indirect_alternative_t const rhs) noexcept
Constructor for arguments implicitly convertible to an alternative.
Definition: alphabet_variant.hpp:230
constexpr alphabet_variant() noexcept=default
Defaulted.
static constexpr char_type rank_to_char(rank_type const rank)
Compile-time generated lookup table which maps the rank to char.
Definition: alphabet_variant.hpp:515
constexpr auto convert_unsafely_to() const noexcept
Convert to the specified alphabet (undefined behaviour if holds_alternative() would be false).
Definition: alphabet_variant.hpp:333
static constexpr auto first_valid_char_table
Compile-time generated lookup table which maps the char to the index of the first alphabet that fulfi...
Definition: alphabet_variant.hpp:582
friend constexpr auto operator!=(indirect_alternative_type const lhs, alphabet_variant_t const rhs) noexcept -> std::enable_if_t< detail::variant_comparison_guard< alphabet_variant_t, indirect_alternative_type, true, alternative_types... >, bool >
(In-)Equality comparison against types comparable with alternatives but not convertible to the varian...
Definition: alphabet_variant.hpp:441
static constexpr std::array< char_type, alphabet_size > rank_to_char_table
Compile-time generated lookup table which maps the rank to char.
Definition: alphabet_variant.hpp:556
type_list< alternative_types... > seqan3_required_types
Expose the alternative types to concept checks in metaprogramming.
Definition: alphabet_variant.hpp:154
static constexpr std::array< rank_type, detail::size_in_values_v< char_type > > char_to_rank_table
Compile-time generated lookup table which maps the char to rank.
Definition: alphabet_variant.hpp:606
list_traits::concat< seqan3_required_types, detail::transformation_trait_or_t< detail::recursive_required_types< alternative_types >, type_list<> >... > seqan3_recursive_required_types
Expose the recursive alternative types to concept checks in metaprogramming.
Definition: alphabet_variant.hpp:162
constexpr auto assign_char_to
Assign a character to an alphabet object.
Definition: alphabet/concept.hpp:524
constexpr auto to_char
Return the char representation of an alphabet object.
Definition: alphabet/concept.hpp:386
constexpr auto assign_rank_to
Assign a rank to an alphabet object.
Definition: alphabet/concept.hpp:293
constexpr auto to_rank
Return the rank representation of a (semi-)alphabet object.
Definition: alphabet/concept.hpp:155
decltype(detail::concat(lists_t{}...)) concat
Join two seqan3::type_list s into one.
Definition: type_list/traits.hpp:342
constexpr bool contains
Whether a type occurs in a type list or not.
Definition: type_list/traits.hpp:252
typename decltype(detail::at< idx >(list_t{}))::type at
Return the type at given index from the type list.
Definition: type_list/traits.hpp:279
constexpr bool contains
Whether a type occurs in a pack or not.
Definition: type_pack/traits.hpp:223
typename transformation_trait_or< type_t, default_t >::type transformation_trait_or_t
Helper type of seqan3::detail::transformation_trait_or (transformation_trait shortcut).
Definition: transformation_trait_or.hpp:51
Resolves to std::is_assignable_v<t>.
Provides lazy template instantiation traits.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
constexpr bool variant_general_guard
Prevents wrong instantiations of std::alphabet_variant's constructors.
Definition: alphabet_variant.hpp:33
constexpr bool variant_comparison_guard
Prevents wrong instantiations of std::alphabet_variant's comparison operators.
Definition: alphabet_variant.hpp:41
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
SeqAn specific customisations in the standard namespace.
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the type is ass...
Definition: alphabet/composite/detail.hpp:154
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the type is con...
Definition: alphabet/composite/detail.hpp:130
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the T is implic...
Definition: alphabet/composite/detail.hpp:142
An empty type whose only purpose is to hold an uninstantiated template plus its arguments.
Definition: lazy_conditional.hpp:33
'Callable' helper class that is invokable by meta::invoke.Returns a std::true_type if the type is wea...
Definition: alphabet/composite/detail.hpp:166
Type that contains multiple types.
Definition: type_list.hpp:29
Provides traits for seqan3::type_list.