1234567891011121314151617181920212223242526272829303132333435363738394041 |
- use binrw::{binread, binwrite, BinRead, BinWrite};
- use std::{mem::size_of, ops::{DerefMut, Deref}};
- /// Wrapper to prefix arbitrary structs with size of struct as u32
- #[binwrite]
- #[binread]
- #[derive(Debug, PartialEq)]
- pub struct FieldOf<T>
- where
- T: for<'a> BinRead<Args<'a> = ()> + Default,
- T: for<'a> BinWrite<Args<'a> = ()> + Default,
- {
- // Temporary variable that must match size of value
- #[br(temp, assert(size == size_of::<T>().try_into().unwrap()))]
- #[bw(try_calc(u32::try_from(size_of::<T>())))]
- size: u32,
- pub value: T,
- }
- impl<T> Deref for FieldOf<T>
- where
- T: for<'a> BinRead<Args<'a> = ()> + Default,
- T: for<'a> BinWrite<Args<'a> = ()> + Default,
- {
- type Target = T;
- fn deref(&self) -> &Self::Target {
- &self.value
- }
- }
- impl<T> DerefMut for FieldOf<T>
- where
- T: for<'a> BinRead<Args<'a> = ()> + Default,
- T: for<'a> BinWrite<Args<'a> = ()> + Default,
- {
- fn deref_mut(&mut self) -> &mut Self::Target {
- &mut self.value
- }
- }
|