blob: 8a5e74b3f6427f7b1f00b24773ea2cc6ab76485f [file] [log] [blame]
David Tolnay5515a9e2020-11-25 19:07:54 -08001use core::mem;
2use core::ptr::NonNull;
3use core::slice;
4
5// Not necessarily ABI compatible with &[T]. Codegen performs the translation.
6#[repr(C)]
7#[derive(Copy, Clone)]
8pub struct RustSlice {
9 pub(crate) ptr: NonNull<()>,
10 pub(crate) len: usize,
11}
12
13impl 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
37const_assert_eq!(
38 mem::size_of::<Option<RustSlice>>(),
39 mem::size_of::<RustSlice>(),
40);