1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
use objc::*;

pub trait IntoRaw {
    type Raw: Raw;

    fn into_raw(&self) -> Self::Raw;
}

pub trait Raw {
    unsafe fn from_raw(object: *mut objc::runtime::Object) -> Self;
    unsafe fn as_raw(&self) -> *mut objc::runtime::Object;

    unsafe fn from_raw_retain(object: *mut objc::runtime::Object) -> Self
    where
        Self: Sized,
    {
        Self::from_raw(msg_send![object, retain])
    }
}