diff --git a/tools/kv_typed/src/as_bytes.rs b/tools/kv_typed/src/as_bytes.rs index 46e0e3f9f5ac1a451d2c89bace8a5bed76a820b3..4e79a4f8006eb12c81c00d30e95049d08b7a1196 100644 --- a/tools/kv_typed/src/as_bytes.rs +++ b/tools/kv_typed/src/as_bytes.rs @@ -61,6 +61,20 @@ where } } +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_btreeset_as_bytes() { + BTreeSet::<u64>::new().as_bytes(|bytes| assert_eq!(bytes, &[])); + } + #[test] + fn test_hashset_as_bytes() { + HashSet::<u64>::new().as_bytes(|bytes| assert_eq!(bytes, &[])); + } +} + macro_rules! impl_as_bytes_for_le_numbers { ($($T:ty),*) => {$( impl AsBytes for $T { diff --git a/tools/kv_typed/src/from_bytes.rs b/tools/kv_typed/src/from_bytes.rs index 138f9ff8cc732d972cf5f9012a22b56df234e928..5ae7245145392833eff049abd148b0fe5fb8c025 100644 --- a/tools/kv_typed/src/from_bytes.rs +++ b/tools/kv_typed/src/from_bytes.rs @@ -97,10 +97,14 @@ where type Err = LayoutVerifiedErr; fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> { - let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes) - .ok_or(LayoutVerifiedErr(stringify!(BTreeSet<T>)))?; - let slice = layout_verified.into_slice(); - Ok(slice.iter().copied().collect()) + if bytes.is_empty() { + Ok(Self::new()) + } else { + let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes) + .ok_or(LayoutVerifiedErr(stringify!(BTreeSet<T>)))?; + let slice = layout_verified.into_slice(); + Ok(slice.iter().copied().collect()) + } } } @@ -111,10 +115,14 @@ where type Err = LayoutVerifiedErr; fn from_bytes(bytes: &[u8]) -> Result<Self, Self::Err> { - let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes) - .ok_or(LayoutVerifiedErr(stringify!(HashSet<T>)))?; - let slice = layout_verified.into_slice(); - Ok(slice.iter().copied().collect()) + if bytes.is_empty() { + Ok(Self::new()) + } else { + let layout_verified = zerocopy::LayoutVerified::<_, [T]>::new_slice(bytes) + .ok_or(LayoutVerifiedErr(stringify!(HashSet<T>)))?; + let slice = layout_verified.into_slice(); + Ok(slice.iter().copied().collect()) + } } } @@ -125,3 +133,25 @@ impl FromBytes for IVec { Ok(Self::from(bytes)) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_btreeset_from_bytes() -> Result<(), LayoutVerifiedErr> { + assert_eq!( + <BTreeSet<u64> as FromBytes>::from_bytes(&[])?, + BTreeSet::<u64>::new() + ); + Ok(()) + } + #[test] + fn test_hashset_from_bytes() -> Result<(), LayoutVerifiedErr> { + assert_eq!( + <HashSet<u64> as FromBytes>::from_bytes(&[])?, + HashSet::<u64>::new() + ); + Ok(()) + } +} diff --git a/tools/kv_typed/tests/test_db_schema.rs b/tools/kv_typed/tests/test_db_schema.rs index c312ce200d8316eb3b37f129e456a16c0d5bf296..dead76e10825e0992a0081bac6a1700171274824 100644 --- a/tools/kv_typed/tests/test_db_schema.rs +++ b/tools/kv_typed/tests/test_db_schema.rs @@ -116,6 +116,11 @@ fn test_db<B: Backend>(db: &TestV1Db<B>) -> KvResult<()> { })?; // Test get_ref_slice + db.col4_write().upsert(U64BE(3), BTreeSet::new())?; + db.col4().get_ref_slice(&U64BE(3), |numbers| { + assert_eq!(numbers, &[]); + Ok(()) + })?; db.col4_write() .upsert(U64BE(4), (&[3, 2, 4, 1]).iter().copied().collect())?; db.col4().get_ref_slice(&U64BE(4), |numbers| {