co3 0.4.0

Build C API from Rust
Documentation
use co3::ffi;

trait Kita {
    fn kita(self) -> u32;
}

trait RefKita {
    fn kita(&self) -> u32;
}

struct Exported0(u8);
impl Kita for Exported0 {
    fn kita(self) -> u32 {
        unimplemented!()
    }
}
impl RefKita for Exported0 {
    fn kita(&self) -> u32 {
        unimplemented!()
    }
}

struct Exported1(u8);
impl Kita for Exported1 {
    fn kita(self) -> u32 {
        unimplemented!()
    }
}
impl RefKita for Exported1 {
    fn kita(&self) -> u32 {
        unimplemented!()
    }
}

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

    impl<dyn(u8) T> Kita for T
    where
        use<T> @ <u32>,
    {
        fn kita(self, self_id: <dyn T>::TAG) -> u32;
    }
}

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

    fn never<dyn(u8) T>()
    where
        use<T> @ ();
}

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

    fn never<dyn(u8) T>()
    where
        use<T> @ ();
}

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

    impl<dyn(u8) T> Dispatch for T
    where
        use<T> @ <u32> | <u64>,
    {
        fn dispatch(&self);
    }
}

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

    impl<dyn(u8) T> Dispatch for T
    where
        use<T> @ <u32> | <u64>,
    {
        fn dispatch(&self);
    }
}

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

    fn dispatch<dyn(u8) T>()
    where
        use<T> @ <u32>,
        T: Copy;
}

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

    fn dispatch<dyn(u8) T>()
    where
        use<T> @ <u32>,
        T: Copy;
}

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

    impl<'a, dyn(u8) T> Kita<'a> for T
    where
        use<T> @ <'a, u32>,
    {
        fn drop(&mut self);
    }
}

ffi! {
    #![symbol_prefix = "kita"]

    #![unsafe(extern("C"))]

    impl<'a, dyn(u8) T> Kita<'a> for T
    where
        use<T> @ <'a, u32>,
    {
        fn drop(&mut self, self_id: <dyn Self>::TAG);
    }
}

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

    impl<dyn T> Kita for T
    where
        use<T> @ <u32>,
    {
        fn kita(self) -> u32;
    }
}

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

    impl<dyn T> Kita for T
    where
        use<T> @ <u32>,
    {
        #[symbol_name = "kita"]
        fn kita(self) -> u32;
    }
}

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

    impl<T> Kita for dyn T
    where
        use<T> @ <u32>,
    {
        fn kita(self) -> u32;
    }
}

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

    impl<T> Kita for dyn T
    where
        use<T> @ <u32>,
    {
        fn kita(self) -> u32;
    }
}

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

    impl<dyn(i64) T> Kita for T
    where
        use<T> @ <u32>,
    {
        #[symbol_name = "kita"]
        fn kita(self, self_id: <dyn Self>::TAG) -> <dyn T>::TAG;
    }

    fn kita(self, self_id: <dyn Self>::TAG) -> <dyn T>::TAG;
}

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

    impl<dyn(u64) T> Kita for T
    where
        use<T> @ <u32>,
    {
        #[symbol_name = "kita"]
        fn kita(self, self_id: (<dyn Self>::TAG,)) -> u32;
    }
}

ffi! {
    #![unsafe(extern("C"))]
    #![symbol_prefix = "kita"]

    #[tag(u32, unsafe(1))]
    type Externed1;

    impl<dyn(u32) T> RefKita for T
    where
        use<T> @ (<Externed1> | <Externed1>),
    {
        #[symbol_name = "kita"]
        fn kita(self_id: <dyn T>::TAG, &self) -> u32;
    }
}

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

    #[tag(u8, unsafe(1))]
    type Exported;

    impl Trait for dyn Exported + Send {
        fn method(&self);
    }
}

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

    #[tag(u8, unsafe(1))]
    type Imported;

    impl Trait for dyn Imported + Send {
        fn method(&self);
    }
}

fn main() {}