sandbox
Loading...
Searching...
No Matches
bitmask.hpp
1#ifndef LIBSBX_UTILITY_FLAGS_HPP_
2#define LIBSBX_UTILITY_FLAGS_HPP_
3
4#include <concepts>
5#include <type_traits>
6
7namespace sbx::utility {
8
9template<typename Enum>
10requires (std::is_enum_v<Enum>)
11struct enable_bitmask_operators : std::false_type {};
12
13template<typename Enum>
14constexpr auto enable_bitmask_operators_v = enable_bitmask_operators<Enum>::value;
15
16template<typename Enum>
17concept bitmask_enum = std::is_enum_v<Enum> && enable_bitmask_operators_v<Enum>;
18
19template<bitmask_enum Enum>
20constexpr auto operator|(Enum lhs, Enum rhs) noexcept -> Enum {
21 using underlying_type = std::underlying_type_t<Enum>;
22 return static_cast<Enum>(static_cast<underlying_type>(lhs) | static_cast<underlying_type>(rhs));
23}
24
25template<bitmask_enum Enum>
26constexpr auto operator|=(Enum& lhs, Enum rhs) noexcept -> void {
27 lhs = lhs | rhs;
28}
29
30template<bitmask_enum Enum>
31constexpr auto operator&(Enum lhs, Enum rhs) noexcept -> Enum {
32 using underlying_type = std::underlying_type_t<Enum>;
33 return static_cast<Enum>(static_cast<underlying_type>(lhs) & static_cast<underlying_type>(rhs));
34}
35
36template<bitmask_enum Enum>
37constexpr auto operator&=(Enum& lhs, Enum rhs) noexcept -> void {
38 lhs = lhs & rhs;
39}
40
41} // namespace sbx::utility
42
43#endif // LIBSBX_UTILITY_FLAGS_HPP_
Definition: bitmask.hpp:11