blob: 32f8798bd41501932c880269fcb18ec654a7520c [file] [log] [blame]
David Tolnay3384c142020-09-14 00:26:47 -04001use core::mem;
2use core::ptr::NonNull;
3use core::slice;
Adrian Taylorf5dd5522020-04-13 16:50:14 -07004
5// Not necessarily ABI compatible with &[u8]. Codegen performs the translation.
6#[repr(C)]
7#[derive(Copy, Clone)]
8pub struct RustSliceU8 {
9 pub(crate) ptr: NonNull<u8>,
10 pub(crate) len: usize,
11}
12
13impl 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 Tolnaye9f58d52020-04-24 17:44:58 -070026const_assert_eq!(
27 mem::size_of::<Option<RustSliceU8>>(),
28 mem::size_of::<RustSliceU8>(),
29);