Support UniquePtr as self type of extern C++ member function
#690 opened on Jan 27, 2021
Description
I'd like to be able to write:
#[cxx::bridge]
mod ffi {
unsafe extern "C++" {
type Thing;
fn method(self: &UniquePtr<Thing>, arg: i32);
}
}
and have this translate a Rust uptr_thing.method(arg) (where the type of uptr_thing is UniquePtr<Thing>) to uptr_thing->method(arg) in C++, by way of std::unique_ptr's operator->.
This pattern turns out to be quite common for exposing threadsafe non-const member functions to Rust. A threadsafe non-const member function requires a this of type non-const Thing*, which cannot be obtained from simply a &Thing in Rust, but at the same time it does not require this to be exclusively held when called, so a &mut Thing argument in Rust is also not appropriate. Aside from #537 the easy and correct way to expose such threadsafe non-const member functions to Rust is by passing &UniquePtr<Thing> as seen above.