blob: 9bc2614599005c72ff92e55461c0e7d0332000ef [file] [log] [blame]
David Tolnay3384c142020-09-14 00:26:47 -04001use core::mem;
2use core::ptr::NonNull;
David Tolnay3384c142020-09-14 00:26:47 -04003use core::str;
David Tolnay7db73692019-10-20 14:51:12 -04004
David Tolnay7db73692019-10-20 14:51:12 -04005#[repr(C)]
David Tolnay7db73692019-10-20 14:51:12 -04006pub struct RustStr {
David Tolnay1202de52021-01-02 01:26:33 -08007 repr: NonNull<str>,
David Tolnay7db73692019-10-20 14:51:12 -04008}
9
10impl RustStr {
David Tolnay1202de52021-01-02 01:26:33 -080011 pub fn from(repr: &str) -> Self {
12 let repr = NonNull::from(repr);
13 RustStr { repr }
David Tolnay7db73692019-10-20 14:51:12 -040014 }
15
16 pub unsafe fn as_str<'a>(self) -> &'a str {
David Tolnay1202de52021-01-02 01:26:33 -080017 &*self.repr.as_ptr()
David Tolnay7db73692019-10-20 14:51:12 -040018 }
19}
20
David Tolnayad7186a2020-04-24 15:37:45 -070021const_assert_eq!(mem::size_of::<Option<RustStr>>(), mem::size_of::<RustStr>());