aboutsummaryrefslogtreecommitdiff
path: root/src/rust_str.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rust_str.rs')
-rw-r--r--src/rust_str.rs17
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>());