1 //! Internal crate used by foreign-types 2 3 #![no_std] 4 #![warn(missing_docs)] 5 #![doc(html_root_url="https://docs.rs/foreign-types-shared/0.1")] 6 7 use core::cell::UnsafeCell; 8 9 /// An opaque type used to define `ForeignTypeRef` types. 10 /// 11 /// A type implementing `ForeignTypeRef` should simply be a newtype wrapper around this type. 12 pub struct Opaque(UnsafeCell<()>); 13 14 /// A type implemented by wrappers over foreign types. 15 pub trait ForeignType: Sized { 16 /// The raw C type. 17 type CType; 18 19 /// The type representing a reference to this type. 20 type Ref: ForeignTypeRef<CType = Self::CType>; 21 22 /// Constructs an instance of this type from its raw type. from_ptr(ptr: *mut Self::CType) -> Self23 unsafe fn from_ptr(ptr: *mut Self::CType) -> Self; 24 25 /// Returns a raw pointer to the wrapped value. as_ptr(&self) -> *mut Self::CType26 fn as_ptr(&self) -> *mut Self::CType; 27 } 28 29 /// A trait implemented by types which reference borrowed foreign types. 30 pub trait ForeignTypeRef: Sized { 31 /// The raw C type. 32 type CType; 33 34 /// Constructs a shared instance of this type from its raw type. 35 #[inline] from_ptr<'a>(ptr: *mut Self::CType) -> &'a Self36 unsafe fn from_ptr<'a>(ptr: *mut Self::CType) -> &'a Self { 37 &*(ptr as *mut _) 38 } 39 40 /// Constructs a mutable reference of this type from its raw type. 41 #[inline] from_ptr_mut<'a>(ptr: *mut Self::CType) -> &'a mut Self42 unsafe fn from_ptr_mut<'a>(ptr: *mut Self::CType) -> &'a mut Self { 43 &mut *(ptr as *mut _) 44 } 45 46 /// Returns a raw pointer to the wrapped value. 47 #[inline] as_ptr(&self) -> *mut Self::CType48 fn as_ptr(&self) -> *mut Self::CType { 49 self as *const _ as *mut _ 50 } 51 } 52