7#include "flag_bits_v.h"
23 concept bit_integral = std::integral<T> && !std::same_as<std::decay_t<T>,
bool>;
26 concept valid_integral = bit_integral<T> ||
requires (T other,
int t) {
27 { other &= t } -> bit_integral;
28 { other ^= t } -> bit_integral;
29 { other |= t } -> bit_integral;
30 { other & t } -> bit_integral;
31 { other ^ t } -> bit_integral;
32 { other | t } -> bit_integral;
35 template <
typename RESULT_TYPE,
typename... ENUM_TYPES>
36 concept valid_flag_bits_arguments = detail::valid_integral<RESULT_TYPE> && (integral_or_enum<ENUM_TYPES> && ...);
39 requires std::is_integral_v<T>
40 [[nodiscard]]
constexpr auto to_unsigned(T t)
noexcept {
return static_cast<std::make_unsigned_t<T>
>(t); }
59 template <
typename RESULT_TYPE =
unsigned long long,
typename... ARGS>
60 constexpr RESULT_TYPE
flag_bits(ARGS... args)
noexcept
61 requires detail::valid_flag_bits_arguments<RESULT_TYPE, ARGS...>
63 return ((RESULT_TYPE{ 1 } << detail::to_underlying_type(args)) | ... | 0);
66 template <
typename RESULT_TYPE =
unsigned long long,
typename BIT_TYPE>
67 requires integral_or_enum<BIT_TYPE>
68 constexpr RESULT_TYPE bit_to_flag(BIT_TYPE bit)
noexcept
70 if constexpr (std::is_enum_v<BIT_TYPE>)
71 return std::countr_zero(detail::to_unsigned(detail::to_underlying_type(bit)));
73 return std::countr_zero(detail::to_unsigned(bit));
77 template <
typename INTEGRAL,
typename ENUM_TYPE>
78 requires detail::valid_flag_bits_arguments<INTEGRAL, ENUM_TYPE>
82 template <
typename INTEGRAL,
typename... ARGS>
83 requires detail::valid_flag_bits_arguments<INTEGRAL, ARGS...>
90 template <
typename INTEGRAL,
typename... ARGS>
91 requires detail::valid_flag_bits_arguments<INTEGRAL, ARGS...>
98 template <
typename INTEGRAL,
typename... ARGS>
99 requires detail::valid_flag_bits_arguments<INTEGRAL, ARGS...>
103 template <
typename INTEGRAL,
typename... ARGS>
104 requires detail::valid_flag_bits_arguments<INTEGRAL, ARGS...>
105 constexpr void unset_flags(INTEGRAL& bits, ARGS... args)
noexcept { bits &= ~ flag_bits<INTEGRAL>(args...); }
108 template <
typename INTEGRAL,
typename... ARGS>
109 requires detail::valid_flag_bits_arguments<INTEGRAL, ARGS...>
113 template <
typename INTEGRAL,
typename... ARGS>
114 requires detail::valid_flag_bits_arguments<INTEGRAL, ARGS...>
115 constexpr void set_flags_to(INTEGRAL& bits,
bool val, ARGS... args)
noexcept
120 bits &= ~ flag_bits<INTEGRAL>(args...);
constexpr bool is_flag_set(INTEGRAL const &bits, ENUM_TYPE flag) noexcept
Checks if an integral value has the bit at number represented by flag set.
constexpr void set_flags_to(INTEGRAL &bits, bool val, ARGS... args) noexcept
Sets the bits at numbers represented by args in bits to either 0 or 1, depending on val.
constexpr RESULT_TYPE flag_bits(ARGS... args) noexcept
Takes a list of enum values that represent bit numbers (not actual bit values) and returns a value wi...
constexpr bool are_any_flags_set(INTEGRAL const &bits, ARGS... args) noexcept
Checks if an integral value has any of the bits at numbers represented by args set.
constexpr void unset_flags(INTEGRAL &bits, ARGS... args) noexcept
Unsets the bits at numbers represented by args in bits.
constexpr void set_flags(INTEGRAL &bits, ARGS... args) noexcept
Sets the bits at numbers represented by args in bits.
constexpr bool are_all_flags_set(INTEGRAL const &bits, ARGS... args) noexcept
Checks if an integral value has all of the bits at numbers represented by args set.
constexpr void toggle_flags(INTEGRAL &bits, ARGS... args) noexcept
Toggles the bits at numbers represented by args in bits.
Primary namespace for everything in this library.