| # Rust bindings for C++ operators and special member functions |
| |
| Here we describe how Crubit bindings work with C++ special member functions and |
| operator overloading (e.g. the copy constructor, or `operator==`) and with |
| traits from the Rust standard library (e.g., the `Clone` or `PartialEq` traits). |
| |
| Rust traits which return `Self` by value (e.g., `Default` or `Clone`) or use |
| mutable references (e.g., `AddAssign`) are only implemented in Rust bindings for |
| a given C++ type if that type is [is `Unpin`](../../unpin.md). |
| |
| ## Bidirectional map |
| |
| The following special member functions and traits are mapped bidirectionally: |
| |
| | C++ | Rust | Notes | |
| | ---------------------------- | --------- | --------------------------------- | |
| | Default constructor | `Default` | | |
| | Trivial copy constructor | `Copy` | Rust bindings for C++ require | |
| : : : that the C++ type is non-abstract : |
| : : : and has a public, trivial copy : |
| : : : constructor and destructor. : |
| | Non-trivial copy constructor | `Clone` | | |
| | Destructor | `Drop` | | |
| |
| ## One-way map of C++ special member functions into Rust traits |
| |
| If the C++ type [is `Unpin`](../../unpin.md), then the C++ special member |
| functions below are mapped one-way into the corresponding Rust traits as |
| follows: |
| |
| | C++ API | Rust bindings | Notes | |
| | ------------------------- | ------------- | -------------------------------- | |
| | Constructor taking single | `From<T>` | Regardless if the constructor is | |
| : parameter of type `T` : : `explicit` in the C++ API or not : |
| |
| The C++ binary operators below are mapped one-way into the corresponding Rust |
| traits as follows: |
| |
| C++ API | Rust bindings |
| ------------- | -------------- |
| `operator==` | `PartialEq` |
| `operator<` | `PartialOrd` |
| `operator+` | `Add` |
| `operator-` | `Sub` |
| `operator*` | `Mul` |
| `operator/` | `Div` |
| `operator%` | `Rem` |
| `operator&` | `BitAnd` |
| `operator\|` | `BitOr` |
| `operator^` | `BitXor` |
| `operator<<` | `Shl` |
| `operator>>` | `Shr` |
| `operator+=` | `AddAssign` |
| `operator-=` | `SubAssign` |
| `operator*=` | `MulAssign` |
| `operator/=` | `DivAssign` |
| `operator%=` | `RemAssign` |
| `operator&=` | `BitAndAssign` |
| `operator\|=` | `BitOrAssign` |
| `operator^=` | `BitXorAssign` |
| `operator<<=` | `ShlAssign` |
| `operator>>=` | `ShrAssign` |
| |
| The C++ unary operators below are mapped one-way into the corresponding Rust |
| traits as follows: |
| |
| C++ API | Rust bindings |
| ----------- | ------------- |
| `operator-` | `Neg` |
| `operator!` | `Not` |