enumoid 0.4.0

Enum Indexed Containers
Documentation
use crate::test::types::{
  CompoundOnWideSeven, CompoundSeven, CompoundWideOnSeven, Seventeen, Sixteen,
  StructOne, StructThree, Three, ThreeHundred, WideThree,
};
use enumoid::EnumArrayHelper;
use enumoid::EnumMap;
use enumoid::EnumOptionMap;
use enumoid::EnumSet;
use enumoid::EnumSetHelper;
use enumoid::EnumSize;
use enumoid::EnumVec;

fn align_word(x: usize, align: usize) -> usize {
  ((x + align - 1) / align) * align
}

fn test_type<
  T: EnumArrayHelper<u8> + EnumSetHelper<u8> + EnumSetHelper<usize>,
>(
  variants: usize,
  value_bytes: usize,
  word_bytes: usize,
  set_bytes: usize,
) {
  assert_eq!(T::SIZE, variants);
  assert_eq!(std::mem::size_of::<T>(), value_bytes);
  assert_eq!(std::mem::size_of::<EnumSize<T>>(), word_bytes);
  assert_eq!(std::mem::size_of::<EnumSet<T>>(), set_bytes);
  assert_eq!(
    std::mem::size_of::<EnumSet<T, usize>>(),
    align_word(set_bytes, std::mem::size_of::<usize>())
  );
  assert_eq!(std::mem::size_of::<EnumMap<T, u8>>(), variants);
  assert_eq!(
    std::mem::size_of::<EnumOptionMap<T, u8>>(),
    set_bytes + variants
  );
  assert_eq!(
    std::mem::size_of::<EnumVec<T, u8>>(),
    word_bytes + align_word(variants, word_bytes)
  );
}

#[test]
fn test_three() {
  test_type::<Three>(3, 1, 1, 1);
  test_type::<WideThree>(3, 1, 4, 1);
}

#[test]
fn test_struct() {
  test_type::<StructOne>(1, 0, 1, 1);
  test_type::<StructThree>(3, 1, 1, 1);
}

#[test]
fn test_compound_seven() {
  test_type::<CompoundSeven>(7, 2, 1, 1);
  test_type::<CompoundOnWideSeven>(7, 2, 1, 1);
  test_type::<CompoundWideOnSeven>(7, 2, 4, 1);
}

#[test]
fn test_sixteen() {
  test_type::<Sixteen>(16, 1, 1, 2);
}

#[test]
fn test_seventeen() {
  test_type::<Seventeen>(17, 1, 1, 3);
}

#[test]
fn test_three_hundred() {
  test_type::<ThreeHundred>(300, 2, 2, 38);
}