Releases: dtolnay/cxx
0.5.4
0.5.3
-
Add an item-level
#[namespace = "..."]
attribute to specify the C++ namespace path of an individual type or function (#370, #380, thanks @adetaylor)#[cxx::bridge] mod ffi { #[namespace = "the::path::of"] struct Thing {...} extern "C++" { #[namespace = "some::where::else"] fn function() -> Thing; } }
-
Emit diagnostic on
include!
paths relative to.
or..
, as the positioning of generated code inside of Cargo's OUT_DIR is not specified (#368, #375) -
Treat C++ constructors
rust::String(nullptr, 0)
andrust::Str(nullptr, 0)
as creating empty strings; previously UB (#383) -
Enable
rust::Str
andrust::Slice<T>
to be passed in registers by C++ (#387) -
Eliminate warning from rustc 1.46+ when using function pointers in the signature of an extern C++ function (#396)
-
Support single Rust source file containing multiple
#[cxx::bridge]
modules (#397) -
Expose a way to bypass is_trivially_destructible/_move_constructible check on extern types passed by value (#406)
// IsRelocatable<T> is used in assertions that a C++ type passed by value // between Rust and C++ is soundly relocatable by Rust. // // There may be legitimate reasons to opt out of the check for support of types // that the programmer knows are soundly Rust-movable despite not being // recognized as such by the C++ type system due to a move constructor or // destructor. To opt out of the relocatability check, do either of the // following things in any header used by `include!` in the bridge. // // --- if you define the type: // struct MyType { // ... // + using IsRelocatable = std::true_type; // }; // // --- otherwise: // + template <> // + struct rust::IsRelocatable<MyType> : std::true_type {}; template <typename T> struct IsRelocatable;
-
Fix error on pass-by-reference of a shared struct containing a Rust
String
to a C++ function (#408) -
Make shared structs order-independent such that a struct is able to contain a field whose type is another shared struct defined later in the same FFI module (#411)
0.5.2
- Allow creation of UniquePtrs to extern type aliases of trivial extern types (#361, thanks @adetaylor)
- Make contents of "rust/cxx.h" header available to high level code generators (#364, thanks @adetaylor)
0.5.1
- Enable functions to have a different name between Rust and C++ (#349)
- Within cxx::bridge, write #[rust_name = "..."] or #[cxx_name = "..."] to make a change to either name of a function
- In general many functions can have the same C++ name (due to overloading); every function must continue to have a unique Rust name
#[cxx::bridge]
mod ffi {
extern "C++" {
include!("path/to/header.h");
#[cxx_name = "take"]
fn take_int(i: i32);
#[cxx_name = "take"] // different overload of the same name in C++
fn take_str(s: &str);
}
}
0.5.0
- Enable extern type aliases to be passed and returned by value across the FFI as long as an
unsafe impl ExternType
impl claims that the underlying C++ type is trivially move constructible and trivially destructible; see https://docs.rs/cxx/0.5.0/cxx/trait.ExternType.html#associatedtype.Kind (#325, thanks @adetaylor) - Expose a way for particular generic type instantiations of std::unique_ptr and std::vector, like
UniquePtr<MyType>
, to be produced on demand (#336) - Enable import of handwritten as well as generated headers from direct dependencies in the Cargo-based workflow; see https://docs.rs/cxx-build/0.5.0/cxx_build/static.CFG.html#cfginclude_prefix (#346, #347)