11 releases

0.2.0 Oct 11, 2024
0.2.0-beta.0 Jul 8, 2023
0.1.8 Dec 30, 2022
0.1.7 Nov 14, 2022

#299 in Rust patterns

Download history 2/week @ 2024-09-06 819/week @ 2024-09-13 342/week @ 2024-09-20 5/week @ 2024-09-27 6/week @ 2024-10-04 213/week @ 2024-10-11 4/week @ 2024-10-18 12/week @ 2024-11-01 312/week @ 2024-11-08 551/week @ 2024-11-15

875 downloads per month

MIT/Apache

37KB
531 lines

Enum Ptr

crates.io docs.rs

This crate provides a custom derive macro EnumPtr to generate bridges between an enum T and Compact<T> with minimum cost. Compact<T> is the compact representation of T, and it is only one pointer wide. In other words, this crate is a library for defining tagged pointers in ergonomic way, even supporting different pointer types (&, Box, Arc, etc) as different enum variants.

For example, the following code

use enum_ptr::EnumPtr;

#[derive(EnumPtr)]
#[repr(C, usize)]
enum Foo<'a> {
    A(&'a i32),
    B(Box<i32>),
}

will generate

impl<'a> From<Foo<'a>> for Compact<Foo<'a>> {
    // ...
}

impl<'a> From<Compact<Foo<'a>>> for Foo<'a> {
    // ...
}

Since &i32 and Box<i32> are aligned by 4 bytes, the lowest 2 bits of them are always zeros. Compact<Foo<'a>> utilizes these bits to store the tag (discriminant).

Features

  • No need to write unsafe pointer operations
  • Supports various types and can be extended
  • Supports no_std
  • Minimum type conversion cost
  • Passes cargo +nightly miri test with strict provenance enabled.

Testing

$ cargo test
$ cargo +nightly miri test

Credits

  • Thanks to @oxalica for reviewing this crate and providing a lot of helpful suggestions.

License

This project is licensed under either of

at your option.

Dependencies

~0.6–1MB
~23K SLoC