|
@@ -1,20 +1,66 @@
|
|
|
use binrw::{binrw, BinRead, BinWrite};
|
|
|
+use num::Num;
|
|
|
use std::{
|
|
|
fmt::{Debug, Display},
|
|
|
marker::PhantomData,
|
|
|
ops::{Deref, DerefMut},
|
|
|
};
|
|
|
|
|
|
-/// Wrapper to prefix array of single type
|
|
|
+/// Supertrait to simplify constraints
|
|
|
+pub trait BinReadWrite:
|
|
|
+ for<'a> BinRead<Args<'a> = ()> + for<'a> BinWrite<Args<'a> = ()> + 'static
|
|
|
+{
|
|
|
+}
|
|
|
+impl<T> BinReadWrite for T where
|
|
|
+ T: for<'a> BinRead<Args<'a> = ()> + for<'a> BinWrite<Args<'a> = ()> + 'static
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+/// Wrapper to prefix array of primitives (u8/u32/etc)
|
|
|
+#[binrw]
|
|
|
+#[derive(PartialEq)]
|
|
|
+pub struct ArrayOfPrimitive<T, S = u32>
|
|
|
+where
|
|
|
+ // Static bounds due to https://github.com/jam1garner/binrw/issues/199
|
|
|
+ T: BinReadWrite + Num,
|
|
|
+ S: BinReadWrite,
|
|
|
+ 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(S::try_from(value.len())))]
|
|
|
+ count: S,
|
|
|
+
|
|
|
+ #[br(count = count)]
|
|
|
+ pub value: Vec<T>,
|
|
|
+
|
|
|
+ _marker: PhantomData<S>,
|
|
|
+}
|
|
|
+
|
|
|
+impl<T, S> Debug for ArrayOfPrimitive<T, S>
|
|
|
+where
|
|
|
+ T: BinReadWrite + Num,
|
|
|
+ S: BinReadWrite,
|
|
|
+ T: Debug,
|
|
|
+ S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
+ <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
+ usize: TryFrom<S>,
|
|
|
+{
|
|
|
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
+ write!(f, "{:?}", self.value)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/// Wrapper to prefix array of single non-primitive type
|
|
|
#[binrw]
|
|
|
#[derive(PartialEq)]
|
|
|
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,
|
|
|
+ T: BinReadWrite,
|
|
|
+ S: BinReadWrite,
|
|
|
S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
<S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
usize: TryFrom<S>,
|
|
@@ -32,26 +78,22 @@ where
|
|
|
|
|
|
impl<T, S> Debug for ArrayOf<T, S>
|
|
|
where
|
|
|
- T: for<'a> BinRead<Args<'a> = ()> + 'static,
|
|
|
- T: for<'a> BinWrite<Args<'a> = ()> + 'static,
|
|
|
+ T: BinReadWrite,
|
|
|
+ S: BinReadWrite,
|
|
|
T: Debug,
|
|
|
- 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 fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
- write!(f, "{:?}", self.value)
|
|
|
+ write!(f, "{:#?}", self.value)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
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,
|
|
|
+ T: BinReadWrite,
|
|
|
+ S: BinReadWrite,
|
|
|
S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
<S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
usize: TryFrom<S>,
|
|
@@ -65,10 +107,8 @@ where
|
|
|
|
|
|
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,
|
|
|
+ T: BinReadWrite,
|
|
|
+ S: BinReadWrite,
|
|
|
S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
<S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
usize: TryFrom<S>,
|
|
@@ -80,10 +120,8 @@ where
|
|
|
|
|
|
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,
|
|
|
+ T: BinReadWrite,
|
|
|
+ S: BinReadWrite,
|
|
|
S: TryFrom<usize> + Display + Debug + Copy + Clone,
|
|
|
<S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
|
|
|
usize: TryFrom<S>,
|