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}