diff options
Diffstat (limited to 'vendor/cxx/src/rust_str.rs')
-rw-r--r-- | vendor/cxx/src/rust_str.rs | 28 |
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>()); |