| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 1 | use core::mem; |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 2 | use core::ptr::{self, NonNull}; |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 3 | use core::slice; |
| 4 | |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 5 | #[repr(C)] |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 6 | pub struct RustSlice { |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 7 | pub(crate) repr: NonNull<[()]>, |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 8 | } |
| 9 | |
| 10 | impl RustSlice { |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 11 | pub fn from_ref<T>(slice: &[T]) -> Self { |
| 12 | let ptr = ptr::slice_from_raw_parts::<()>(slice.as_ptr().cast(), slice.len()); |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 13 | RustSlice { |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 14 | repr: unsafe { NonNull::new_unchecked(ptr as *mut _) }, |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 15 | } |
| 16 | } |
| 17 | |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 18 | pub fn from_mut<T>(slice: &mut [T]) -> Self { |
| 19 | let ptr = ptr::slice_from_raw_parts_mut(slice.as_mut_ptr().cast(), slice.len()); |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 20 | RustSlice { |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 21 | repr: unsafe { NonNull::new_unchecked(ptr) }, |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 22 | } |
| 23 | } |
| 24 | |
| 25 | pub unsafe fn as_slice<'a, T>(self) -> &'a [T] { |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 26 | let ptr = self.repr.as_ptr(); |
| 27 | let len = self.repr.as_ref().len(); |
| 28 | slice::from_raw_parts(ptr.cast(), len) |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | pub unsafe fn as_mut_slice<'a, T>(self) -> &'a mut [T] { |
| David Tolnay | 9bffb93 | 2021-01-02 02:15:21 -0800 | [diff] [blame^] | 32 | let ptr = self.repr.as_ptr(); |
| 33 | let len = self.repr.as_ref().len(); |
| 34 | slice::from_raw_parts_mut(ptr.cast(), len) |
| David Tolnay | 5515a9e | 2020-11-25 19:07:54 -0800 | [diff] [blame] | 35 | } |
| 36 | } |
| 37 | |
| 38 | const_assert_eq!( |
| 39 | mem::size_of::<Option<RustSlice>>(), |
| 40 | mem::size_of::<RustSlice>(), |
| 41 | ); |