blob: 38e5cabf2ae131461ab562205edbc3b8e9b49740 [file] [log] [blame]
use core::mem;
use core::ptr::NonNull;
use core::slice;
use core::str;
// Not necessarily ABI compatible with &str. Codegen performs the translation.
#[repr(C)]
#[derive(Copy, Clone)]
pub struct RustStr {
pub(crate) ptr: NonNull<u8>,
pub(crate) len: usize,
}
impl RustStr {
pub fn from(s: &str) -> Self {
RustStr {
ptr: NonNull::from(s).cast::<u8>(),
len: s.len(),
}
}
pub unsafe fn as_str<'a>(self) -> &'a str {
let slice = slice::from_raw_parts(self.ptr.as_ptr(), self.len);
str::from_utf8_unchecked(slice)
}
}
const_assert_eq!(mem::size_of::<Option<RustStr>>(), mem::size_of::<RustStr>());