[−][src]Macro enum_unitary::enum_unitary
Derive and implement extra traits for "unitary" enums (i.e. enums where variants do not have payloads):
- derive
IntoEnumIterator
: implements an iterator type namedFooEnumIterator
for an enum namedFoo
and provides a trait methodinto_enum_iter()
- implements
num_traits
traitsBounded
,ToPrimitive
,FromPrimitive
- provides a trait method
count_variants()
and a const methodcount()
returning the number of variants - provides
next_variant()
andprev_variant()
methods - provides an
iter_variants()
method which returns the enum iterator as a boxed trait object for generic traversals
Note that Clone
is also automatically derived so there will be an error if
it is given in a derive attribute.
Currently explicit discriminators are not allowed: enum variants will be
numbered consecutively starting from 0
.
Examples
extern crate enum_iterator; extern crate enum_unitary; fn main () { use enum_unitary::{enum_unitary, EnumUnitary, Bounded, FromPrimitive, ToPrimitive}; enum_unitary! { #[derive(Debug, PartialEq)] pub enum E { A, B, C } } assert_eq!(E::count(), 3); assert_eq!(Into::<usize>::into (E::A), 0); assert_eq!(Into::<usize>::into (E::B), 1); assert_eq!(Into::<usize>::into (E::C), 2); assert_eq!(E::min_value(), E::A); assert_eq!(E::max_value(), E::C); let mut i = E::iter_variants(); assert_eq!(i.next(), Some (E::A)); assert_eq!(i.next(), Some (E::B)); assert_eq!(i.next(), Some (E::C)); assert_eq!(i.next(), None); assert_eq!(E::A.next_variant(), Some (E::B)); assert_eq!(E::A.prev_variant(), None); assert_eq!(E::B.next_variant(), Some (E::C)); assert_eq!(E::B.prev_variant(), Some (E::A)); assert_eq!(E::C.next_variant(), None); assert_eq!(E::C.prev_variant(), Some (E::B)); }