Built-in bindings reference
In addition to all the primitive types (i32 <=> int32_t), the following common types may be used in the fields of shared structs and the arguments and returns of extern functions.
| name in Rust | name in C++ | restrictions |
|---|---|---|
| String | rust::String | |
| &str | rust::Str | |
| &[T] | rust::Slice<const T> | cannot hold opaque C++ type |
| &mut [T] | rust::Slice<T> | cannot hold opaque C++ type |
| CxxString | std::string | cannot be passed by value |
| Box<T> | rust::Box<T> | cannot hold opaque C++ type |
| UniquePtr<T> | std::unique_ptr<T> | cannot hold opaque Rust type |
| SharedPtr<T> | std::shared_ptr<T> | cannot hold opaque Rust type |
| [T; N] | std::array<T, N> | cannot hold opaque C++ type |
| Vec<T> | rust::Vec<T> | cannot hold opaque C++ type |
| CxxVector<T> | std::vector<T> | cannot be passed by value, cannot hold opaque Rust type |
| *mut T, *const T | T*, const T* | fn with a raw pointer argument must be declared unsafe to call |
| fn(T, U) -> V | rust::Fn<V(T, U)> | only passing from Rust to C++ is implemented so far |
| Result<T> | throw/catch | allowed as return type only |
The C++ API of the rust namespace is defined by the include/cxx.h file in
the CXX GitHub repo. You will need to include this header in your C++ code when
working with those types. When using Cargo and the cxx-build crate, the header
is made available to you at #include "rust/cxx.h".
The rust namespace additionally provides lowercase type aliases of all the
types mentioned in the table, for use in codebases preferring that style. For
example rust::String, rust::Vec may alternatively be written rust::string,
rust::vec etc.
Pending bindings
The following types are intended to be supported "soon" but are just not implemented yet. I don't expect any of these to be hard to make work but it's a matter of designing a nice API for each in its non-native language.
| name in Rust | name in C++ |
|---|---|
| BTreeMap<K, V> | tbd |
| HashMap<K, V> | tbd |
| Arc<T> | tbd |
| Option<T> | tbd |
| tbd | std::map<K, V> |
| tbd | std::unordered_map<K, V> |