54 enum struct strong_type_skill
66 bitwise_lshift = 1 << 9,
67 bitwise_rshift = 1 << 10,
68 logical_and = 1 << 11,
70 logical_not = 1 << 13,
74 additive = add | subtract,
75 multiplicative = multiply | divide | modulo,
76 bitwise_logic = bitwise_and | bitwise_or | bitwise_xor | bitwise_not,
77 bitwise_shift = bitwise_lshift | bitwise_rshift,
78 logic = logical_and | logical_or | logical_not
86 constexpr
bool add_enum_bitwise_operators<seqan3::detail::strong_type_skill> =
true;
141 template <
typename value_t,
typename derived_t, strong_type_skill skills = strong_type_skill::none>
147 using value_type = value_t;
153 constexpr strong_type() =
default;
154 constexpr strong_type(strong_type
const &) =
default;
155 constexpr strong_type(strong_type &&) =
default;
156 constexpr strong_type & operator= (strong_type
const &) =
default;
157 constexpr strong_type & operator= (strong_type &&) =
default;
158 ~strong_type() =
default;
161 constexpr
explicit strong_type(value_t _value) : value(
std::move(_value))
168 constexpr value_t &
get() & noexcept
175 constexpr value_t
const &
get()
const & noexcept
181 constexpr value_t &&
get() && noexcept
183 return std::move(value);
187 constexpr value_t
const &&
get()
const && noexcept
189 return std::move(value);
198 constexpr derived_t operator+(strong_type
const & other)
201 requires ((skills & strong_type_skill::add) != strong_type_skill::none)
204 return derived_t{
get() + other.get()};
208 constexpr derived_t operator-(strong_type
const & other)
210 requires ((skills & strong_type_skill::subtract) != strong_type_skill::none)
213 return derived_t{
get() - other.get()};
222 constexpr derived_t operator*(strong_type
const & other)
225 requires ((skills & strong_type_skill::multiply) != strong_type_skill::none)
228 return derived_t{
get() * other.get()};
232 constexpr derived_t operator/(strong_type
const & other)
234 requires ((skills & strong_type_skill::divide) != 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::modulo) != strong_type_skill::none)
246 return derived_t{
get() % other.get()};
256 constexpr derived_t operator&(strong_type
const & other)
259 requires ((skills & strong_type_skill::bitwise_and) != strong_type_skill::none)
262 return derived_t{
get() & other.get()};
266 constexpr derived_t
operator|(strong_type
const & other)
268 requires ((skills & strong_type_skill::bitwise_or) != strong_type_skill::none)
271 return derived_t{
get() | other.get()};
275 constexpr derived_t operator^(strong_type
const & other)
277 requires ((skills & strong_type_skill::bitwise_xor) != strong_type_skill::none)
280 return derived_t{
get() ^ other.get()};
284 constexpr derived_t operator~()
286 requires ((skills & strong_type_skill::bitwise_not) != strong_type_skill::none)
289 return derived_t{~
get()};
299 constexpr derived_t
operator<<(strong_type
const & other)
302 requires ((skills & strong_type_skill::bitwise_lshift) != strong_type_skill::none)
305 return derived_t{
get() << other.get()};
309 template <std::Integral
integral_t>
310 constexpr derived_t
operator<<(integral_t
const shift)
312 requires ((skills & strong_type_skill::bitwise_lshift) != strong_type_skill::none)
315 return derived_t{
get() << shift};
319 constexpr derived_t operator>>(strong_type
const & other)
321 requires ((skills & strong_type_skill::bitwise_rshift) != strong_type_skill::none)
324 return derived_t{
get() >> other.get()};
328 template <std::Integral
integral_t>
329 constexpr derived_t operator>>(integral_t
const shift)
331 requires ((skills & strong_type_skill::bitwise_rshift) != strong_type_skill::none)
334 return derived_t{
get() >> shift};
344 constexpr
bool operator&&(strong_type
const & other)
347 requires ((skills & strong_type_skill::logical_and) != strong_type_skill::none)
350 return get() && other.get();
354 constexpr
bool operator||(strong_type
const & other)
356 requires ((skills & strong_type_skill::logical_or) != strong_type_skill::none)
359 return get() || other.get();
363 constexpr
bool operator!()
365 requires ((skills & strong_type_skill::logical_not) != strong_type_skill::none)
377 constexpr derived_t & operator++()
380 requires ((skills & strong_type_skill::increment) != strong_type_skill::none)
384 return static_cast<derived_t &
>(*this);
388 constexpr derived_t operator++(
int)
390 requires ((skills & strong_type_skill::increment) != strong_type_skill::none)
393 derived_t tmp{
get()};
399 constexpr derived_t & operator--()
401 requires ((skills & strong_type_skill::decrement) != strong_type_skill::none)
405 return static_cast<derived_t &
>(*this);
409 constexpr derived_t operator--(
int)
411 requires ((skills & strong_type_skill::decrement) != strong_type_skill::none)
414 derived_t tmp{
get()};
425 explicit constexpr
operator value_t() const
428 requires ((skills & strong_type_skill::convert) != strong_type_skill::none)
auto const convert
A view that converts each element in the input range (implicitly or via static_cast).
Definition: convert.hpp:89
Provides seqan3::add_enum_bitwise_operators.
debug_stream_type & operator<<(debug_stream_type &stream, tuple_t const &alignment)
Streaming operator for alignments, which are represented as tuples of aligned sequences.
Definition: aligned_sequence_concept.hpp:370
SeqAn specific customisations in the standard namespace.
Definition: align_result.hpp:221
No flag is set.
Definition: debug_stream.hpp:65
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
constexpr auto const & get(detail::configuration< cfg_elements_t... > const &cfg) noexcept
Definition: utility.hpp:364
Definition: aligned_sequence_concept.hpp:288
Provides C++20 additions to the type_traits header.
Provides various metafunctions on generic types.
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators. !
Definition: validators.hpp:671