| # Generating C++ `enum`s from Rust `enum`s |
| |
| By default, a Rust `enum` is mapped to an opaque C++ type (see |
| [C++ bindings for Rust `enum`s](enums.md)). However, Crubit can try to map Rust |
| `enum`s to C++ `enum`s if requested using the `#[cpp_enum]` attribute. C++ code |
| can use such enums like any other C++ enum. |
| |
| But `#[cpp_enum]` cannot be used with exhaustive Rust `enum`s. It may only be |
| used on non-exhaustive enums, such as those created with `#[open_enum]` from the |
| `open_enum` crate. Therefore, to generate C++ enum bindings, you must annotate |
| your Rust enum with `#[cpp_enum]`, `#[repr(...)]` (where `...` is an integer |
| type like `i32`), and `#[open_enum]`. |
| |
| C++ enums are non-exhaustive by default, meaning they can hold values other than |
| the explicitly named enumerators. `#[open_enum]` generates a Rust enum that is |
| similarly non-exhaustive. Additionally, C++ allows multiple enumerators to have |
| the same value, which can be enabled in Rust by using |
| `#[open_enum(allow_alias)]`. |
| |
| ## Example |
| |
| Given the following Rust crate that uses `#[cpp_enum]` and |
| `#[open_enum(allow_alias)]`: |
| |
| ```live-snippet |
| cs/file:examples/rust/cpp_enum/example.rs class:Color |
| ``` |
| |
| Crubit will generate the following bindings: |
| |
| ```live-snippet |
| cs/file:examples/rust/cpp_enum/example_generated.h class:CRUBIT_INTERNAL_RUST_TYPE|Color |
| ``` |