use std::rt::heap::{self, usable_size, EMPTY};
use std::mem::{size_of, min_align_of};
use std::num::Int;
use std::usize;
#[inline]
pub unsafe fn alloc<T>() -> *mut T {
let size = size_of::<T>();
if size == 0 {
EMPTY as *mut T
} else {
heap::allocate(size, min_align_of::<T>()) as *mut T
}
}
#[inline]
pub unsafe fn alloc_array<T>(len: usize) -> *mut T {
debug_assert!(len != 0, "0 len passed to alloc_array");
let size = size_of::<T>();
if size == 0 {
EMPTY as *mut T
} else {
let desired_size = size.checked_mul(len).unwrap_or(usize::MAX);
heap::allocate(desired_size, min_align_of::<T>()) as *mut T
}
}
#[inline]
pub unsafe fn realloc_array<T>(ptr: *mut T, old_len: usize, len: usize) -> *mut T {
debug_assert!(len != 0, "0 len passed to realloc_array");
let size = size_of::<T>();
if size == 0 {
ptr
} else {
let desired_size = size.checked_mul(len).unwrap_or(usize::MAX);
let align = min_align_of::<T>();
heap::reallocate(ptr as *mut u8, size * old_len, desired_size, align) as *mut T
}
}
#[inline]
pub unsafe fn try_grow_inplace<T>(ptr: *mut T, old_len: usize, len: usize) -> Result<(), ()> {
debug_assert!(len >= old_len, "new len smaller than old_len in try_grow_inplace");
let size = size_of::<T>();
let align = min_align_of::<T>();
if size == 0 {
Ok(())
} else {
let desired_size = size.checked_mul(len).unwrap_or(usize::MAX);
let result_size = heap::reallocate_inplace(ptr as *mut u8, size * old_len,
desired_size, align);
if result_size >= desired_size {
Ok(())
} else {
Err(())
}
}
}
#[inline]
pub unsafe fn try_shrink_inplace<T>(ptr: *mut T, old_len: usize, len: usize) -> Result<(), ()> {
debug_assert!(len != 0, "0 len passed to try_shrink_inplace");
debug_assert!(len <= old_len, "new len bigger than old_len in try_grow_inplace");
let size = size_of::<T>();
let align = min_align_of::<T>();
if size == 0 {
Ok(())
} else {
let desired_size = size * len;
let result_size = heap::reallocate_inplace(ptr as *mut u8, size * old_len,
desired_size, align);
if result_size == usable_size(desired_size, align) {
Ok(())
} else {
Err(())
}
}
}
#[inline]
pub unsafe fn dealloc<T>(ptr: *mut T) {
let size = size_of::<T>();
if size == 0 {
} else {
heap::deallocate(ptr as *mut u8, size, min_align_of::<T>());
}
}
#[inline]
pub unsafe fn dealloc_array<T>(ptr: *mut T, len: usize) {
let size = size_of::<T>();
if size == 0 {
} else {
heap::deallocate(ptr as *mut u8, size * len, min_align_of::<T>());
}
}