14个版本
0.2.0 | 2024年3月14日 |
---|---|
0.1.11 | 2023年9月4日 |
0.1.10 | 2023年4月3日 |
0.1.9 | 2022年9月14日 |
0.1.0 | 2020年8月26日 |
#176 in Rust模式
63,660 每月下载量
用于 43 个crate (10直接)
57KB
860 行
vtable
crate
一个用于创建ffi友好的虚拟表的宏。
查看crate文档 获取更多详情。
lib.rs
:
此crate允许您创建ffi友好的虚拟表。
特性
- 一个
#[vtable]
宏,用于注释VTable结构体以生成与其安全交互的特性和结构。 VRef
/VRefMut
/VBox
类型。它们是胖引用/box类型,包含指向vtable的指针和指向对象的指针。- [
VRc
]/VWeak
类型:与std::rc::{Rc, Weak}
类型等效,但与vtable指针一起工作。 - 能够在vtable中存储常量。
- 这些常量甚至可以是字段偏移。
使用示例
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);
#[vtable]
宏创建了一个"Animal"特质。
注意,#[vtable]
宏应用于VTable结构体,以便cbindgen可以查看实际的vtable。
依赖项
~1.2–1.7MB
~34K SLoC