pub enum SmallEnum {
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
}
+#[derive(Clone, Copy, Debug, EnumSetType, Eq, PartialEq)]
+#[enumset(no_super_impls)]
+pub enum SmallEnumExplicitDerive {
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
+}
#[derive(EnumSetType, Debug)]
pub enum LargeEnum {
_00, _01, _02, _03, _04, _05, _06, _07,
pub enum ReprEnum3 {
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
}
+#[repr(C)]
+#[derive(EnumSetType, Debug)]
+pub enum ReprEnum4 {
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
+}
macro_rules! test_variants {
($enum_name:ident $all_empty_test:ident $($variant:ident,)*) => {
test_variants! { SmallEnum small_enum_all_empty
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
}
+test_variants! { SmallEnumExplicitDerive small_enum_explicit_derive_all_empty
+ A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
+}
test_variants! { LargeEnum large_enum_all_empty
_00, _01, _02, _03, _04, _05, _06, _07,
_10, _11, _12, _13, _14, _15, _16, _17,
macro_rules! test_enum {
($e:ident, $mem_size:expr) => {
const CONST_SET: EnumSet<$e> = enum_set!($e::A | $e::C);
+ const CONST_1_SET: EnumSet<$e> = enum_set!($e::A);
const EMPTY_SET: EnumSet<$e> = enum_set!();
#[test]
fn const_set() {
assert_eq!(CONST_SET.len(), 2);
+ assert_eq!(CONST_1_SET.len(), 1);
assert!(CONST_SET.contains($e::A));
assert!(CONST_SET.contains($e::C));
assert!(EMPTY_SET.is_empty());
let mut itr = set.iter();
for idx in 0 .. count {
assert_eq!(itr.size_hint(), (count-idx, Some(count-idx)));
+ assert_eq!(itr.len(), count-idx);
assert!(itr.next().is_some());
}
assert_eq!(itr.size_hint(), (0, Some(0)));
+ assert_eq!(itr.len(), 0);
}
#[test]
fn test_iter_size_hint() {
assert!(!$set.contains(&SET_TEST_E));
}}
}
-
+
let mut hash_set = HashSet::new();
test_set!(hash_set);
-
+
let mut tree_set = BTreeSet::new();
test_set!(tree_set);
}
+ #[test]
+ fn sum_test() {
+ let target = $e::A | $e::B | $e::D | $e::E | $e::G | $e::H;
+
+ let list_a = [$e::A | $e::B, $e::D | $e::E, $e::G | $e::H];
+ let sum_a: EnumSet<$e> = list_a.iter().map(|x| *x).sum();
+ assert_eq!(target, sum_a);
+ let sum_b: EnumSet<$e> = list_a.iter().sum();
+ assert_eq!(target, sum_b);
+
+ let list_b = [$e::A, $e::B, $e::D, $e::E, $e::G, $e::H];
+ let sum_c: EnumSet<$e> = list_b.iter().map(|x| *x).sum();
+ assert_eq!(target, sum_c);
+ let sum_d: EnumSet<$e> = list_b.iter().sum();
+ assert_eq!(target, sum_d);
+ }
+
#[test]
fn check_size() {
assert_eq!(::std::mem::size_of::<EnumSet<$e>>(), $mem_size);
}
tests!(small_enum, test_enum!(SmallEnum, 4));
+tests!(small_enum_explicit_derive, test_enum!(SmallEnumExplicitDerive, 4));
tests!(large_enum, test_enum!(LargeEnum, 16));
tests!(enum8, test_enum!(Enum8, 1));
tests!(enum128, test_enum!(Enum128, 16));
tests!(sparse_enum, test_enum!(SparseEnum, 16));
-tests!(repr_enum, test_enum!(ReprEnum, 4));
-tests!(repr_enum2, test_enum!(ReprEnum2, 4));
-tests!(repr_enum3, test_enum!(ReprEnum3, 4));
+tests!(repr_enum_u32, test_enum!(ReprEnum, 4));
+tests!(repr_enum_u64, test_enum!(ReprEnum2, 4));
+tests!(repr_enum_isize, test_enum!(ReprEnum3, 4));
+tests!(repr_enum_c, test_enum!(ReprEnum4, 4));
#[derive(EnumSetType, Debug)]
pub enum ThresholdEnum {