#enum #number #ordinal #ordinalize

enum-ordinalize

This crates provides create_ordinalized_enum macro to let enums can not only get its variants’ ordinal but also be constructed from an ordinal

17 stable releases

✓ Uses Rust 2018 edition

2.5.2 Sep 16, 2019
2.5.1 Jul 28, 2019
2.5.0 May 5, 2019
2.3.0 Apr 30, 2019
1.0.1 Sep 2, 2018

#60 in Data structures

Download history 44/week @ 2019-06-02 83/week @ 2019-06-09 41/week @ 2019-06-16 230/week @ 2019-06-23 120/week @ 2019-06-30 63/week @ 2019-07-07 14/week @ 2019-07-14 35/week @ 2019-07-21 93/week @ 2019-07-28 33/week @ 2019-08-04 48/week @ 2019-08-11 36/week @ 2019-08-18 101/week @ 2019-08-25 63/week @ 2019-09-01 46/week @ 2019-09-08

308 downloads per month
Used in 5 crates (3 directly)

MIT license

11KB
182 lines

Enum Ordinalize

Build Status

This crates provides create_ordinalized_enum macro to let enums can not only get its variants' ordinal but also be constructed from an ordinal.

Create an Ordinalized Enum

create_ordinalized_enum macro can create an enum and implement a ordinal method, as well as from_ordinal and from_ordinal_unsafe associated functions for it. The new enum also implements Debug, PartialOrd, Ord, PartialEq, Clone, Eq, Hash and Copy traits.

#[macro_use] extern crate enum_ordinalize;

create_ordinalized_enum!(MyEnum,
    Zero,
    One,
    Two
);

assert_eq!(2, MyEnum::Two.ordinal());
assert_eq!(Some(MyEnum::One), MyEnum::from_ordinal(1));

create_ordinalized_enum!(pub MyPublicEnum,
    A,
    B,
    C
);

assert_eq!(2, MyPublicEnum::C.ordinal());
assert_eq!(Some(MyPublicEnum::B), MyPublicEnum::from_ordinal(1));

create_ordinalized_enum!(MySpecialEnum,
    Two = 2,
    Four = 4,
    Eight = 8
);

assert_eq!(2, MySpecialEnum::Two.ordinal());
assert_eq!(Some(MySpecialEnum::Four), MySpecialEnum::from_ordinal(4));

About an Ordinalized Enum

An ordinalized enum is sized isize by default. If you want to change it, just assign an integer type explicitly.

#[macro_use] extern crate enum_ordinalize;

create_ordinalized_enum!(MyEnum: u8,
    Zero,
    One,
    Two
);

assert_eq!(2u8, MyEnum::Two.ordinal());
assert_eq!(Some(MyEnum::One), MyEnum::from_ordinal(1u8));

If you are 100% sure that the isize value can transmute into a variant of your ordinalized enum. You can use the from_ordinal_unsafe associated function and the unsafe keyword to speed up.

#[macro_use] extern crate enum_ordinalize;

create_ordinalized_enum!(MyEnum,
    Zero,
    One,
    Two
);

assert_eq!(MyEnum::One, unsafe{MyEnum::from_ordinal_unsafe(1)});

Crates.io

https://crates.io/crates/enum-ordinalize

Documentation

https://docs.rs/enum-ordinalize

License

MIT

No runtime deps