co3 0.4.0

Build C API from Rust
Documentation
use core::marker::PhantomData;

use co3::ffi;

trait Mixed<T> {
    fn hidden(&self);
    fn exposed(&self, value: &T);
}

struct Resource<T>(u8, PhantomData<T>);

impl<T> Drop for Resource<T> {
    fn drop(&mut self) {}
}

impl<T> Mixed<T> for Resource<T> {
    fn hidden(&self) {
        let _ = self.0;
    }

    fn exposed(&self, value: &T) {
        let _ = (self.0, value);
    }
}

unsafe impl co3::tag::Tagged for Resource<u8> {
    const TAG: u8 = 1;
}

unsafe impl co3::tag::Tagged for Resource<u16> {
    const TAG: u8 = 2;
}

ffi! {
    #![unsafe(export("C"))]

    #[tag(u8)]
    type Resource<T>;

    impl<T> Drop for dyn Resource<T>
    where
        use<T> @ (<u8> | <u16>),
    {
        #[symbol_name = "mixed_drop"]
        fn drop(&mut self);
    }

    impl<T> Mixed<T> for dyn Resource<T>
    where
        use<T> @ (<u8> | <u16>),
    {
        #[symbol_name = "mixed_hidden"]
        fn hidden(&self);

        #[symbol_name = "mixed_exposed_{T}"]
        fn exposed(&self, value: &T);
    }
}

fn main() {}