use std::ptr;
pub fn def_global_ptr<T>(value: T) -> u64 {
let boxed = Box::new(value);
let p = Box::leak(boxed);
ptr::addr_of_mut!(*p) as u64
}
pub fn get_global_mut<T>(p: u64) -> &'static mut T {
let gv_ref = p as *mut T;
unsafe { &mut *gv_ref }
}
pub fn get_global<T>(p: u64) -> &'static T {
let gv_ref = p as *mut T;
unsafe { &*gv_ref }
}
pub fn undef_global_ptr<T>(p: u64) {
let gv_ref = p as *mut T;
unsafe {
let boxed = Box::from_raw(gv_ref);
drop(boxed);
};
}
#[cfg(test)]
mod tests {
use super::{def_global_ptr, get_global, get_global_mut, undef_global_ptr};
struct Foo {
id: u64,
name: String,
}
#[test]
fn test() {
let p = def_global_ptr(Foo {
id: 1,
name: "bar".to_string(),
});
let foo = get_global::<Foo>(p);
assert_eq!(foo.id, 1);
assert_eq!(foo.name, "bar");
let foo = get_global_mut::<Foo>(p);
foo.id += 1;
let foo = get_global::<Foo>(p);
assert_eq!(foo.id, 2);
undef_global_ptr::<Foo>(p);
}
}