27 lines
546 B
Rust
27 lines
546 B
Rust
use std::mem;
|
|
use std::mem::MaybeUninit;
|
|
|
|
pub fn field_offset<T, U, F: for<'a> FnOnce(&'a T) -> &'a U>(f: F) -> usize {
|
|
unsafe {
|
|
let instance = MaybeUninit::uninit().assume_init();
|
|
|
|
let offset = {
|
|
let field: &U = f(&instance);
|
|
field as *const U as usize - &instance as *const T as usize
|
|
};
|
|
|
|
mem::forget(instance);
|
|
|
|
offset
|
|
}
|
|
}
|
|
|
|
pub fn return_param<T, F>(f: F) -> T
|
|
where
|
|
F: FnOnce(&mut T),
|
|
{
|
|
let mut val = unsafe { mem::zeroed() };
|
|
f(&mut val);
|
|
val
|
|
}
|