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