diff options
Diffstat (limited to 'src/rust_str.rs')
-rw-r--r-- | src/rust_str.rs | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/rust_str.rs b/src/rust_str.rs index 9bc26145..b1b46e3e 100644 --- a/src/rust_str.rs +++ b/src/rust_str.rs @@ -1,21 +1,28 @@ -use core::mem; +#![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: NonNull<str>, + repr: [MaybeUninit<usize>; mem::size_of::<NonNull<str>>() / mem::size_of::<usize>()], } impl RustStr { pub fn from(repr: &str) -> Self { let repr = NonNull::from(repr); - RustStr { repr } + unsafe { mem::transmute::<NonNull<str>, RustStr>(repr) } } pub unsafe fn as_str<'a>(self) -> &'a str { - &*self.repr.as_ptr() + unsafe { + let repr = mem::transmute::<RustStr, NonNull<str>>(self); + &*repr.as_ptr() + } } } -const_assert_eq!(mem::size_of::<Option<RustStr>>(), mem::size_of::<RustStr>()); +const_assert_eq!(mem::size_of::<NonNull<str>>(), mem::size_of::<RustStr>()); +const_assert_eq!(mem::align_of::<NonNull<str>>(), mem::align_of::<RustStr>()); |