diff --git a/ptr_meta/example.md b/ptr_meta/example.md index 691d630..f446caa 100644 --- a/ptr_meta/example.md +++ b/ptr_meta/example.md @@ -8,7 +8,7 @@ assert_eq!(ptr_meta::metadata(slice), slice.len()); // Make your own wide pointers from data pointers and metadata let bytes = [b'h', b'e', b'l', b'l', b'o']; -let ptr = ptr_meta::from_raw_parts::(bytes.as_ptr().cast(), 5); +let ptr = ptr_meta::from_raw_parts::(bytes.as_ptr(), 5); println!("{} world!", unsafe { &*ptr }); // prints "hello world!" // Derive Pointee on your own types @@ -24,7 +24,7 @@ impl CoolStr { } } -let ptr = ptr_meta::from_raw_parts::(bytes.as_ptr().cast(), 5); +let ptr = ptr_meta::from_raw_parts::(bytes.as_ptr(), 5); let cool = unsafe { &*ptr }; cool.print_cool(); // prints "😎 hello 😎" @@ -43,7 +43,7 @@ impl Printable for i32 { let i32_vtable = ptr_meta::metadata(&0i32 as &dyn Printable); let one_hundred = 100i32; let printable = ptr_meta::from_raw_parts::( - (&one_hundred as *const i32).cast(), + (&one_hundred as *const i32), i32_vtable, ); unsafe { diff --git a/ptr_meta/src/lib.rs b/ptr_meta/src/lib.rs index 7715f7e..4b887bf 100644 --- a/ptr_meta/src/lib.rs +++ b/ptr_meta/src/lib.rs @@ -167,6 +167,12 @@ unsafe impl Pointee for std::ffi::OsStr { type Metadata = usize; } +/// Pointers to types implementing this trait alias are β€œthin”. +/// +/// This includes statically-Sized types and extern types. +pub trait Thin: Pointee {} +impl> Thin for T {} + /// Returns the metadata of the given pointer. /// /// `*mut T`, `&T`, and `&mut T` can all be passed directly to this function as @@ -227,7 +233,7 @@ pub const fn to_raw_parts_mut( /// [`slice::from_raw_parts`]: core::slice::from_raw_parts #[inline] pub const fn from_raw_parts( - data_address: *const (), + data_address: *const impl Thin, metadata: ::Metadata, ) -> *const T { // SAFETY: Accessing the value from the `PtrRepr` union is safe since @@ -236,7 +242,7 @@ pub const fn from_raw_parts( unsafe { PtrRepr { components: PtrComponents { - data_address, + data_address: data_address.cast(), metadata, }, } @@ -249,7 +255,7 @@ pub const fn from_raw_parts( /// See [`from_raw_parts`] for more details. #[inline] pub const fn from_raw_parts_mut( - data_address: *mut (), + data_address: *mut impl Thin, metadata: ::Metadata, ) -> *mut T { // SAFETY: Accessing the value from the `PtrRepr` union is safe since @@ -258,7 +264,7 @@ pub const fn from_raw_parts_mut( unsafe { PtrRepr { components: PtrComponents { - data_address, + data_address: data_address.cast(), metadata, }, }