mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Add EnumSet.range
This commit is contained in:
parent
26db1acc96
commit
a3eaa1fc18
|
@ -17,8 +17,10 @@ package org.teavm.classlib.java.util;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.AbstractSet;
|
import java.util.AbstractSet;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public abstract class TEnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable {
|
public abstract class TEnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable {
|
||||||
public static <E extends Enum<E>> TEnumSet<E> noneOf(Class<E> elementType) {
|
public static <E extends Enum<E>> TEnumSet<E> noneOf(Class<E> elementType) {
|
||||||
|
@ -28,9 +30,7 @@ public abstract class TEnumSet<E extends Enum<E>> extends AbstractSet<E> impleme
|
||||||
public static <E extends Enum<E>> TEnumSet<E> allOf(Class<E> elementType) {
|
public static <E extends Enum<E>> TEnumSet<E> allOf(Class<E> elementType) {
|
||||||
int count = TGenericEnumSet.getConstants(elementType).length;
|
int count = TGenericEnumSet.getConstants(elementType).length;
|
||||||
int[] bits = new int[((count - 1) / 32) + 1];
|
int[] bits = new int[((count - 1) / 32) + 1];
|
||||||
for (int i = 0; i < bits.length; ++i) {
|
Arrays.fill(bits, ~0);
|
||||||
bits[i] = ~0;
|
|
||||||
}
|
|
||||||
zeroHighBits(bits, count);
|
zeroHighBits(bits, count);
|
||||||
return new TGenericEnumSet<>(elementType, bits);
|
return new TGenericEnumSet<>(elementType, bits);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,6 @@ public abstract class TEnumSet<E extends Enum<E>> extends AbstractSet<E> impleme
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
E first = iter.next();
|
E first = iter.next();
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
TEnumSet<E> result = noneOf(first.getDeclaringClass());
|
TEnumSet<E> result = noneOf(first.getDeclaringClass());
|
||||||
result.add(first);
|
result.add(first);
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
|
@ -125,7 +124,28 @@ public abstract class TEnumSet<E extends Enum<E>> extends AbstractSet<E> impleme
|
||||||
return copyOf(this);
|
return copyOf(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract void fastAdd(E t);
|
public static <E extends Enum<E>> TEnumSet<E> range(E from, E to) {
|
||||||
|
Objects.requireNonNull(from);
|
||||||
|
Objects.requireNonNull(to);
|
||||||
|
|
||||||
|
int fromIndex = from.ordinal();
|
||||||
|
int toIndex = to.ordinal();
|
||||||
|
if (fromIndex > toIndex) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
TEnumSet<E> result = TEnumSet.noneOf(from.getDeclaringClass());
|
||||||
|
for (int i = fromIndex; i <= toIndex; ++i) {
|
||||||
|
result.fastAdd(i);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fastAdd(E t) {
|
||||||
|
fastAdd(t.ordinal());
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract void fastAdd(int n);
|
||||||
|
|
||||||
private static void zeroHighBits(int[] bits, int count) {
|
private static void zeroHighBits(int[] bits, int count) {
|
||||||
bits[bits.length - 1] &= (~0) >>> (32 - count % 32);
|
bits[bits.length - 1] &= (~0) >>> (32 - count % 32);
|
||||||
|
|
|
@ -143,8 +143,7 @@ class TGenericEnumSet<E extends Enum<E>> extends TEnumSet<E> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void fastAdd(E t) {
|
void fastAdd(int n) {
|
||||||
int n = t.ordinal();
|
|
||||||
int bitNumber = n / 32;
|
int bitNumber = n / 32;
|
||||||
bits[bitNumber] |= 1 << (n % 32);
|
bits[bitNumber] |= 1 << (n % 32);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user