use std::{ffi::c_void, mem::size_of};
pub unsafe trait UserData: Sized {
type UserData;
fn user_data_ptr(&self) -> &*mut c_void;
fn user_data_ptr_mut(&mut self) -> &mut *mut c_void;
unsafe fn init_user_data(&mut self, user_data: Self::UserData) -> &mut Self {
if size_of::<Self::UserData>() > size_of::<*mut c_void>() {
let data = Box::new(user_data);
*self.user_data_ptr_mut() = Box::into_raw(data) as *mut c_void;
} else {
*self.user_data_ptr_mut() = *(&user_data as *const Self::UserData as *const *mut c_void)
}
self
}
unsafe fn get_user_data(this: &Self) -> &Self::UserData {
if size_of::<Self::UserData>() > size_of::<*mut c_void>() {
&*((*this.user_data_ptr()) as *const Self::UserData)
} else {
&*(this.user_data_ptr() as *const *mut c_void as *const Self::UserData)
}
}
unsafe fn get_user_data_mut(this: &mut Self) -> &mut Self::UserData {
if size_of::<Self::UserData>() > size_of::<*mut c_void>() {
&mut *((*this.user_data_ptr_mut()) as *mut Self::UserData)
} else {
&mut *(this.user_data_ptr_mut() as *mut *mut c_void as *mut Self::UserData)
}
}
}