• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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