• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![allow(missing_docs)]
2 
3 use core::mem::{self, MaybeUninit};
4 use core::ptr::NonNull;
5 use core::str;
6 
7 // ABI compatible with C++ rust::Str (not necessarily &str).
8 #[repr(C)]
9 pub struct RustStr {
10     repr: [MaybeUninit<usize>; mem::size_of::<NonNull<str>>() / mem::size_of::<usize>()],
11 }
12 
13 impl RustStr {
from(repr: &str) -> Self14     pub fn from(repr: &str) -> Self {
15         let repr = NonNull::from(repr);
16         unsafe { mem::transmute::<NonNull<str>, RustStr>(repr) }
17     }
18 
as_str<'a>(self) -> &'a str19     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 
27 const_assert_eq!(mem::size_of::<NonNull<str>>(), mem::size_of::<RustStr>());
28 const_assert_eq!(mem::align_of::<NonNull<str>>(), mem::align_of::<RustStr>());
29