blob: 7a4f6818c5758ffb2e8b4bfd262c648022f8ef66 [file] [log] [blame] [view]
# 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`