package org.infinispan.commons.util; import java.lang.reflect.Array; import java.util.Collection; import java.util.EnumSet; /** * Utilities method to Enums. * * @author Pedro Ruivo * @since 8.2 */ public class EnumUtil { private EnumUtil() { } public static final long EMPTY_BIT_SET = 0L; public static <E extends Enum<E>> long bitSetOf(Collection<E> enums) { if (enums == null || enums.isEmpty()) { return EMPTY_BIT_SET; } long flagBitSet = EMPTY_BIT_SET; for (Enum<?> f : enums) { flagBitSet |= 1 << f.ordinal(); } return flagBitSet; } public static long bitSetOf(Enum<?> first) { return 1 << first.ordinal(); } public static long bitSetOf(Enum<?> first, Enum<?> second) { return 1 << first.ordinal() | 1 << second.ordinal(); } public static long bitSetOf(Enum<?> first, Enum<?> second, Enum<?>... remaining) { long bitSet = 1 << first.ordinal() | 1 << second.ordinal(); for (Enum<?> f : remaining) { bitSet |= 1 << f.ordinal(); } return bitSet; } public static long bitSetOf(Enum<?>[] flags) { long bitSet = EMPTY_BIT_SET; for (Enum<?> flag : flags) { bitSet |= 1 << flag.ordinal(); } return bitSet; } public static <E extends Enum<E>> EnumSet<E> enumSetOf(long bitSet, Class<E> eClass) { if (bitSet == EMPTY_BIT_SET) { return EnumSet.noneOf(eClass); } EnumSet<E> flagSet = EnumSet.noneOf(eClass); for (E f : eClass.getEnumConstants()) { if (hasEnum(bitSet, f)) { flagSet.add(f); } } return flagSet; } public static boolean hasEnum(long bitSet, Enum<?> anEnum) { return (bitSet & (1 << anEnum.ordinal())) != 0; } public static long setEnum(long bitSet, Enum<?> anEn) { return bitSet | (1 << anEn.ordinal()); } public static <E extends Enum<E>> long setEnums(long bitSet, Collection<E> enums) { if (enums == null || enums.isEmpty()) { return bitSet; } for (Enum<?> f : enums) { bitSet |= 1 << f.ordinal(); } return bitSet; } public static long unsetEnum(long bitSet, Enum<?> anEnum) { return bitSet & ~(1 << anEnum.ordinal()); } public static <E extends Enum<E>> String prettyPrintBitSet(long bitSet, Class<E> eClass) { return enumSetOf(bitSet, eClass).toString(); } public static long mergeBitSets(long bitSet1, long bitSet2) { return bitSet1 | bitSet2; } public static long diffBitSets(long bitSet1, long bitSet2) { return bitSet1 & ~bitSet2; } public static boolean containsAll(long bitSet, long testBitSet) { return (bitSet & testBitSet) == testBitSet; } public static boolean containsAny(long bitSet, long testBitSet) { return (bitSet & testBitSet) != 0; } public static int bitSetSize(long bitSet) { return Long.bitCount(bitSet); } public static <E extends Enum<E>> E[] enumArrayOf(long bitSet, Class<E> eClass) { if (bitSet == EMPTY_BIT_SET) { return null; } E[] array = (E[]) Array.newInstance(eClass, bitSetSize(bitSet)); int i = 0; for (E f : eClass.getEnumConstants()) { if (hasEnum(bitSet, f)) { array[i++] = f; } } return array; } }