fnum/lib.rs
1//! Fnum is an utility trait for enum, that provides [`Fnum::size_of_variant`] method.
2//! [`Fnum::size_of_variant`] returns the minimum size that specified variant requiring.
3//!
4//! ```
5//! use fnum::Fnum;
6//!
7//! #[derive(Fnum)]
8//! enum MyEnum {
9//! A(u64),
10//! B(String),
11//! C(u64, u32, u32, u32),
12//! D {
13//! foo: u32,
14//! bar: String,
15//! }
16//! }
17//!
18//! assert_eq!(MyEnum::size_of_variant(0), 16); // bytes required by `MyEnum::A(..)`
19//! assert_eq!(MyEnum::size_of_variant(1), 32); // bytes required by `MyEnum::B(..)`
20//! assert_eq!(MyEnum::size_of_variant(2), 24); // bytes required by `MyEnum::C(..)`
21//! assert_eq!(MyEnum::size_of_variant(3), 32); // bytes required by `MyEnum::D{..}`
22//! ```
23
24extern crate fnum_derive;
25extern crate once_cell;
26
27pub use fnum_derive::Fnum;
28pub use once_cell::sync::Lazy as __Lazy;
29
30/// Fnum trait providing [`Fnum::size_of_variant`] method.
31pub trait Fnum {
32 /// Returns the number of variants the enum has.
33 fn variant_count() -> usize;
34
35 /// Returns the index of variant.
36 ///
37 /// ```
38 /// #[derive(Fnum)]
39 /// enum MyEnum {
40 /// FIrst,
41 /// Second,
42 /// }
43 ///
44 /// assert_eq!(MyEnum::First.variant_index(), 0);
45 /// assert_eq!(MyEnum::Second.variant_index(), 1);
46 /// ```
47 fn variant_index(&self) -> usize;
48
49 /// Create an enum value that has uninitialized fields.
50 ///
51 /// DO NOT drop the returned value, use [`std::mem::forget`].
52 unsafe fn uninit_variant(idx: usize) -> Self;
53
54 /// Returns the minimum size that specified variant requiring.
55 fn size_of_variant(idx: usize) -> usize;
56}