summaryrefslogtreecommitdiffstats
path: root/safe_libc/src/boxed.rs
diff options
context:
space:
mode:
Diffstat (limited to 'safe_libc/src/boxed.rs')
-rw-r--r--safe_libc/src/boxed.rs150
1 files changed, 0 insertions, 150 deletions
diff --git a/safe_libc/src/boxed.rs b/safe_libc/src/boxed.rs
deleted file mode 100644
index 4a38b70..0000000
--- a/safe_libc/src/boxed.rs
+++ /dev/null
@@ -1,150 +0,0 @@
-use crate::util;
-
-use core::{fmt, mem, ptr};
-use core::ops::{Deref, DerefMut};
-
-fn alloc<T>(len: usize) -> *mut T {
- if util::zst::<T>(len) {
- return ptr::null_mut();
- }
- let size = len.checked_mul(mem::size_of::<T>()).expect("allocation overflow");
- let align = mem::align_of::<T>();
- util::must_succeed(
- unsafe {
- libc::memalign(align, size)
- }
- ).cast()
-}
-
-#[inline]
-const fn dangling<T>() -> *mut T {
- mem::align_of::<T>() as *mut T
-}
-
-#[inline]
-fn slice_len<T>(p: *const [T]) -> usize {
- unsafe { mem::transmute::<_, [usize; 2]>(p)[1] }
-}
-
-pub trait SafePtr {
- fn safe_ptr(p: *mut Self) -> *mut Self;
-}
-
-impl<T> SafePtr for T {
- #[inline]
- fn safe_ptr(p: *mut T) -> *mut T {
- if util::zst::<T>(1) {
- return dangling();
- }
-
- debug_assert!(!p.is_null(), "NULL ptr");
- p
- }
-}
-
-impl<T> SafePtr for [T] {
- #[inline]
- fn safe_ptr(p: *mut [T]) -> *mut [T] {
- let len = slice_len(p);
- if util::zst::<T>(len) {
- return ptr::slice_from_raw_parts_mut(dangling(), len);
- }
-
- debug_assert!(!p.is_null(), "NULL ptr");
- p
- }
-}
-
-pub struct CBox<T: SafePtr + ?Sized>(*mut T);
-
-impl<T: SafePtr + ?Sized> CBox<T> {
- #[inline]
- pub unsafe fn from_raw_unchecked(p: *mut T) -> CBox<T> {
- CBox(p)
- }
-
- #[inline]
- pub fn into_raw(self) -> *mut T {
- let p = self.0;
- mem::forget(self);
- p
- }
-
- #[inline]
- pub fn as_ptr(&self) -> *const T {
- self.0
- }
-
- #[inline]
- pub fn as_mut_ptr(&mut self) -> *mut T {
- self.0
- }
-}
-
-impl<T> CBox<T> {
- #[inline]
- pub fn new(value: T) -> CBox<T> {
- let p = alloc(1);
- unsafe {
- ptr::write(p, value);
- CBox::from_raw_unchecked(p)
- }
- }
-
- #[inline]
- pub unsafe fn from_raw(p: *mut T) -> CBox<T> {
- util::check_ptr(p, 1);
- CBox(p)
- }
-
- #[inline]
- pub unsafe fn slice_from_raw_parts_unchecked(p: *mut T, len: usize) -> CBox<[T]> {
- CBox(ptr::slice_from_raw_parts_mut(p, len))
- }
-
- #[inline]
- pub unsafe fn slice_from_raw_parts(p: *mut T, len: usize) -> CBox<[T]> {
- util::check_ptr(p, len);
- CBox::slice_from_raw_parts_unchecked(p, len)
- }
-}
-
-impl<T: SafePtr + ?Sized> Drop for CBox<T> {
- #[inline]
- fn drop(&mut self) {
- unsafe {
- ptr::drop_in_place(self.0);
- libc::free(self.0.cast());
- }
- }
-}
-
-impl<T: SafePtr + ?Sized> Deref for CBox<T> {
- type Target = T;
-
- #[inline]
- fn deref(&self) -> &T {
- unsafe { &*T::safe_ptr(self.0) }
- }
-}
-
-impl<T: SafePtr + ?Sized> DerefMut for CBox<T> {
- #[inline]
- fn deref_mut(&mut self) -> &mut T {
- unsafe { &mut *T::safe_ptr(self.0) }
- }
-}
-
-impl<T: fmt::Debug + SafePtr + ?Sized> fmt::Debug for CBox<T> {
- #[inline]
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- fmt::Debug::fmt(&**self, f)
- }
-}
-
-impl<T: fmt::Display + SafePtr + ?Sized> fmt::Display for CBox<T> {
- #[inline]
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- fmt::Display::fmt(&**self, f)
- }
-}