Added setToInt() and intToSet(), for turning a Set<ByteEnum> into an
encoded form for storing in a database or otherwise persisting into an int. It would be snazzy if Depot could do this automatically if a PersistentRecord contained a Set<E extends Enum<E> & ByteEnum>. git-svn-id: https://samskivert.googlecode.com/svn/trunk@2751 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -20,6 +20,9 @@
|
|||||||
|
|
||||||
package com.samskivert.util;
|
package com.samskivert.util;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link ByteEnum} utility methods.
|
* {@link ByteEnum} utility methods.
|
||||||
*/
|
*/
|
||||||
@@ -40,4 +43,48 @@ public class ByteEnumUtil
|
|||||||
}
|
}
|
||||||
throw new IllegalArgumentException(eclass + " has no value with code " + code);
|
throw new IllegalArgumentException(eclass + " has no value with code " + code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a Set of ByteEnums into an integer compactly representing the elements that are
|
||||||
|
* included.
|
||||||
|
*/
|
||||||
|
public static <E extends Enum<E> & ByteEnum> int setToInt (Set<E> set)
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
for (E value : set) {
|
||||||
|
flags |= (1 << toIntFlag(value));
|
||||||
|
}
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an int representation of ByteEnum flags into an EnumSet.
|
||||||
|
*/
|
||||||
|
public static <E extends Enum<E> & ByteEnum> EnumSet<E> intToSet (Class<E> eclass, int flags)
|
||||||
|
{
|
||||||
|
EnumSet<E> set = EnumSet.noneOf(eclass);
|
||||||
|
for (E value : eclass.getEnumConstants()) {
|
||||||
|
if ((flags & (1 << toIntFlag(value))) != 0) {
|
||||||
|
set.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper function for setToInt() and intToSet() that validates that the specified
|
||||||
|
* ByteEnum value is not null and has a code between 0 and 31, inclusive.
|
||||||
|
*/
|
||||||
|
protected static <E extends Enum<E> & ByteEnum> byte toIntFlag (E value)
|
||||||
|
{
|
||||||
|
byte code = value.toByte(); // allow this to throw NPE
|
||||||
|
if (code < 0 || code > 31) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"ByteEnum code is outside the range that can be turned into an int " +
|
||||||
|
"[value=" + value + ", code=" + code + "]");
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: setToByteArray() and byteArrayToSet(), for larger ByteEnums?
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user