| David Tolnay | 3384c14 | 2020-09-14 00:26:47 -0400 | [diff] [blame] | 1 | use core::mem; |
| 2 | use core::ptr::NonNull; |
| 3 | use core::slice; |
| Adrian Taylor | f5dd552 | 2020-04-13 16:50:14 -0700 | [diff] [blame] | 4 | |
| 5 | // Not necessarily ABI compatible with &[u8]. Codegen performs the translation. |
| 6 | #[repr(C)] |
| 7 | #[derive(Copy, Clone)] |
| 8 | pub struct RustSliceU8 { |
| 9 | pub(crate) ptr: NonNull<u8>, |
| 10 | pub(crate) len: usize, |
| 11 | } |
| 12 | |
| 13 | impl RustSliceU8 { |
| 14 | pub fn from(s: &[u8]) -> Self { |
| 15 | RustSliceU8 { |
| 16 | ptr: NonNull::from(s).cast::<u8>(), |
| 17 | len: s.len(), |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | pub unsafe fn as_slice<'a>(self) -> &'a [u8] { |
| 22 | slice::from_raw_parts(self.ptr.as_ptr(), self.len) |
| 23 | } |
| 24 | } |
| 25 | |
| David Tolnay | e9f58d5 | 2020-04-24 17:44:58 -0700 | [diff] [blame] | 26 | const_assert_eq!( |
| 27 | mem::size_of::<Option<RustSliceU8>>(), |
| 28 | mem::size_of::<RustSliceU8>(), |
| 29 | ); |