#pragma once #define DEFINE_ENUM_BITFIELD_OPERATORS(ENUM_TYPE) \ [[nodiscard]] constexpr ENUM_TYPE operator|( \ const ENUM_TYPE lhs, const ENUM_TYPE rhs \ ) { \ return static_cast( \ static_cast>(lhs) | \ static_cast>(rhs) \ ); \ } \ \ [[nodiscard]] constexpr ENUM_TYPE operator&( \ const ENUM_TYPE lhs, const ENUM_TYPE rhs \ ) { \ return static_cast( \ static_cast>(lhs) & \ static_cast>(rhs) \ ); \ } \ \ [[nodiscard]] constexpr ENUM_TYPE operator^( \ const ENUM_TYPE lhs, const ENUM_TYPE rhs \ ) { \ return static_cast( \ static_cast>(lhs) ^ \ static_cast>(rhs) \ ); \ } \ \ [[nodiscard]] constexpr ENUM_TYPE operator~(const ENUM_TYPE a) \ { \ return static_cast( \ ~static_cast>(a) \ ); \ } \ \ constexpr ENUM_TYPE operator<<( \ ENUM_TYPE& lhs, \ int shift \ ) { \ return static_cast( \ static_cast>(lhs) << shift \ ); \ } \ \ constexpr ENUM_TYPE operator<<( \ ENUM_TYPE& lhs, \ int shift \ ) { \ return static_cast( \ static_cast>(lhs) << shift \ ); \ } \ \ constexpr ENUM_TYPE& operator|=( \ ENUM_TYPE& lhs, \ const ENUM_TYPE rhs \ ) { \ return lhs = lhs | rhs; \ } \ \ constexpr ENUM_TYPE& operator&=( \ ENUM_TYPE& lhs, \ const ENUM_TYPE rhs \ ) { \ return lhs = lhs & rhs; \ } \ \ constexpr ENUM_TYPE& operator^=( \ ENUM_TYPE& lhs, \ const ENUM_TYPE rhs \ ) { \ return lhs = lhs ^ rhs; \ } \ \ constexpr ENUM_TYPE& operator<<=( \ ENUM_TYPE& lhs, \ const int shift \ ) { \ return lhs = lhs << shift; \ } \ \ constexpr ENUM_TYPE& operator>>=( \ ENUM_TYPE& lhs, \ const int shift \ ) { \ return lhs = lhs >> shift; \ }