Thanks to visit codestin.com
Credit goes to lib.rs

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

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

28,223 downloads per month
Used in 76 crates (12 directly)

MIT/Apache

57KB
859 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.
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