dtolnay/cxx

Support UniquePtr as self type of extern C++ member function

Open

#690 opened on Jan 27, 2021

View on GitHub
 (0 comments) (5 reactions) (0 assignees)Rust (253 forks)batch import
help wanted

Repository metrics

Stars
 (4,472 stars)
PR merge metrics
 (Avg merge 8m) (3 merged PRs in 30d)

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.

Contributor guide