package appeng.util; import java.util.EnumSet; /** * Simple utility class to help with select the "next" or "previous" value in a * list of options represented by an enumeration. */ public final class EnumCycler { private EnumCycler() { } public static > T rotateEnum(T ce, final boolean backwards, final EnumSet validOptions) { do { if (backwards) { ce = prevEnum(ce); } else { ce = next(ce); } } while (!validOptions.contains(ce)); return ce; } /* * Simple way to cycle an enum... */ public static > T prevEnum(final T ce) { T[] values = ce.getDeclaringClass().getEnumConstants(); int pLoc = ce.ordinal() - 1; if (pLoc < 0) { pLoc = values.length - 1; } if (pLoc < 0 || pLoc >= values.length) { pLoc = 0; } return values[pLoc]; } /* * Simple way to cycle an enum... */ public static > T next(final T ce) { T[] values = ce.getDeclaringClass().getEnumConstants(); int pLoc = ce.ordinal() + 1; if (pLoc >= values.length) { pLoc = 0; } if (pLoc < 0 || pLoc >= values.length) { pLoc = 0; } return values[pLoc]; } }