cxx/
rust_str.rs

1#![allow(missing_docs)]
2
3use core::mem::{self, MaybeUninit};
4use core::ptr::NonNull;
5use core::str;
6
7// ABI compatible with C++ rust::Str (not necessarily &str).
8#[repr(C)]
9pub struct RustStr {
10    repr: [MaybeUninit<usize>; mem::size_of::<NonNull<str>>() / mem::size_of::<usize>()],
11}
12
13impl RustStr {
14    pub fn from(repr: &str) -> Self {
15        let repr = NonNull::from(repr);
16        unsafe { mem::transmute::<NonNull<str>, RustStr>(repr) }
17    }
18
19    pub unsafe fn as_str<'a>(self) -> &'a str {
20        unsafe {
21            let repr = mem::transmute::<RustStr, NonNull<str>>(self);
22            &*repr.as_ptr()
23        }
24    }
25}
26
27const_assert_eq!(mem::size_of::<NonNull<str>>(), mem::size_of::<RustStr>());
28const_assert_eq!(mem::align_of::<NonNull<str>>(), mem::align_of::<RustStr>());