1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
use std::mem::forget;
pub trait PtrWrapper: Sized {
type Pointer;
/// Wraps the pointer into a **owned** wrapper.
///
/// # Safety
///
/// Pointer must be valid.
unsafe fn from_raw(raw: *mut Self::Pointer) -> Self;
/// Returns the inner pointer.
fn as_ptr(&self) -> *const Self::Pointer;
/// Consumes the wrapper and transfers ownershop to the pointer
///
/// This does **NOT** drop the wrapper internally.
fn into_raw(mut self) -> *mut Self::Pointer {
let raw = self.as_ptr_mut();
forget(self);
raw
}
/// Returns the inner pointer (mutable version).
fn as_ptr_mut(&mut self) -> *mut Self::Pointer {
self.as_ptr() as *mut _
}
}