blob: b4b5f2cb04947532a991dd2647e48f31a7ce1c6f [file] [log] [blame]
David Tolnay5515a9e2020-11-25 19:07:54 -08001use core::mem;
David Tolnay9bffb932021-01-02 02:15:21 -08002use core::ptr::{self, NonNull};
David Tolnay5515a9e2020-11-25 19:07:54 -08003use core::slice;
4
David Tolnay5515a9e2020-11-25 19:07:54 -08005#[repr(C)]
David Tolnay5515a9e2020-11-25 19:07:54 -08006pub struct RustSlice {
David Tolnay9bffb932021-01-02 02:15:21 -08007 pub(crate) repr: NonNull<[()]>,
David Tolnay5515a9e2020-11-25 19:07:54 -08008}
9
10impl RustSlice {
David Tolnay9bffb932021-01-02 02:15:21 -080011 pub fn from_ref<T>(slice: &[T]) -> Self {
12 let ptr = ptr::slice_from_raw_parts::<()>(slice.as_ptr().cast(), slice.len());
David Tolnay5515a9e2020-11-25 19:07:54 -080013 RustSlice {
David Tolnay9bffb932021-01-02 02:15:21 -080014 repr: unsafe { NonNull::new_unchecked(ptr as *mut _) },
David Tolnay5515a9e2020-11-25 19:07:54 -080015 }
16 }
17
David Tolnay9bffb932021-01-02 02:15:21 -080018 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 Tolnay5515a9e2020-11-25 19:07:54 -080020 RustSlice {
David Tolnay9bffb932021-01-02 02:15:21 -080021 repr: unsafe { NonNull::new_unchecked(ptr) },
David Tolnay5515a9e2020-11-25 19:07:54 -080022 }
23 }
24
25 pub unsafe fn as_slice<'a, T>(self) -> &'a [T] {
David Tolnay9bffb932021-01-02 02:15:21 -080026 let ptr = self.repr.as_ptr();
27 let len = self.repr.as_ref().len();
28 slice::from_raw_parts(ptr.cast(), len)
David Tolnay5515a9e2020-11-25 19:07:54 -080029 }
30
31 pub unsafe fn as_mut_slice<'a, T>(self) -> &'a mut [T] {
David Tolnay9bffb932021-01-02 02:15:21 -080032 let ptr = self.repr.as_ptr();
33 let len = self.repr.as_ref().len();
34 slice::from_raw_parts_mut(ptr.cast(), len)
David Tolnay5515a9e2020-11-25 19:07:54 -080035 }
36}
37
38const_assert_eq!(
39 mem::size_of::<Option<RustSlice>>(),
40 mem::size_of::<RustSlice>(),
41);