diff --git a/src/features/impl_alloc.rs b/src/features/impl_alloc.rs index 62449fb..47146b3 100644 --- a/src/features/impl_alloc.rs +++ b/src/features/impl_alloc.rs @@ -435,6 +435,26 @@ where } } +impl Decode for Rc<[T]> +where + T: Decode, +{ + fn decode(decoder: &mut D) -> Result { + let vec = Vec::decode(decoder)?; + Ok(vec.into()) + } +} + +impl<'de, T> BorrowDecode<'de> for Rc<[T]> +where + T: BorrowDecode<'de> + 'de, +{ + fn borrow_decode>(decoder: &mut D) -> Result { + let vec = Vec::borrow_decode(decoder)?; + Ok(vec.into()) + } +} + #[cfg(target_has_atomic = "ptr")] impl Decode for Arc where @@ -482,3 +502,25 @@ where T::encode(self, encoder) } } + +#[cfg(target_has_atomic = "ptr")] +impl Decode for Arc<[T]> +where + T: Decode, +{ + fn decode(decoder: &mut D) -> Result { + let vec = Vec::decode(decoder)?; + Ok(vec.into()) + } +} + +#[cfg(target_has_atomic = "ptr")] +impl<'de, T> BorrowDecode<'de> for Arc<[T]> +where + T: BorrowDecode<'de> + 'de, +{ + fn borrow_decode>(decoder: &mut D) -> Result { + let vec = Vec::borrow_decode(decoder)?; + Ok(vec.into()) + } +} diff --git a/tests/alloc.rs b/tests/alloc.rs index b308605..0a69c07 100644 --- a/tests/alloc.rs +++ b/tests/alloc.rs @@ -89,9 +89,12 @@ fn test_alloc_commons() { { // Serde doesn't support Rc or Arc the_same(Rc::::new(5)); + the_same(Rc::<[u32]>::from(vec![1, 2, 3, 4, 5])); + #[cfg(target_has_atomic = "ptr")] { the_same(Arc::::new(5)); + the_same(Arc::<[u32]>::from(vec![1, 2, 3, 4, 5])); } }