summaryrefslogtreecommitdiffstats
path: root/vendor/cxx/src/rust_str.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/cxx/src/rust_str.rs')
-rw-r--r--vendor/cxx/src/rust_str.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/vendor/cxx/src/rust_str.rs b/vendor/cxx/src/rust_str.rs
new file mode 100644
index 000000000..b1b46e3e9
--- /dev/null
+++ b/vendor/cxx/src/rust_str.rs
@@ -0,0 +1,28 @@
+#![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<usize>; mem::size_of::<NonNull<str>>() / mem::size_of::<usize>()],
+}
+
+impl RustStr {
+ pub fn from(repr: &str) -> Self {
+ let repr = NonNull::from(repr);
+ unsafe { mem::transmute::<NonNull<str>, RustStr>(repr) }
+ }
+
+ pub unsafe fn as_str<'a>(self) -> &'a str {
+ unsafe {
+ let repr = mem::transmute::<RustStr, NonNull<str>>(self);
+ &*repr.as_ptr()
+ }
+ }
+}
+
+const_assert_eq!(mem::size_of::<NonNull<str>>(), mem::size_of::<RustStr>());
+const_assert_eq!(mem::align_of::<NonNull<str>>(), mem::align_of::<RustStr>());