#pragma once #define DEFINE_ENUM_FLAG_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, \ 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; \ }