1*7b32f508SLoGin use std::{ 2*7b32f508SLoGin fmt::Debug, 3*7b32f508SLoGin ops::{Deref, DerefMut}, 4*7b32f508SLoGin }; 5*7b32f508SLoGin 6*7b32f508SLoGin pub mod logset; 7*7b32f508SLoGin pub mod mm; 8*7b32f508SLoGin 9*7b32f508SLoGin #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] 10*7b32f508SLoGin pub struct ObjectWrapper<T> { 11*7b32f508SLoGin object: Box<T>, 12*7b32f508SLoGin } 13*7b32f508SLoGin 14*7b32f508SLoGin impl<T: Debug + Sized> ObjectWrapper<T> { new(buf: &[u8]) -> Option<Self>15*7b32f508SLoGin pub fn new(buf: &[u8]) -> Option<Self> { 16*7b32f508SLoGin if buf.len() != std::mem::size_of::<T>() { 17*7b32f508SLoGin println!( 18*7b32f508SLoGin "ObjectWrapper::new(): buf.len() '{}' != std::mem::size_of::<T>(): '{}'", 19*7b32f508SLoGin buf.len(), 20*7b32f508SLoGin std::mem::size_of::<T>() 21*7b32f508SLoGin ); 22*7b32f508SLoGin return None; 23*7b32f508SLoGin } 24*7b32f508SLoGin let x = unsafe { std::ptr::read(buf.as_ptr() as *const T) }; 25*7b32f508SLoGin 26*7b32f508SLoGin let object = Box::new(x); 27*7b32f508SLoGin 28*7b32f508SLoGin // let object = ManuallyDrop::new(x); 29*7b32f508SLoGin Some(Self { object }) 30*7b32f508SLoGin } 31*7b32f508SLoGin } 32*7b32f508SLoGin 33*7b32f508SLoGin impl<T> DerefMut for ObjectWrapper<T> { deref_mut(&mut self) -> &mut Self::Target34*7b32f508SLoGin fn deref_mut(&mut self) -> &mut Self::Target { 35*7b32f508SLoGin &mut self.object 36*7b32f508SLoGin } 37*7b32f508SLoGin } 38*7b32f508SLoGin 39*7b32f508SLoGin impl<T> Deref for ObjectWrapper<T> { 40*7b32f508SLoGin type Target = T; 41*7b32f508SLoGin deref(&self) -> &Self::Target42*7b32f508SLoGin fn deref(&self) -> &Self::Target { 43*7b32f508SLoGin &self.object 44*7b32f508SLoGin } 45*7b32f508SLoGin } 46