#![allow(missing_docs)] use core::mem::{self, MaybeUninit}; use core::ptr::NonNull; use core::str; // ABI compatible with C++ rust::Str (not necessarily &str). #[repr(C)] pub struct RustStr { repr: [MaybeUninit; mem::size_of::>() / mem::size_of::()], } impl RustStr { pub fn from(repr: &str) -> Self { let repr = NonNull::from(repr); unsafe { mem::transmute::, RustStr>(repr) } } pub unsafe fn as_str<'a>(self) -> &'a str { unsafe { let repr = mem::transmute::>(self); &*repr.as_ptr() } } } const_assert_eq!(mem::size_of::>(), mem::size_of::()); const_assert_eq!(mem::align_of::>(), mem::align_of::());