mirror of
https://github.com/SerenityOS/serenity
synced 2024-11-02 22:04:47 +00:00
c2a900b853
These instances were detected by searching for files that include AK/StdLibExtras.h, but don't match the regex: \\b(abs|AK_REPLACED_STD_NAMESPACE|array_size|ceil_div|clamp|exchange|for ward|is_constant_evaluated|is_power_of_two|max|min|mix|move|_RawPtr|RawP tr|round_up_to_power_of_two|swap|to_underlying)\\b (Without the linebreaks.) This regex is pessimistic, so there might be more files that don't actually use any "extra stdlib" functions. In theory, one might use LibCPP to detect things like this automatically, but let's do this one step after another.
87 lines
5.4 KiB
C
87 lines
5.4 KiB
C
/*
|
|
* Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/StdLibExtraDetails.h>
|
|
|
|
// 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<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); \
|
|
} \
|
|
\
|
|
Prefix constexpr bool has_any_flag(Enum value, Enum mask) \
|
|
{ \
|
|
using Type = UnderlyingType<Enum>; \
|
|
return static_cast<Type>(value & mask) != 0; \
|
|
}
|