|
@@ -1,28 +1,44 @@
|
|
|
use binrw::{binrw, BinRead, BinWrite};
|
|
|
-use std::ops::{Deref, DerefMut};
|
|
|
+use std::{
|
|
|
+ fmt::{Debug, Display},
|
|
|
+ marker::PhantomData,
|
|
|
+ ops::{Deref, DerefMut},
|
|
|
+};
|
|
|
|
|
|
/// Wrapper to prefix array of single type
|
|
|
#[binrw]
|
|
|
#[derive(Debug, PartialEq)]
|
|
|
-pub struct ArrayOf<T>
|
|
|
+pub struct ArrayOf<T, S = u32>
|
|
|
where
|
|
|
// Static bounds due to https://github.com/jam1garner/binrw/issues/199
|
|
|
T: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
T: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
+ <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
+ usize: TryFrom<S>,
|
|
|
{
|
|
|
// Temporary variable that holds number of elements
|
|
|
#[br(temp)]
|
|
|
- #[bw(try_calc(u32::try_from(value.len())))]
|
|
|
- count: u32,
|
|
|
+ #[bw(try_calc(S::try_from(value.len())))]
|
|
|
+ count: S,
|
|
|
|
|
|
#[br(count = count)]
|
|
|
pub value: Vec<T>,
|
|
|
+
|
|
|
+ _marker: PhantomData<S>,
|
|
|
}
|
|
|
|
|
|
-impl<T> Deref for ArrayOf<T>
|
|
|
+impl<T, S> Deref for ArrayOf<T, S>
|
|
|
where
|
|
|
T: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
T: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
+ <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
+ usize: TryFrom<S>,
|
|
|
{
|
|
|
type Target = Vec<T>;
|
|
|
|
|
@@ -31,22 +47,35 @@ where
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-impl<T> DerefMut for ArrayOf<T>
|
|
|
+impl<T, S> DerefMut for ArrayOf<T, S>
|
|
|
where
|
|
|
T: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
T: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
+ <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
+ usize: TryFrom<S>,
|
|
|
{
|
|
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
|
|
&mut self.value
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-impl<T> From<Vec<T>> for ArrayOf<T>
|
|
|
+impl<T, S> From<Vec<T>> for ArrayOf<T, S>
|
|
|
where
|
|
|
T: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
T: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
+ S: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
+ <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
+ usize: TryFrom<S>,
|
|
|
{
|
|
|
fn from(value: Vec<T>) -> Self {
|
|
|
- Self { value }
|
|
|
+ Self {
|
|
|
+ value,
|
|
|
+ _marker: PhantomData,
|
|
|
+ }
|
|
|
}
|
|
|
}
|