field_of.rs 1009 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use binrw::{binread, binwrite, BinRead, BinWrite};
  2. use std::{mem::size_of, ops::{DerefMut, Deref}};
  3. /// Wrapper to prefix arbitrary structs with size of struct as u32
  4. #[binwrite]
  5. #[binread]
  6. #[derive(Debug, PartialEq)]
  7. pub struct FieldOf<T>
  8. where
  9. T: for<'a> BinRead<Args<'a> = ()> + Default,
  10. T: for<'a> BinWrite<Args<'a> = ()> + Default,
  11. {
  12. // Temporary variable that must match size of value
  13. #[br(temp, assert(size == size_of::<T>().try_into().unwrap()))]
  14. #[bw(try_calc(u32::try_from(size_of::<T>())))]
  15. size: u32,
  16. pub value: T,
  17. }
  18. impl<T> Deref for FieldOf<T>
  19. where
  20. T: for<'a> BinRead<Args<'a> = ()> + Default,
  21. T: for<'a> BinWrite<Args<'a> = ()> + Default,
  22. {
  23. type Target = T;
  24. fn deref(&self) -> &Self::Target {
  25. &self.value
  26. }
  27. }
  28. impl<T> DerefMut for FieldOf<T>
  29. where
  30. T: for<'a> BinRead<Args<'a> = ()> + Default,
  31. T: for<'a> BinWrite<Args<'a> = ()> + Default,
  32. {
  33. fn deref_mut(&mut self) -> &mut Self::Target {
  34. &mut self.value
  35. }
  36. }