//! This file contains various code snippets taken from the CXX book and //! tutorial. Some have been modified to fit the course better. // ANCHOR: rust_bridge #[cxx::bridge] mod ffi { extern "Rust" { type MyType; // Opaque type fn foo(&self); // Method on `MyType` fn bar() -> Box; // Free function } } struct MyType(i32); impl MyType { fn foo(&self) { println!("{}", self.0); } } fn bar() -> Box { Box::new(MyType(123)) } // ANCHOR_END: rust_bridge // ANCHOR: cpp_bridge #[cxx::bridge] mod ffi { extern "C++" { include!("demo/include/blobstore.h"); type BlobstoreClient; fn new_blobstore_client() -> UniquePtr; fn put(&self, parts: &mut MultiBuf) -> u64; } unsafe extern "C++" { fn f(); // safe to call } } // ANCHOR_END: cpp_bridge // ANCHOR: shared_types #[cxx::bridge] mod ffi { #[derive(Clone, Debug, Hash)] struct PlayingCard { suit: Suit, value: u8, // A=1, J=11, Q=12, K=13 } enum Suit { Clubs, Diamonds, Hearts, Spades, } } // ANCHOR_END: shared_types // ANCHOR: shared_enums_bridge #[cxx::bridge] mod ffi { enum Suit { Clubs, Diamonds, Hearts, Spades, } } // ANCHOR_END: shared_enums_bridge // ANCHOR: shared_enums_rust #[derive(Copy, Clone, PartialEq, Eq)] #[repr(transparent)] pub struct Suit { pub repr: u8, } #[allow(non_upper_case_globals)] impl Suit { pub const Clubs: Self = Suit { repr: 0 }; pub const Diamonds: Self = Suit { repr: 1 }; pub const Hearts: Self = Suit { repr: 2 }; pub const Spades: Self = Suit { repr: 3 }; } // ANCHOR_END: shared_enums_rust // ANCHOR: rust_result #[cxx::bridge] mod ffi { extern "Rust" { fn fallible(depth: usize) -> Result; } } fn fallible(depth: usize) -> anyhow::Result { if depth == 0 { return Err(anyhow::Error::msg("fallible1 requires depth > 0")); } Ok("Success!".into()) } // ANCHOR_END: rust_result // ANCHOR: cpp_exception #[cxx::bridge] mod ffi { unsafe extern "C++" { include!("example/include/example.h"); fn fallible(depth: usize) -> Result; } } fn main() { if let Err(err) = ffi::fallible(99) { eprintln!("Error: {}", err); process::exit(1); } } // ANCHOR_END: cpp_exception // ANCHOR: cxx_overview #[cxx::bridge] mod ffi { extern "Rust" { type MultiBuf; fn next_chunk(buf: &mut MultiBuf) -> &[u8]; } unsafe extern "C++" { include!("example/include/blobstore.h"); type BlobstoreClient; fn new_blobstore_client() -> UniquePtr; fn put(self: &BlobstoreClient, buf: &mut MultiBuf) -> Result; } } // Definitions of Rust types and functions go here // ANCHOR_END: cxx_overview