# HG changeset patch # User Sunil Nimmagadda # Date 1706786505 -19800 # Node ID 72c4d898c478d90b9ba122cee72a03a8bf084410 # Parent b45e6310310e3d9f1256be9aa23bf35047622110 Move to as_chunks. Fuzz testing needs a nightly, so let's move to nightly everywhere. diff -r b45e6310310e -r 72c4d898c478 src/lib.rs --- a/src/lib.rs Wed Jan 31 14:39:06 2024 +0530 +++ b/src/lib.rs Thu Feb 01 16:51:45 2024 +0530 @@ -1,1 +1,2 @@ +#![feature(slice_as_chunks)] pub mod vrrpv2; diff -r b45e6310310e -r 72c4d898c478 src/vrrpv2.rs --- a/src/vrrpv2.rs Wed Jan 31 14:39:06 2024 +0530 +++ b/src/vrrpv2.rs Thu Feb 01 16:51:45 2024 +0530 @@ -163,16 +163,13 @@ Ok(vrrpv2) } -/// TODO: as_chunks is nicer but not stabilised yet. fn checksum(bytes: &[u8]) -> u16 { - let mut sum: u32 = 0; - for chunk in bytes.chunks(2) { - // Left over byte if any - if chunk.len() == 1 { - sum += u32::from(chunk[0]); - } else { - sum += u32::from(u16::from_be_bytes(chunk.try_into().unwrap())); - } + let (chunks, remainder) = bytes.as_chunks::<2>(); + let mut sum = chunks + .iter() + .fold(0, |acc, x| acc + u32::from(u16::from_be_bytes(*x))); + if !remainder.is_empty() { + sum += u32::from(remainder[0]); } while (sum >> 16) > 0 { sum = (sum & 0xffff) + (sum >> 16);