diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
| commit | 8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch) | |
| tree | 22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/enum-ordinalize/src/traits.rs | |
| parent | 4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff) | |
chore: add vendor directory
Diffstat (limited to 'vendor/enum-ordinalize/src/traits.rs')
| -rw-r--r-- | vendor/enum-ordinalize/src/traits.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/vendor/enum-ordinalize/src/traits.rs b/vendor/enum-ordinalize/src/traits.rs new file mode 100644 index 00000000..f63fa3ff --- /dev/null +++ b/vendor/enum-ordinalize/src/traits.rs @@ -0,0 +1,68 @@ +/// This trait provides an enum with the ability to not only obtain the ordinal values of its variants but also allows for the construction of enums from an ordinal value. +/// +/// ```rust +/// use enum_ordinalize::Ordinalize; +/// +/// #[repr(u8)] +/// enum E { +/// A, +/// B, +/// } +/// +/// impl Ordinalize for E { +/// type VariantType = u8; +/// +/// const VALUES: &'static [Self::VariantType] = &[0, 1]; +/// const VARIANTS: &'static [Self] = &[E::A, E::B]; +/// const VARIANT_COUNT: usize = 2; +/// +/// #[inline] +/// unsafe fn from_ordinal_unsafe(number: Self::VariantType) -> Self { +/// ::core::mem::transmute(number) +/// } +/// +/// #[inline] +/// fn from_ordinal(number: Self::VariantType) -> Option<Self> { +/// match number { +/// 0 => Some(Self::A), +/// 1 => Some(Self::B), +/// _ => None, +/// } +/// } +/// +/// #[inline] +/// fn ordinal(&self) -> Self::VariantType { +/// match self { +/// Self::A => 0, +/// Self::B => 1, +/// } +/// } +/// } +/// ``` +pub trait Ordinalize: Sized + 'static { + /// The type of the values of the variants. + type VariantType; + + /// The count of variants. + const VARIANT_COUNT: usize; + + /// List of this enum's variants. + const VARIANTS: &'static [Self]; + + /// List of values for all variants of this enum. + const VALUES: &'static [Self::VariantType]; + + /// Obtain a variant based on an integer number. + /// + /// # Safety + /// You have to ensure that the input integer number can correspond to a variant on your own. + unsafe fn from_ordinal_unsafe(number: Self::VariantType) -> Self; + + /// Obtain a variant based on an integer number. + fn from_ordinal(number: Self::VariantType) -> Option<Self> + where + Self: Sized; + + /// Retrieve the integer number of this variant. + fn ordinal(&self) -> Self::VariantType; +} |
