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