16 releases
| 0.3.0 | Jun 16, 2025 |
|---|---|
| 0.2.1 | Dec 18, 2024 |
| 0.2.0 | Mar 14, 2024 |
| 0.1.11 | Sep 4, 2023 |
| 0.1.0 | Aug 26, 2020 |
#996 in GUI
28,223 downloads per month
Used in 76 crates
(12 directly)
57KB
859 lines
vtable crate
A macro to create ffi-friendly virtual tables.
Check the crate documentation for more details.
lib.rs:
This crate allows you to create ffi-friendly virtual tables.
Features
- A
#[vtable]macro to annotate a VTable struct to generate the traits and structure to safely work with it. VRef/VRefMut/VBoxtypes. They are fat reference/box types which wrap a pointer to the vtable, and a pointer to the object.- [
VRc]/VWeaktypes: equivalent tostd::rc::{Rc, Weak}types but works with a vtable pointer. - Ability to store constants in a vtable.
- These constants can even be a field offset.
Example of use:
use vtable::*;
// we are going to declare a VTable structure for an Animal trait
#[vtable]
#[repr(C)]
struct AnimalVTable {
/// pointer to a function that makes a noise. The `VRef<AnimalVTable>` is the type of
/// the self object.
make_noise: fn(VRef<AnimalVTable>, i32) -> i32,
/// if there is a 'drop' member, it is considered as the destructor.
drop: fn(VRefMut<AnimalVTable>),
}
struct Dog(i32);
// The #[vtable] macro created the Animal Trait
impl Animal for Dog {
fn make_noise(&self, intensity: i32) -> i32 {
println!("Wof!");
return self.0 * intensity;
}
}
// the vtable macro also exposed a macro to create a vtable
AnimalVTable_static!(static DOG_VT for Dog);
// with that, it is possible to instantiate a VBox
let animal_box = VBox::<AnimalVTable>::new(Dog(42));
assert_eq!(animal_box.make_noise(2), 42 * 2);
The #[vtable] macro created the "Animal" trait.
Note that the #[vtable] macro is applied to the VTable struct so
that cbindgen can see the actual vtable.
Dependencies
~1.2–1.7MB
~34K SLoC