1 #![allow(missing_docs)] 2 3 use core::mem::{self, MaybeUninit}; 4 use core::ptr::NonNull; 5 use core::str; 6 7 // ABI compatible with C++ rust::Str (not necessarily &str). 8 #[repr(C)] 9 pub struct RustStr { 10 repr: [MaybeUninit<usize>; mem::size_of::<NonNull<str>>() / mem::size_of::<usize>()], 11 } 12 13 impl RustStr { from(repr: &str) -> Self14 pub fn from(repr: &str) -> Self { 15 let repr = NonNull::from(repr); 16 unsafe { mem::transmute::<NonNull<str>, RustStr>(repr) } 17 } 18 as_str<'a>(self) -> &'a str19 pub unsafe fn as_str<'a>(self) -> &'a str { 20 unsafe { 21 let repr = mem::transmute::<RustStr, NonNull<str>>(self); 22 &*repr.as_ptr() 23 } 24 } 25 } 26 27 const_assert_eq!(mem::size_of::<NonNull<str>>(), mem::size_of::<RustStr>()); 28 const_assert_eq!(mem::align_of::<NonNull<str>>(), mem::align_of::<RustStr>()); 29