Skip to content

Commit 61bd807

Browse files
committed
updates bytes to use const generics
1 parent e7eeea3 commit 61bd807

File tree

1 file changed

+91
-128
lines changed

1 file changed

+91
-128
lines changed

ff/src/bytes.rs

Lines changed: 91 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -14,151 +14,114 @@ pub trait FromBytes: Sized {
1414
fn read<R: Read>(reader: R) -> IoResult<Self>;
1515
}
1616

17-
macro_rules! array_bytes {
18-
($N:expr) => {
19-
impl ToBytes for [u8; $N] {
20-
#[inline]
21-
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
22-
writer.write_all(self)
23-
}
24-
}
2517

26-
impl FromBytes for [u8; $N] {
27-
#[inline]
28-
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
29-
let mut arr = [0u8; $N];
30-
reader.read_exact(&mut arr)?;
31-
Ok(arr)
32-
}
33-
}
18+
impl<const N: usize> ToBytes for [u8; N] {
19+
#[inline]
20+
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
21+
writer.write_all(self)
22+
}
23+
}
3424

35-
impl ToBytes for [u16; $N] {
36-
#[inline]
37-
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
38-
for num in self {
39-
writer.write_all(&num.to_le_bytes())?;
40-
}
41-
Ok(())
42-
}
25+
impl<const N: usize> FromBytes for [u8; N] {
26+
#[inline]
27+
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
28+
let mut arr = [0u8; N];
29+
reader.read_exact(&mut arr)?;
30+
Ok(arr)
31+
}
32+
}
33+
34+
impl<const N: usize> ToBytes for [u16; N] {
35+
#[inline]
36+
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
37+
for num in self {
38+
writer.write_all(&num.to_le_bytes())?;
4339
}
40+
Ok(())
41+
}
42+
}
4443

45-
impl FromBytes for [u16; $N] {
46-
#[inline]
47-
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
48-
let mut res = [0u16; $N];
49-
for num in res.iter_mut() {
50-
let mut bytes = [0u8; 2];
51-
reader.read_exact(&mut bytes)?;
52-
*num = u16::from_le_bytes(bytes);
53-
}
54-
Ok(res)
55-
}
44+
impl<const N: usize> FromBytes for [u16; N] {
45+
#[inline]
46+
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
47+
let mut res = [0u16; N];
48+
for num in res.iter_mut() {
49+
let mut bytes = [0u8; 2];
50+
reader.read_exact(&mut bytes)?;
51+
*num = u16::from_le_bytes(bytes);
5652
}
53+
Ok(res)
54+
}
55+
}
5756

58-
impl ToBytes for [u32; $N] {
59-
#[inline]
60-
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
61-
for num in self {
62-
writer.write_all(&num.to_le_bytes())?;
63-
}
64-
Ok(())
65-
}
57+
impl<const N: usize> ToBytes for [u32; N] {
58+
#[inline]
59+
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
60+
for num in self {
61+
writer.write_all(&num.to_le_bytes())?;
6662
}
63+
Ok(())
64+
}
65+
}
6766

68-
impl FromBytes for [u32; $N] {
69-
#[inline]
70-
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
71-
let mut res = [0u32; $N];
72-
for num in res.iter_mut() {
73-
let mut bytes = [0u8; 4];
74-
reader.read_exact(&mut bytes)?;
75-
*num = u32::from_le_bytes(bytes);
76-
}
77-
Ok(res)
78-
}
67+
impl<const N: usize> FromBytes for [u32; N] {
68+
#[inline]
69+
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
70+
let mut res = [0u32; N];
71+
for num in res.iter_mut() {
72+
let mut bytes = [0u8; 4];
73+
reader.read_exact(&mut bytes)?;
74+
*num = u32::from_le_bytes(bytes);
7975
}
76+
Ok(res)
77+
}
78+
}
8079

81-
impl ToBytes for [u64; $N] {
82-
#[inline]
83-
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
84-
for num in self {
85-
writer.write_all(&num.to_le_bytes())?;
86-
}
87-
Ok(())
88-
}
80+
impl<const N: usize> ToBytes for [u64; N] {
81+
#[inline]
82+
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
83+
for num in self {
84+
writer.write_all(&num.to_le_bytes())?;
8985
}
86+
Ok(())
87+
}
88+
}
9089

91-
impl FromBytes for [u64; $N] {
92-
#[inline]
93-
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
94-
let mut res = [0u64; $N];
95-
for num in res.iter_mut() {
96-
let mut bytes = [0u8; 8];
97-
reader.read_exact(&mut bytes)?;
98-
*num = u64::from_le_bytes(bytes);
99-
}
100-
Ok(res)
101-
}
90+
impl<const N: usize>FromBytes for [u64; N] {
91+
#[inline]
92+
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
93+
let mut res = [0u64; N];
94+
for num in res.iter_mut() {
95+
let mut bytes = [0u8; 8];
96+
reader.read_exact(&mut bytes)?;
97+
*num = u64::from_le_bytes(bytes);
10298
}
99+
Ok(res)
100+
}
101+
}
103102

104-
impl ToBytes for [u128; $N] {
105-
#[inline]
106-
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
107-
for num in self {
108-
writer.write_all(&num.to_le_bytes())?;
109-
}
110-
Ok(())
111-
}
103+
impl<const N: usize> ToBytes for [u128; N] {
104+
#[inline]
105+
fn write<W: Write>(&self, mut writer: W) -> IoResult<()> {
106+
for num in self {
107+
writer.write_all(&num.to_le_bytes())?;
112108
}
109+
Ok(())
110+
}
111+
}
113112

114-
impl FromBytes for [u128; $N] {
115-
#[inline]
116-
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
117-
let mut res = [0u128; $N];
118-
for num in res.iter_mut() {
119-
let mut bytes = [0u8; 16];
120-
reader.read_exact(&mut bytes)?;
121-
*num = u128::from_le_bytes(bytes);
122-
}
123-
Ok(res)
124-
}
113+
impl<const N: usize> FromBytes for [u128; N] {
114+
#[inline]
115+
fn read<R: Read>(mut reader: R) -> IoResult<Self> {
116+
let mut res = [0u128; N];
117+
for num in res.iter_mut() {
118+
let mut bytes = [0u8; 16];
119+
reader.read_exact(&mut bytes)?;
120+
*num = u128::from_le_bytes(bytes);
125121
}
126-
};
127-
}
128-
129-
array_bytes!(0);
130-
array_bytes!(1);
131-
array_bytes!(2);
132-
array_bytes!(3);
133-
array_bytes!(4);
134-
array_bytes!(5);
135-
array_bytes!(6);
136-
array_bytes!(7);
137-
array_bytes!(8);
138-
array_bytes!(9);
139-
array_bytes!(10);
140-
array_bytes!(11);
141-
array_bytes!(12);
142-
array_bytes!(13);
143-
array_bytes!(14);
144-
array_bytes!(15);
145-
array_bytes!(16);
146-
array_bytes!(17);
147-
array_bytes!(18);
148-
array_bytes!(19);
149-
array_bytes!(20);
150-
array_bytes!(21);
151-
array_bytes!(22);
152-
array_bytes!(23);
153-
array_bytes!(24);
154-
array_bytes!(25);
155-
array_bytes!(26);
156-
array_bytes!(27);
157-
array_bytes!(28);
158-
array_bytes!(29);
159-
array_bytes!(30);
160-
array_bytes!(31);
161-
array_bytes!(32);
122+
Ok(res)
123+
}
124+
}
162125

163126
/// Takes as input a sequence of structs, and converts them to a series of
164127
/// bytes. All traits that implement `Bytes` can be automatically converted to

0 commit comments

Comments
 (0)