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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use std::{ ffi::c_void, mem::{ self, MaybeUninit, }, }; use libc::{ size_t, c_int, }; pub type VoidPointer = *mut (); pub type ConstVoidPointer = *const (); pub const NULL_PTR: VoidPointer = 0 as VoidPointer; pub fn null<T>() -> *mut T { NULL_PTR as *mut T } pub unsafe fn memset(ptr: *mut u8, value: u8, length: usize) { libc::memset(ptr as *mut c_void, value as c_int, length as size_t); } pub unsafe fn replace<T>(ptr: *mut T, value: T) -> T { mem::replace(&mut *ptr, value) } pub unsafe fn take<T>(ptr: *mut T) -> T { mem::replace(&mut *ptr, MaybeUninit::zeroed().assume_init()) } pub unsafe fn put<T>(ptr: *mut T, value: T) { mem::forget(mem::replace(&mut *ptr, value)); } pub unsafe fn memcpy(dst: VoidPointer, src: ConstVoidPointer, size: usize) -> VoidPointer { libc::memcpy(dst as *mut c_void, src as *const c_void, size as size_t) as VoidPointer } pub unsafe fn memmove(dst: VoidPointer, src: ConstVoidPointer, size: usize) -> VoidPointer { libc::memmove(dst as *mut c_void, src as *const c_void, size as size_t) as VoidPointer }