/* * Copyright (c) 2021, Brian Gianforcaro * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include // Enables bitwise operators for the specified Enum type. // #define AK_ENUM_BITWISE_OPERATORS(Enum) \ _AK_ENUM_BITWISE_OPERATORS_INTERNAL(Enum, ) // Enables bitwise operators for the specified Enum type, this // version is meant for use on enums which are private to the // containing type. // #define AK_ENUM_BITWISE_FRIEND_OPERATORS(Enum) \ _AK_ENUM_BITWISE_OPERATORS_INTERNAL(Enum, friend) #define _AK_ENUM_BITWISE_OPERATORS_INTERNAL(Enum, Prefix) \ \ [[nodiscard]] Prefix constexpr Enum operator|(Enum lhs, Enum rhs) \ { \ using Type = UnderlyingType; \ return static_cast( \ static_cast(lhs) | static_cast(rhs)); \ } \ \ [[nodiscard]] Prefix constexpr Enum operator&(Enum lhs, Enum rhs) \ { \ using Type = UnderlyingType; \ return static_cast( \ static_cast(lhs) & static_cast(rhs)); \ } \ \ [[nodiscard]] Prefix constexpr Enum operator^(Enum lhs, Enum rhs) \ { \ using Type = UnderlyingType; \ return static_cast( \ static_cast(lhs) ^ static_cast(rhs)); \ } \ \ [[nodiscard]] Prefix constexpr Enum operator~(Enum rhs) \ { \ using Type = UnderlyingType; \ return static_cast( \ ~static_cast(rhs)); \ } \ \ Prefix constexpr Enum& operator|=(Enum& lhs, Enum rhs) \ { \ using Type = UnderlyingType; \ lhs = static_cast( \ static_cast(lhs) | static_cast(rhs)); \ return lhs; \ } \ \ Prefix constexpr Enum& operator&=(Enum& lhs, Enum rhs) \ { \ using Type = UnderlyingType; \ lhs = static_cast( \ static_cast(lhs) & static_cast(rhs)); \ return lhs; \ } \ \ Prefix constexpr Enum& operator^=(Enum& lhs, Enum rhs) \ { \ using Type = UnderlyingType; \ lhs = static_cast( \ static_cast(lhs) ^ static_cast(rhs)); \ return lhs; \ } \ \ Prefix constexpr bool has_flag(Enum value, Enum mask) \ { \ using Type = UnderlyingType; \ return static_cast(value & mask) == static_cast(mask); \ } \ \ Prefix constexpr bool has_any_flag(Enum value, Enum mask) \ { \ using Type = UnderlyingType; \ return static_cast(value & mask) != 0; \ }