Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

40 lines
2.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bitmask operators and typesafe comparisons for enum class
*EnumClass.h* is a utility header that allows you to easily generate bitwise operators for your custom `enum class` type like so:
```cpp
enum class myEnum
{
enumerator1 = 0x1 << 0,
enumerator2 = 0x1 << 1,
enumerator3 = 0x1 << 2
};
enableEnumClassBitmask(myEnum); // Activate bitmask operators
```
This utility relies on two concepts: enumerators and masks. An enumerators purpose is to give a name to a specific bit when it is set. A mask, on the other hand, represents the state of every bit (and this way, of every enumerator), whether they are set or cleared. Comparing an enumerator to a mask using `operator==` or `operator!=` is a compiler error. [A complete blog post](https://dalzhim.github.io/2017/08/11/Improving-the-enum-class-bitmask/) explains why and how this is implemented.
Here are some tables that summarize the return type of all of the operators :
#### Binary bitwise operators
| **`E, E`** | **`E`, `bitmask<E>`** | **`bitmask<E>`, `E`** | **`bitmask<E>`, `bitmask<E>`**
| ---------- | --------------------- | --------------------- | ------------------------------
**`operator&`** | `E` | `E` | `E` | `bitmask<E>`
**`operator\|`** | `bitmask<E>` | `bitmask<E>` | `bitmask<E>` | `bitmask<E>`
**`operator^`** | `bitmask<E>` | `bitmask<E>` | `bitmask<E>` | `bitmask<E>`
**`operator&=`** | `bitmask<E>` | `bitmask<E>` | `bitmask<E>` | `bitmask<E>`
**`operator\|=`** | `bitmask<E>` | `bitmask<E>` | `bitmask<E>` | `bitmask<E>`
**`operator^=`** | `bitmask<E>` | `bitmask<E>` | `bitmask<E>` | `bitmask<E>`
#### Unary bitwise operators
| **`E`** | **`bitmask<E>`**
| ------- | ----------------
**`operator~`** | `bitmask<E>` | `bitmask<E>`
#### Comparison operators
| **`E, E`** | **`E`, `bitmask<E>`** | **`bitmask<E>`, `E`** | **`bitmask<E>`, `bitmask<E>`**
| ---------- | --------------------- | --------------------- | ------------------------------
**`operator==`** | `bool` | `static_assert` | `static_assert` | `bool`
**`operator!=`** | `bool` | `static_assert` | `static_assert` | `bool`