blob: 6ba860980292e3a94e30732f64ce666afbd3ee0f [file] [log] [blame]
/*
* Copyright 2023 Rive
*/
#ifndef _RIVE_ENUM_BITSET_HPP_
#define _RIVE_ENUM_BITSET_HPP_
#include <type_traits>
namespace rive
{
// Wraps an enum containing a bitfield so that we can do implicit bool conversions.
template <typename T> class EnumBitset
{
public:
using UnderlyingType = typename std::underlying_type<T>::type;
constexpr EnumBitset() = default;
constexpr EnumBitset(T value) : m_bits(static_cast<UnderlyingType>(value)) {}
constexpr UnderlyingType bits() const { return m_bits; }
constexpr T value() const { return static_cast<T>(m_bits); }
constexpr operator T() const { return value(); }
constexpr operator bool() const { return m_bits != 0; }
private:
UnderlyingType m_bits = 0;
};
} // namespace rive
#define RIVE_MAKE_ENUM_BITSET(ENUM) \
constexpr inline ::rive::EnumBitset<ENUM> operator&(::rive::EnumBitset<ENUM> lhs, \
::rive::EnumBitset<ENUM> rhs) \
{ \
return static_cast<ENUM>(lhs.bits() & rhs.bits()); \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator&(ENUM lhs, ::rive::EnumBitset<ENUM> rhs) \
{ \
return ::rive::EnumBitset<ENUM>(lhs) & rhs; \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator&(::rive::EnumBitset<ENUM> lhs, ENUM rhs) \
{ \
return lhs & ::rive::EnumBitset<ENUM>(rhs); \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator&(ENUM lhs, ENUM rhs) \
{ \
return ::rive::EnumBitset<ENUM>(lhs) & ::rive::EnumBitset<ENUM>(rhs); \
} \
\
constexpr inline ::rive::EnumBitset<ENUM> operator|(::rive::EnumBitset<ENUM> lhs, \
::rive::EnumBitset<ENUM> rhs) \
{ \
return static_cast<ENUM>(lhs.bits() | rhs.bits()); \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator|(ENUM lhs, ::rive::EnumBitset<ENUM> rhs) \
{ \
return ::rive::EnumBitset<ENUM>(lhs) | rhs; \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator|(::rive::EnumBitset<ENUM> lhs, ENUM rhs) \
{ \
return lhs | ::rive::EnumBitset<ENUM>(rhs); \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator|(ENUM lhs, ENUM rhs) \
{ \
return ::rive::EnumBitset<ENUM>(lhs) | ::rive::EnumBitset<ENUM>(rhs); \
} \
\
constexpr inline ::rive::EnumBitset<ENUM> operator~(::rive::EnumBitset<ENUM> rhs) \
{ \
return static_cast<ENUM>(~rhs.bits()); \
} \
constexpr inline ::rive::EnumBitset<ENUM> operator~(ENUM rhs) \
{ \
return ~::rive::EnumBitset<ENUM>(rhs); \
} \
\
inline ENUM& operator&=(ENUM& lhs, ::rive::EnumBitset<ENUM> rhs) { return lhs = lhs & rhs; } \
inline ENUM& operator&=(ENUM& lhs, ENUM rhs) { return lhs = lhs & rhs; } \
\
inline ENUM& operator|=(ENUM& lhs, ::rive::EnumBitset<ENUM> rhs) { return lhs = lhs | rhs; } \
inline ENUM& operator|=(ENUM& lhs, ENUM rhs) { return lhs = lhs | rhs; }
#endif