52 lines
1.5 KiB
Rust
52 lines
1.5 KiB
Rust
|
//! Internal crate used by foreign-types
|
||
|
|
||
|
#![no_std]
|
||
|
#![warn(missing_docs)]
|
||
|
#![doc(html_root_url="https://docs.rs/foreign-types-shared/0.1")]
|
||
|
|
||
|
use core::cell::UnsafeCell;
|
||
|
|
||
|
/// An opaque type used to define `ForeignTypeRef` types.
|
||
|
///
|
||
|
/// A type implementing `ForeignTypeRef` should simply be a newtype wrapper around this type.
|
||
|
pub struct Opaque(UnsafeCell<()>);
|
||
|
|
||
|
/// A type implemented by wrappers over foreign types.
|
||
|
pub trait ForeignType: Sized {
|
||
|
/// The raw C type.
|
||
|
type CType;
|
||
|
|
||
|
/// The type representing a reference to this type.
|
||
|
type Ref: ForeignTypeRef<CType = Self::CType>;
|
||
|
|
||
|
/// Constructs an instance of this type from its raw type.
|
||
|
unsafe fn from_ptr(ptr: *mut Self::CType) -> Self;
|
||
|
|
||
|
/// Returns a raw pointer to the wrapped value.
|
||
|
fn as_ptr(&self) -> *mut Self::CType;
|
||
|
}
|
||
|
|
||
|
/// A trait implemented by types which reference borrowed foreign types.
|
||
|
pub trait ForeignTypeRef: Sized {
|
||
|
/// The raw C type.
|
||
|
type CType;
|
||
|
|
||
|
/// Constructs a shared instance of this type from its raw type.
|
||
|
#[inline]
|
||
|
unsafe fn from_ptr<'a>(ptr: *mut Self::CType) -> &'a Self {
|
||
|
&*(ptr as *mut _)
|
||
|
}
|
||
|
|
||
|
/// Constructs a mutable reference of this type from its raw type.
|
||
|
#[inline]
|
||
|
unsafe fn from_ptr_mut<'a>(ptr: *mut Self::CType) -> &'a mut Self {
|
||
|
&mut *(ptr as *mut _)
|
||
|
}
|
||
|
|
||
|
/// Returns a raw pointer to the wrapped value.
|
||
|
#[inline]
|
||
|
fn as_ptr(&self) -> *mut Self::CType {
|
||
|
self as *const _ as *mut _
|
||
|
}
|
||
|
}
|