ffi_trait 1.0.0

FFI-safe trait vtables
Documentation
**ffi_trait**

This crate has an `vtable_for_trait!` macro that will generate an FFI-safe vtable for the trait that you declare inside it

## Usage


```rust, ignore
vtable_for_trait! {
    pub trait Foo {
        fn foo(&self, x: i32) -> f32;
        fn bar(&mut self);
    }

    pub vtable FooVtable;
}
```

will turn into something like

```rust, ignore
pub trait Foo {
    fn foo(&self, x: i32) -> f32;
    fn bar(&mut self);
}

#[derive(Clone, Copy)]

#[repr(C)]

pub struct FooVtable {
    pub drop_vtable: DropVtable,
    pub foo: unsafe extern "C" fn(NonNull<()>, i32) -> f32,
    pub bar: unsafe extern "C" fn(NonNull<()>),
}

unsafe impl<T: Foo> VtableFor<T> for FooVtable {
    const VTABLE: &'static Self = {
        // extern "C" compatible thunks

        &Self {
            drop_vtable: *<DropVtable as VtableFor<T>>::VTABLE,
            // methods
        }
    };
}

impl<'a> Foo for RefDyn<'a, FooVtable> {
    // methods
}

impl<'a> Foo for OwnDyn<'a, FooVtable> {
    // methods
}
```