Skip to content

Commit b63becd

Browse files
committed
Implement versionize for arrays via const generics
Signed-off-by: Patrick Roy <[email protected]>
1 parent 732eb81 commit b63becd

File tree

1 file changed

+31
-53
lines changed

1 file changed

+31
-53
lines changed

src/primitives.rs

+31-53
Original file line numberDiff line numberDiff line change
@@ -114,66 +114,44 @@ impl Versionize for String {
114114
1
115115
}
116116
}
117+
118+
impl<T, const N: usize> Versionize for [T; N]
119+
where
120+
T: Copy + Default + Versionize,
121+
{
122+
#[inline]
123+
fn serialize<W: std::io::Write>(
124+
&self,
125+
writer: &mut W,
126+
version_map: &VersionMap,
127+
app_version: u16,
128+
) -> VersionizeResult<()> {
129+
for element in self {
130+
element.serialize(writer, version_map, app_version)?;
131+
}
117132

118-
macro_rules! impl_versionize_array_with_size {
119-
($ty:literal) => {
120-
impl<T> Versionize for [T; $ty]
121-
where
122-
T: Copy + Default + Versionize,
123-
{
124-
#[inline]
125-
fn serialize<W: std::io::Write>(
126-
&self,
127-
writer: &mut W,
128-
version_map: &VersionMap,
129-
app_version: u16,
130-
) -> VersionizeResult<()> {
131-
for element in self {
132-
element.serialize(writer, version_map, app_version)?;
133-
}
134-
135-
Ok(())
136-
}
137-
138-
#[inline]
139-
fn deserialize<R: std::io::Read>(
140-
reader: &mut R,
141-
version_map: &VersionMap,
142-
app_version: u16,
143-
) -> VersionizeResult<Self> {
144-
let mut array = [T::default(); $ty];
145-
for i in 0..$ty {
146-
array[i] = T::deserialize(reader, version_map, app_version)?;
147-
}
148-
Ok(array)
149-
}
133+
Ok(())
134+
}
150135

151-
// Not used yet.
152-
fn version() -> u16 {
153-
1
154-
}
136+
#[inline]
137+
fn deserialize<R: std::io::Read>(
138+
reader: &mut R,
139+
version_map: &VersionMap,
140+
app_version: u16,
141+
) -> VersionizeResult<Self> {
142+
let mut array = [T::default(); N];
143+
for i in 0..N {
144+
array[i] = T::deserialize(reader, version_map, app_version)?;
155145
}
156-
};
157-
}
146+
Ok(array)
147+
}
158148

159-
// Conventionally, traits are available for primitive arrays only up to size 32
160-
// until the const generics feature is implemented.
161-
// [https://doc.rust-lang.org/std/primitive.array.html]
162-
// [https://github.com/rust-lang/rust/issues/44580]
163-
macro_rules! impl_versionize_arrays {
164-
($($N:literal)+) => {
165-
$(
166-
impl_versionize_array_with_size!($N);
167-
)+
149+
// Not used yet.
150+
fn version() -> u16 {
151+
1
168152
}
169153
}
170154

171-
impl_versionize_arrays! {
172-
1 2 3 4 5 6 7 8 9 10
173-
11 12 13 14 15 16 17 18 19 20
174-
21 22 23 24 25 26 27 28 29 30
175-
31 32
176-
}
177155

178156
impl<T> Versionize for Box<T>
179157
where

0 commit comments

Comments
 (0)