133d722a9Sopenharmony_ci#![allow(missing_docs)] 233d722a9Sopenharmony_ci 333d722a9Sopenharmony_ciuse core::mem::{self, MaybeUninit}; 433d722a9Sopenharmony_ciuse core::ptr::NonNull; 533d722a9Sopenharmony_ciuse core::str; 633d722a9Sopenharmony_ci 733d722a9Sopenharmony_ci// ABI compatible with C++ rust::Str (not necessarily &str). 833d722a9Sopenharmony_ci#[repr(C)] 933d722a9Sopenharmony_cipub struct RustStr { 1033d722a9Sopenharmony_ci repr: [MaybeUninit<usize>; mem::size_of::<NonNull<str>>() / mem::size_of::<usize>()], 1133d722a9Sopenharmony_ci} 1233d722a9Sopenharmony_ci 1333d722a9Sopenharmony_ciimpl RustStr { 1433d722a9Sopenharmony_ci pub fn from(repr: &str) -> Self { 1533d722a9Sopenharmony_ci let repr = NonNull::from(repr); 1633d722a9Sopenharmony_ci unsafe { mem::transmute::<NonNull<str>, RustStr>(repr) } 1733d722a9Sopenharmony_ci } 1833d722a9Sopenharmony_ci 1933d722a9Sopenharmony_ci pub unsafe fn as_str<'a>(self) -> &'a str { 2033d722a9Sopenharmony_ci unsafe { 2133d722a9Sopenharmony_ci let repr = mem::transmute::<RustStr, NonNull<str>>(self); 2233d722a9Sopenharmony_ci &*repr.as_ptr() 2333d722a9Sopenharmony_ci } 2433d722a9Sopenharmony_ci } 2533d722a9Sopenharmony_ci} 2633d722a9Sopenharmony_ci 2733d722a9Sopenharmony_ciconst_assert_eq!(mem::size_of::<NonNull<str>>(), mem::size_of::<RustStr>()); 2833d722a9Sopenharmony_ciconst_assert_eq!(mem::align_of::<NonNull<str>>(), mem::align_of::<RustStr>()); 29