diff --git a/src/lib.rs b/src/lib.rs index 4958354..45ab6fb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -133,6 +133,15 @@ pub const fn Aligned(value: T) -> Aligned { } } +impl From for Aligned +where + A: Alignment, +{ + fn from(value: T) -> Self { + Aligned(value) + } +} + impl ops::Deref for Aligned where A: Alignment, @@ -297,6 +306,42 @@ where } } +impl AsRef> for Aligned +where + A: Alignment, +{ + fn as_ref(&self) -> &Aligned { + self + } +} + +impl AsMut> for Aligned +where + A: Alignment, +{ + fn as_mut(&mut self) -> &mut Aligned { + self + } +} + +impl AsRef<[T]> for Aligned +where + A: Alignment, +{ + fn as_ref(&self) -> &[T] { + &self.value[..] + } +} + +impl AsMut<[T]> for Aligned +where + A: Alignment, +{ + fn as_mut(&mut self) -> &mut [T] { + &mut self.value[..] + } +} + impl AsSlice for Aligned where A: Alignment, @@ -989,3 +1034,25 @@ fn test_range_from_out_of_bounds() { let a: &Aligned = &Aligned::([0u8; 4]); let _ = &a[6..]; } + +#[test] +fn test_from() { + let a: Aligned = [1, 2, 3].into(); + assert_eq!(*a, [1, 2, 3]); + assert_eq!(core::mem::align_of_val(&a), 4); +} + +#[test] +fn array_as_ref() { + let array = Aligned::([1, 2, 3]); + let slice: &[u8] = array.as_ref(); + assert_eq!(slice.as_ptr(), array.as_ptr()); +} + +#[test] +fn array_as_mut() { + let mut array = Aligned::([1, 2, 3]); + let slice: &mut [u8] = array.as_mut(); + slice[0] = 4; + assert_eq!(slice.as_ptr(), array.as_ptr()); +}