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).
no_std
cargo +nightly miri test
with strict provenance enabled.$ cargo test $ cargo +nightly miri test
This project is licensed under either of
at your option.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4