22namespace seqan3::detail
33enum struct strong_type_skill
45 bitwise_lshift = 1 << 9,
46 bitwise_rshift = 1 << 10,
47 logical_and = 1 << 11,
49 logical_not = 1 << 13,
54 additive = add | subtract,
55 multiplicative = multiply | divide | modulo,
56 bitwise_logic = bitwise_and | bitwise_or | bitwise_xor | bitwise_not,
57 bitwise_shift = bitwise_lshift | bitwise_rshift,
58 logic = logical_and | logical_or | logical_not
69constexpr bool add_enum_bitwise_operators<seqan3::detail::strong_type_skill> =
true;
73namespace seqan3::detail
77template <
typename,
typename, strong_type_skill>
103template <
typename strong_type_t>
104SEQAN3_CONCEPT derived_from_strong_type =
requires (strong_type_t && obj)
112 requires std::derived_from<std::remove_cvref_t<strong_type_t>,
113 strong_type<typename std::remove_reference_t<strong_type_t>::value_type,
173template <
typename value_t,
typename derived_t, strong_type_skill skills_ = strong_type_skill::none>
178 static constexpr strong_type_skill skills = skills_;
180 using value_type = value_t;
186 constexpr strong_type() noexcept = default;
187 constexpr strong_type(strong_type const &) noexcept = default;
188 constexpr strong_type(strong_type &&) noexcept = default;
189 constexpr strong_type & operator= (strong_type const &) noexcept = default;
190 constexpr strong_type & operator= (strong_type &&) noexcept = default;
191 ~strong_type() noexcept = default;
194 constexpr explicit strong_type(value_t _value) : value(
std::move(_value))
202 constexpr value_t &
get() &
noexcept
208 constexpr value_t
const &
get() const & noexcept
214 constexpr value_t &&
get() &&
noexcept
216 return std::move(value);
220 constexpr value_t
const &&
get() const && noexcept
222 return std::move(value);
232 constexpr derived_t operator+(strong_type
const & other)
234 requires ((skills & strong_type_skill::add) != strong_type_skill::none)
237 return derived_t{
get() + other.get()};
241 constexpr derived_t operator-(strong_type
const & other)
243 requires ((skills & strong_type_skill::subtract) != strong_type_skill::none)
246 return derived_t{
get() - other.get()};
256 constexpr derived_t operator*(strong_type
const & other)
258 requires ((skills & strong_type_skill::multiply) != strong_type_skill::none)
261 return derived_t{
get() * other.get()};
265 constexpr derived_t operator/(strong_type
const & other)
267 requires ((skills & strong_type_skill::divide) != strong_type_skill::none)
270 return derived_t{
get() / other.get()};
274 constexpr derived_t operator%(strong_type
const & other)
276 requires ((skills & strong_type_skill::modulo) != strong_type_skill::none)
279 return derived_t{
get() % other.get()};
290 constexpr derived_t operator&(strong_type
const & other)
292 requires ((skills & strong_type_skill::bitwise_and) != strong_type_skill::none)
295 return derived_t{
get() & other.get()};
299 constexpr derived_t
operator|(strong_type
const & other)
301 requires ((skills & strong_type_skill::bitwise_or) != strong_type_skill::none)
304 return derived_t{
get() | other.get()};
308 constexpr derived_t operator^(strong_type
const & other)
310 requires ((skills & strong_type_skill::bitwise_xor) != strong_type_skill::none)
313 return derived_t{
get() ^ other.get()};
317 constexpr derived_t operator~()
319 requires ((skills & strong_type_skill::bitwise_not) != strong_type_skill::none)
322 return derived_t{~get()};
333 constexpr derived_t
operator<<(strong_type
const & other)
335 requires ((skills & strong_type_skill::bitwise_lshift) != strong_type_skill::none)
338 return derived_t{
get() << other.get()};
342 template <std::
integral
integral_t>
343 constexpr derived_t
operator<<(integral_t
const shift)
345 requires ((skills & strong_type_skill::bitwise_lshift) != strong_type_skill::none)
348 return derived_t{
get() << shift};
352 constexpr derived_t operator>>(strong_type
const & other)
354 requires ((skills & strong_type_skill::bitwise_rshift) != strong_type_skill::none)
357 return derived_t{
get() >> other.get()};
361 template <std::
integral
integral_t>
362 constexpr derived_t operator>>(integral_t
const shift)
364 requires ((skills & strong_type_skill::bitwise_rshift) != strong_type_skill::none)
367 return derived_t{
get() >> shift};
378 constexpr bool operator&&(strong_type
const & other)
380 requires ((skills & strong_type_skill::logical_and) != strong_type_skill::none)
383 return get() && other.get();
387 constexpr bool operator||(strong_type
const & other)
389 requires ((skills & strong_type_skill::logical_or) != strong_type_skill::none)
392 return get() || other.get();
396 constexpr bool operator!()
398 requires ((skills & strong_type_skill::logical_not) != strong_type_skill::none)
411 constexpr derived_t & operator++()
413 requires ((skills & strong_type_skill::increment) != strong_type_skill::none)
417 return static_cast<derived_t &
>(*this);
421 constexpr derived_t operator++(
int)
423 requires ((skills & strong_type_skill::increment) != strong_type_skill::none)
426 derived_t tmp{
get()};
432 constexpr derived_t & operator--()
434 requires ((skills & strong_type_skill::decrement) != strong_type_skill::none)
438 return static_cast<derived_t &
>(*this);
442 constexpr derived_t operator--(
int)
444 requires ((skills & strong_type_skill::decrement) != strong_type_skill::none)
447 derived_t tmp{
get()};
462 constexpr bool operator==(strong_type
const & rhs)
const
464 requires ((skills & strong_type_skill::comparable) != strong_type_skill::none)
467 return get() == rhs.get();
471 constexpr bool operator!=(strong_type
const & rhs)
const
473 requires ((skills & strong_type_skill::comparable) != strong_type_skill::none)
476 return !(*
this == rhs);
486 explicit constexpr operator value_t() const
488 requires ((skills & strong_type_skill::convert) != strong_type_skill::
none)
522template <
typename char_t, derived_from_strong_type strong_type_t>
523debug_stream_type<char_t> &
operator<<(debug_stream_type<char_t> & stream, strong_type_t && value)
525 stream << value.get();
Provides seqan3::add_enum_bitwise_operators.
Provides various type traits on generic types.
The <concepts> header from C++20's standard library.
Provides seqan3::debug_stream and related types.
debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &stream, alignment_t &&alignment)
Stream operator for alignments, which are represented as tuples of aligned sequences.
Definition: debug_stream_alignment.hpp:101
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1120
@ none
No flag is set.
Definition: debug_stream_type.hpp:32
constexpr auto convert
A view that converts each element in the input range (implicitly or via static_cast).
Definition: convert.hpp:69
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
constexpr auto const & get(configuration< configs_t... > const &config) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:429
SeqAn specific customisations in the standard namespace.