mod.rs 1008 B

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