Skip to main content

Ordinal

Trait Ordinal 

Source
pub trait Ordinal: Sized {
    const ORDINAL_SIZE: usize;

    // Required methods
    fn ordinal(&self) -> usize;
    fn from_ordinal(ordinal: usize) -> Option<Self>;

    // Provided method
    fn all_values() -> OrdinalValues<Self>  { ... }
}
Expand description

Two-way map from a type to usize range from 0..ORDINAL_SIZE.

Two way ordinal mapping means:

  • the type has ORDINAL_SIZE possible values
  • each value has a unique ordinal number in the range 0..ORDINAL_SIZE
  • each ordinal number corresponds to a unique value

This type is implemented for

  • small integer types
  • tuples
  • some builtin types like Option and Result
  • and it can be derived with the #[derive(Ordinal)] attribute for structs and enums

§Relation to Ord and PartialOrd

Implementations provided in this crate and generated with #[derive(Ordinal)] are compatible with Ord and PartialOrd, meaning a < b <=> a.ordinal() < b.ordinal() with the exception of derive on enums with explicit discriminants (derive ignores them and assigns ordinal numbers in order of declaration).

This is not enforced by the trait itself, but it is a good practice to follow.

§Derive

#[derive(Ordinal)] works for arbitrary structs and enums. Generated implementation is compatible with #[derive(PartialOrd)].

use ordinal_map::Ordinal;
#[derive(Ordinal)]
enum Color {
    Red,
    Cyan,
    Blue,
}

#[derive(Ordinal)]
struct Bright(bool);

#[derive(Ordinal)]
enum MaybeColor {
    Default,
    Colored(Color, Bright),
    Invisible,
}

assert_eq!(0, MaybeColor::Default.ordinal());
assert_eq!(1, MaybeColor::Colored(Color::Red, Bright(false)).ordinal());
assert_eq!(2, MaybeColor::Colored(Color::Red, Bright(true)).ordinal());
assert_eq!(3, MaybeColor::Colored(Color::Cyan, Bright(false)).ordinal());
assert_eq!(4, MaybeColor::Colored(Color::Cyan, Bright(true)).ordinal());

§See also

  • Iter to iterate over all possible values.
  • map module for constant time lookup maps.
  • set module for constant time lookup sets.

Required Associated Constants§

Source

const ORDINAL_SIZE: usize

Number of possible values.

It is compile-time error if the number of possible values is greater than usize::MAX.

Required Methods§

Source

fn ordinal(&self) -> usize

Index of the ordinal.

§Example
use std::num::NonZeroI16;

use ordinal_map::Ordinal;
assert_eq!(0, None::<u16>.ordinal());
assert_eq!(1, Some::<u16>(0).ordinal());
assert_eq!(2, Some::<u16>(1).ordinal());
Source

fn from_ordinal(ordinal: usize) -> Option<Self>

Returns the ordinal from the index.

§Example
use ordinal_map::Ordinal;

assert_eq!(i16::MIN, i16::from_ordinal(0).unwrap());
assert_eq!(i16::MIN + 1, i16::from_ordinal(1).unwrap());

Provided Methods§

Source

fn all_values() -> OrdinalValues<Self>

Iterate over all possible values.

Values are returned in order of their ordinal numbers.

§Example
use ordinal_map::Ordinal;
let mut iter = i16::all_values();
assert_eq!(Some(i16::MIN), iter.next());
assert_eq!(Some(i16::MAX), iter.next_back());

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl Ordinal for ()

Source§

const ORDINAL_SIZE: usize = 1usize

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for Infallible

Source§

impl Ordinal for NonZeroI8

Source§

const ORDINAL_SIZE: usize = NonZeroU8::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for NonZeroI16

Source§

const ORDINAL_SIZE: usize = NonZeroU16::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for NonZeroI32

Source§

const ORDINAL_SIZE: usize = NonZeroU32::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for NonZeroI64

Source§

const ORDINAL_SIZE: usize = NonZeroU64::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for NonZeroIsize

Source§

const ORDINAL_SIZE: usize = NonZeroUsize::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for NonZeroU8

Source§

impl Ordinal for NonZeroU16

Source§

impl Ordinal for NonZeroU32

Source§

impl Ordinal for NonZeroU64

It is compile-time error to use this impl on 32-bit platforms.

Source§

impl Ordinal for NonZeroUsize

Source§

const ORDINAL_SIZE: usize = usize::MAX

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for Ordering

Source§

impl Ordinal for bool

Source§

impl Ordinal for char

Source§

impl Ordinal for i8

Source§

impl Ordinal for i16

Source§

impl Ordinal for i32

Source§

const ORDINAL_SIZE: usize = u32::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl Ordinal for u8

Source§

impl Ordinal for u16

Source§

impl Ordinal for u32

Accessing this type is compile time error on 32-bit platforms.

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal, K: Ordinal, L: Ordinal, M: Ordinal, N: Ordinal, O: Ordinal, P: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal, K: Ordinal, L: Ordinal, M: Ordinal, N: Ordinal, O: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal, K: Ordinal, L: Ordinal, M: Ordinal, N: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J, K, L, M, N)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal, K: Ordinal, L: Ordinal, M: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J, K, L, M)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal, K: Ordinal, L: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J, K, L)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal, K: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J, K)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal, J: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I, J)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal, I: Ordinal> Ordinal for (A, B, C, D, E, F, G, H, I)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal, H: Ordinal> Ordinal for (A, B, C, D, E, F, G, H)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal, G: Ordinal> Ordinal for (A, B, C, D, E, F, G)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal, F: Ordinal> Ordinal for (A, B, C, D, E, F)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal, E: Ordinal> Ordinal for (A, B, C, D, E)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal, D: Ordinal> Ordinal for (A, B, C, D)

Source§

impl<A: Ordinal, B: Ordinal, C: Ordinal> Ordinal for (A, B, C)

Source§

impl<A: Ordinal, B: Ordinal> Ordinal for (A, B)

Source§

impl<A: Ordinal, B: Ordinal> Ordinal for Result<A, B>

Source§

impl<A: Ordinal> Ordinal for (A,)

Source§

const ORDINAL_SIZE: usize = <A as ordinal_map::Ordinal>::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Source§

impl<A: Ordinal> Ordinal for Option<A>

Source§

impl<T: Ordinal, const N: usize> Ordinal for [T; N]

Source§

impl<T: Ordinal> Ordinal for Box<T>

Source§

const ORDINAL_SIZE: usize = T::ORDINAL_SIZE

Source§

fn ordinal(&self) -> usize

Source§

fn from_ordinal(ordinal: usize) -> Option<Self>

Implementors§