Primitive types

Crubit maps primitive types1 to the direct equivalent in the other language. For example, C++ int32_t is Rust i32, C++ int is Rust ffi::c_int, C++ double is Rust f64, and so on.

Exceptions:

  • C++: There is no mapping for the currently-unsupported types nullptr_t, char8_t, wchar_t, and (u)int128_t.
  • Rust: There is no mapping for the currently-unsupported char and str types, and the never (!) type, except as a return type.

For more information, see Unsupported types

Bidirectional type mapping

The following map is bidirectional. If you call a C++ interface from Rust using Crubit, then int32_t in C++ becomes i32 in Rust. Vice versa, if you call a Rust interface from C++ using Crubit, i32 in Rust becomes int32_t in C++.

C++Rust
void() as a return type, ::core::ffi::c_void otherwise.
int8_ti8
int16_ti16
int32_ti32
int64_ti64
intptr_tisize
uint8_tu8
uint16_tu16
uint32_tu32
uint64_tu64
uintptr_tusize
boolbool
doublef64
floatf32
char::core::ffi::c_char 2
signed char::core::ffi::c_schar
unsigned char::core::ffi::c_uchar
short::core::ffi::c_short
unsigned short::core::ffi::c_ushort
int::core::ffi::c_int
unsigned int::core::ffi::c_uint
long::core::ffi::c_long
unsigned long::core::ffi::c_ulong
long long::core::ffi::c_longlong
unsigned long long::core::ffi::c_ulonglong

One-way type mapping

The types below are mapped in only one direction, but do not round trip back to the original type. For example, size_t maps to usize, but usize maps to uintptr_t.

C++ to Rust

The following C++ types become the following Rust types, but not vice versa:

C++Rust
ptrdiff_tisize
size_tusize
char16_tu16
char32_tu32 3

One-way mapping of Rust to C++ types

The following Rust types become the following C++ types, but not vice versa:

RustC++
! (return type)void

Unsupported types

Bindings for the following types are not supported at this point:

C++

  • nullptr_t and char8_t have not yet been implemented.
  • b/283268558: wchar_t is currently unsupported, for portability reasons.
  • b/254094650: int128_t is currently unsupported, because it does not yet have a decided ABI.

Rust

  • char is currently unsupported, pending design review.
  • b/262580415: str has not yet been implemented
  • b/254507801: ! has not yet been implemented except for return types.
1

Rust calls these types primitive types, while C++ calls them fundamental types. Since the Rust terminology is probably well understood by everybody, we use it here.

3

Unlike Rust char, char16_t and char32_t may contain invalid Unicode characters.

2

Note that Rust c_char and C++ char have different signedness in Google, or any other codebase with widespread use of unsigned char in x86.

TODO(jeanpierreda): document this in more detail.