2021-03-07 03:25:33 +00:00
|
|
|
/*
|
2021-04-22 19:11:04 +00:00
|
|
|
* Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org>
|
2021-03-07 03:25:33 +00:00
|
|
|
*
|
2021-04-22 08:24:48 +00:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2021-03-07 03:25:33 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2023-01-02 15:57:12 +00:00
|
|
|
#include <AK/StdLibExtraDetails.h>
|
2021-03-07 03:25:33 +00:00
|
|
|
|
|
|
|
// 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)
|
|
|
|
|
2021-07-14 11:57:11 +00:00
|
|
|
#define _AK_ENUM_BITWISE_OPERATORS_INTERNAL(Enum, Prefix) \
|
|
|
|
\
|
|
|
|
[[nodiscard]] Prefix constexpr Enum operator|(Enum lhs, Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
return static_cast<Enum>( \
|
|
|
|
static_cast<Type>(lhs) | static_cast<Type>(rhs)); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
[[nodiscard]] Prefix constexpr Enum operator&(Enum lhs, Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
return static_cast<Enum>( \
|
|
|
|
static_cast<Type>(lhs) & static_cast<Type>(rhs)); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
[[nodiscard]] Prefix constexpr Enum operator^(Enum lhs, Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
return static_cast<Enum>( \
|
|
|
|
static_cast<Type>(lhs) ^ static_cast<Type>(rhs)); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
[[nodiscard]] Prefix constexpr Enum operator~(Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
return static_cast<Enum>( \
|
|
|
|
~static_cast<Type>(rhs)); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
Prefix constexpr Enum& operator|=(Enum& lhs, Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
lhs = static_cast<Enum>( \
|
|
|
|
static_cast<Type>(lhs) | static_cast<Type>(rhs)); \
|
|
|
|
return lhs; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
Prefix constexpr Enum& operator&=(Enum& lhs, Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
lhs = static_cast<Enum>( \
|
|
|
|
static_cast<Type>(lhs) & static_cast<Type>(rhs)); \
|
|
|
|
return lhs; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
Prefix constexpr Enum& operator^=(Enum& lhs, Enum rhs) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
lhs = static_cast<Enum>( \
|
|
|
|
static_cast<Type>(lhs) ^ static_cast<Type>(rhs)); \
|
|
|
|
return lhs; \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
Prefix constexpr bool has_flag(Enum value, Enum mask) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
return static_cast<Type>(value & mask) == static_cast<Type>(mask); \
|
2021-07-14 11:59:22 +00:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
Prefix constexpr bool has_any_flag(Enum value, Enum mask) \
|
|
|
|
{ \
|
|
|
|
using Type = UnderlyingType<Enum>; \
|
|
|
|
return static_cast<Type>(value & mask) != 0; \
|
2021-03-07 03:25:33 +00:00
|
|
|
}
|