| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame^] | 1 | use core::mem; |
| 2 | use core::ptr::NonNull; |
| 3 | use core::slice; |
| 4 | |
| 5 | // Not necessarily ABI compatible with &[T]. Codegen performs the translation. |
| 6 | #[repr(C)] |
| 7 | #[derive(Copy, Clone)] |
| 8 | pub struct RustSlice { |
| 9 | pub(crate) ptr: NonNull<()>, |
| 10 | pub(crate) len: usize, |
| 11 | } |
| 12 | |
| 13 | impl RustSlice { |
| 14 | pub fn from_ref<T>(s: &[T]) -> Self { |
| 15 | RustSlice { |
| 16 | ptr: NonNull::from(s).cast::<()>(), |
| 17 | len: s.len(), |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | pub fn from_mut<T>(s: &mut [T]) -> Self { |
| 22 | RustSlice { |
| 23 | len: s.len(), |
| 24 | ptr: NonNull::from(s).cast::<()>(), |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | pub unsafe fn as_slice<'a, T>(self) -> &'a [T] { |
| 29 | slice::from_raw_parts(self.ptr.as_ptr().cast::<T>(), self.len) |
| 30 | } |
| 31 | |
| 32 | pub unsafe fn as_mut_slice<'a, T>(self) -> &'a mut [T] { |
| 33 | slice::from_raw_parts_mut(self.ptr.as_ptr().cast::<T>(), self.len) |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | const_assert_eq!( |
| 38 | mem::size_of::<Option<RustSlice>>(), |
| 39 | mem::size_of::<RustSlice>(), |
| 40 | ); |