1use std::{
2 ffi::c_void,
3 mem::{
4 self,
5 MaybeUninit,
6 },
7};
8use libc::{
9 size_t,
10 c_int,
11};
12
13pub type VoidPointer = *mut ();
14pub type ConstVoidPointer = *const ();
15
16pub const NULL_PTR: VoidPointer = 0 as VoidPointer;
17
18pub fn null<T>() -> *mut T
19{
20 NULL_PTR as *mut T
21}
22
23pub unsafe fn memset(ptr: *mut u8, value: u8, length: usize)
24{
25 libc::memset(ptr as *mut c_void, value as c_int, length as size_t);
26}
27
28pub unsafe fn replace<T>(ptr: *mut T, value: T) -> T
29{
30 mem::replace(&mut *ptr, value)
31}
32pub unsafe fn take<T>(ptr: *mut T) -> T
33{
34 mem::replace(&mut *ptr, MaybeUninit::zeroed().assume_init())
35}
36pub unsafe fn put<T>(ptr: *mut T, value: T)
37{
38 mem::forget(mem::replace(&mut *ptr, value));
39}
40
41pub unsafe fn memcpy(dst: VoidPointer, src: ConstVoidPointer, size: usize) -> VoidPointer
42{
43 libc::memcpy(dst as *mut c_void, src as *const c_void, size as size_t) as VoidPointer
44}
45pub unsafe fn memmove(dst: VoidPointer, src: ConstVoidPointer, size: usize) -> VoidPointer
46{
47 libc::memmove(dst as *mut c_void, src as *const c_void, size as size_t) as VoidPointer
48}