pub trait Ordinalize: Sized + 'static {
    type VariantType;

    const VARIANT_COUNT: usize;
    const VARIANTS: &'static [Self];
    const VALUES: &'static [Self::VariantType];

    // Required methods
    unsafe fn from_ordinal_unsafe(number: Self::VariantType) -> Self;
    fn from_ordinal(number: Self::VariantType) -> Option<Self>
       where Self: Sized;
    fn ordinal(&self) -> Self::VariantType;
}
Available on crate feature traits only.
Expand description

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.

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,
        }
    }
}

Required Associated Types§

source

type VariantType

The type of the values of the variants.

Required Associated Constants§

source

const VARIANT_COUNT: usize

The count of variants.

source

const VARIANTS: &'static [Self]

List of this enum’s variants.

source

const VALUES: &'static [Self::VariantType]

List of values for all variants of this enum.

Required Methods§

source

unsafe fn from_ordinal_unsafe(number: Self::VariantType) -> Self

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.

source

fn from_ordinal(number: Self::VariantType) -> Option<Self>
where Self: Sized,

Obtain a variant based on an integer number.

source

fn ordinal(&self) -> Self::VariantType

Retrieve the integer number of this variant.

Object Safety§

This trait is not object safe.

Implementors§