#pointers #no-std #metadata #rfc #object

no-std ptr_meta

A radioactive stabilization of the ptr_meta rfc

12 releases

0.3.0 Sep 11, 2024
0.3.0-pre1 Nov 4, 2023
0.3.0-alpha.3 Aug 11, 2024
0.3.0-alpha.2 Mar 30, 2024
0.1.2 Mar 17, 2021

#1 in #rfc

Download history 446393/week @ 2024-12-17 233107/week @ 2024-12-24 381846/week @ 2024-12-31 712180/week @ 2025-01-07 688833/week @ 2025-01-14 644575/week @ 2025-01-21 625361/week @ 2025-01-28 696293/week @ 2025-02-04 767581/week @ 2025-02-11 888920/week @ 2025-02-18 944279/week @ 2025-02-25 987716/week @ 2025-03-04 983089/week @ 2025-03-11 929676/week @ 2025-03-18 928446/week @ 2025-03-25 876158/week @ 2025-04-01

3,905,887 downloads per month
Used in 1,016 crates (15 directly)

MIT license

23KB
335 lines

ptr_meta

crates.io badge docs badge license badge

A radioactive stabilization of the ptr_meta RFC.

Documentation

Example

// Get the associated metadata for pointers
let 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 metadata
let 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)]
struct CoolStr {
    inner: str,
}

impl CoolStr {
    fn print_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]
trait Printable {
    fn print(&self);
}

impl Printable for i32 {
    fn print(&self) {
        println!("i32: {self}");
    }
}

let i32_vtable = ptr_meta::metadata(&0i32 as &dyn Printable);
let one_hundred = 100i32;
let printable = ptr_meta::from_raw_parts::<dyn Printable>(
    (&one_hundred as *const i32).cast(),
    i32_vtable,
);
unsafe {
    (*printable).print(); // prints "i32: 100"
}

Dependencies

~96KB