10 releases

Uses new Rust 2021

0.1.9 Sep 14, 2022
0.1.8 Jul 5, 2022
0.1.7 May 4, 2022
0.1.6 Mar 9, 2022
0.1.0 Aug 26, 2020

#42 in GUI

Download history 164/week @ 2022-06-12 260/week @ 2022-06-19 207/week @ 2022-06-26 299/week @ 2022-07-03 243/week @ 2022-07-10 241/week @ 2022-07-17 196/week @ 2022-07-24 208/week @ 2022-07-31 400/week @ 2022-08-07 246/week @ 2022-08-14 227/week @ 2022-08-21 497/week @ 2022-08-28 2196/week @ 2022-09-04 3961/week @ 2022-09-11 385/week @ 2022-09-18 388/week @ 2022-09-25

7,089 downloads per month
Used in 18 crates (11 directly)

GPL-3.0-only OR LicenseRef-Slint-commercial

46KB
688 lines

vtable crate

Crates.io Docs.rs

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]/[VBox] types. They are fat reference/box types which wrap a pointer to the vtable, and a pointer to the object.
  • [VRc]/[VWeak] types: equivalent to std::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.
///
/// Note: the #[vtable] macro will automatically add `extern "C"` if that is missing.
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

~0.3–0.9MB
~19K SLoC