You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ptr_meta_derive, proc macros for
implementing Pointee for structs and trait objects
Example
// Get the associated metadata for pointerslet str = "hello world";assert_eq!(ptr_meta::metadata(str),str.len());let slice = &[1,2,3,4,5]as&[i32];assert_eq!(ptr_meta::metadata(slice), slice.len());// Make your own wide pointers from data pointers and metadatalet bytes = [b'h',b'e',b'l',b'l',b'o'];let ptr = ptr_meta::from_raw_parts::<str>(bytes.as_ptr().cast(),5);println!("{} world!",unsafe{&*ptr });// prints "hello world!"// Derive Pointee on your own types#[derive(ptr_meta::Pointee)]#[repr(transparent)]structCoolStr{inner:str,}implCoolStr{fnprint_cool(&self){println!("😎 {} 😎",&self.inner);}}let ptr = ptr_meta::from_raw_parts::<CoolStr>(bytes.as_ptr().cast(),5);let cool = unsafe{&*ptr };
cool.print_cool();// prints "😎 hello 😎"// Implement Pointee for trait objects#[ptr_meta::pointee]traitPrintable{fnprint(&self);}implPrintablefori32{fnprint(&self){println!("i32: {self}");}}let i32_vtable = ptr_meta::metadata(&0i32as&dynPrintable);let one_hundred = 100i32;let printable = ptr_meta::from_raw_parts::<dynPrintable>((&one_hundred as*consti32).cast(),
i32_vtable,);unsafe{(*printable).print();// prints "i32: 100"}