Skip to content

Commit

Permalink
Fix error in impl Value for [T; N] and update tests for API change
Browse files Browse the repository at this point in the history
  • Loading branch information
korken89 committed Aug 5, 2024
1 parent 04ddde4 commit 37519cc
Showing 1 changed file with 36 additions and 34 deletions.
70 changes: 36 additions & 34 deletions src/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
//! For your convenience there are premade implementations for the [Key] and [Value] traits.
//!

use core::mem::MaybeUninit;
use core::mem::{size_of, MaybeUninit};

use embedded_storage_async::nor_flash::MultiwriteNorFlash;

Expand Down Expand Up @@ -688,7 +688,7 @@ macro_rules! impl_key_num {
($int:ty) => {
impl Key for $int {
fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
let len = core::mem::size_of::<Self>();
let len = size_of::<Self>();
if buffer.len() < len {
return Err(SerializationError::BufferTooSmall);
}
Expand All @@ -697,19 +697,19 @@ macro_rules! impl_key_num {
}

fn deserialize_from(buffer: &[u8]) -> Result<(Self, usize), SerializationError> {
let len = core::mem::size_of::<Self>();
let len = size_of::<Self>();
if buffer.len() < len {
return Err(SerializationError::BufferTooSmall);
}

Ok((
Self::from_le_bytes(buffer[..len].try_into().unwrap()),
core::mem::size_of::<Self>(),
size_of::<Self>(),
))
}

fn get_len(_buffer: &[u8]) -> Result<usize, SerializationError> {
Ok(core::mem::size_of::<Self>())
Ok(size_of::<Self>())
}
}
};
Expand Down Expand Up @@ -767,24 +767,6 @@ pub trait Value<'a> {
Self: Sized;
}

impl<'a> Value<'a> for &'a [u8] {
fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
if buffer.len() < self.len() {
return Err(SerializationError::BufferTooSmall);
}

buffer[..self.len()].copy_from_slice(self);
Ok(self.len())
}

fn deserialize_from(buffer: &'a [u8]) -> Result<Self, SerializationError>
where
Self: Sized,
{
Ok(buffer)
}
}

impl<'a> Value<'a> for bool {
fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
<u8 as Value>::serialize_into(&(*self as u8), buffer)
Expand Down Expand Up @@ -822,9 +804,13 @@ impl<'a, T: Value<'a>> Value<'a> for Option<T> {

impl<'a, T: Value<'a>, const N: usize> Value<'a> for [T; N] {
fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
if buffer.len() < size_of::<T>() * N {
return Err(SerializationError::BufferTooSmall);
}

let mut size = 0;
for v in self {
size += <T as Value>::serialize_into(v, buffer)?;
size += <T as Value>::serialize_into(v, &mut buffer[size..])?;
}

Ok(size)
Expand All @@ -841,24 +827,40 @@ impl<'a, T: Value<'a>, const N: usize> Value<'a> for [T; N] {
return Ok(unsafe { array.assume_init() });
}

let mut ptr = array.as_mut_ptr() as *mut T;
let ptr = array.as_mut_ptr() as *mut T;

// SAFETY:
// 1. The pointers are all inside the array via knowing `N`.
// 2. `ptr.add(1)` does never point outside the array.
// 3. `MaybeUninit::assume_init` is upheld with all values being filled.
unsafe {
for _ in 0..N - 1 {
*ptr = <T as Value>::deserialize_from(buffer)?;
ptr = ptr.add(1);
for i in 0..N {
*ptr.add(i) = <T as Value>::deserialize_from(&buffer[i * size_of::<T>()..])?;
}
*ptr = <T as Value>::deserialize_from(buffer)?;

Ok(array.assume_init())
}
}
}

impl<'a> Value<'a> for &'a [u8] {
fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
if buffer.len() < self.len() {
return Err(SerializationError::BufferTooSmall);
}

buffer[..self.len()].copy_from_slice(self);
Ok(self.len())
}

fn deserialize_from(buffer: &'a [u8]) -> Result<Self, SerializationError>
where
Self: Sized,
{
Ok(buffer)
}
}

macro_rules! impl_map_item_num {
($int:ty) => {
impl<'a> Value<'a> for $int {
Expand Down Expand Up @@ -1082,7 +1084,7 @@ mod tests {
&mut cache::NoCache::new(),
&mut data_buffer,
&0u8,
&[5],
&[5u8],
)
.await
.unwrap();
Expand All @@ -1092,7 +1094,7 @@ mod tests {
&mut cache::NoCache::new(),
&mut data_buffer,
&0u8,
&[5, 6],
&[5u8, 6],
)
.await
.unwrap();
Expand All @@ -1115,7 +1117,7 @@ mod tests {
&mut cache::NoCache::new(),
&mut data_buffer,
&1u8,
&[2, 2, 2, 2, 2, 2],
&[2u8, 2, 2, 2, 2, 2],
)
.await
.unwrap();
Expand Down Expand Up @@ -1504,7 +1506,7 @@ mod tests {
&mut cache::NoCache::new(),
&mut [0; 1024],
&0u8,
&[0; 1024 - 4 * 2 - 8 - 1],
&[0u8; 1024 - 4 * 2 - 8 - 1],
)
.await
.unwrap();
Expand All @@ -1516,7 +1518,7 @@ mod tests {
&mut cache::NoCache::new(),
&mut [0; 1024],
&0u8,
&[0; 1024 - 4 * 2 - 8 - 1 + 1],
&[0u8; 1024 - 4 * 2 - 8 - 1 + 1],
)
.await,
Err(Error::ItemTooBig)
Expand Down

0 comments on commit 37519cc

Please sign in to comment.