Files
RedBear-OS/src/header/_oldlib/mallocnull.rs
T
Jeremy Soller bab4e2896a Format
2018-08-27 06:35:30 -06:00

47 lines
977 B
Rust

use core::mem;
use libc::{c_void, size_t};
/// Malloc memory if pointer is null, and free on drop
pub struct MallocNull<T> {
value: *mut T,
free_on_drop: bool
}
impl<T> MallocNull<T> {
pub fn new(ptr: *mut T, size: usize) -> MallocNull<T> {
if ptr.is_null() {
MallocNull {
value: unsafe { ::malloc(size as size_t) as *mut T },
free_on_drop: true
}
} else {
MallocNull {
value: ptr,
free_on_drop: false
}
}
}
pub fn into_raw(self) -> *mut T {
let ptr = self.value;
mem::forget(self);
ptr
}
pub fn as_ptr(&self) -> *const T {
self.value
}
pub fn as_mut_ptr(&self) -> *mut T {
self.value
}
}
impl<T> Drop for MallocNull<T> {
fn drop(&mut self) {
if self.free_on_drop {
unsafe { ::free(self.value as *mut c_void) };
}
}
}