|
@@ -17,6 +17,7 @@
|
|
*/
|
|
*/
|
|
package org.apache.hadoop.hdfs.util;
|
|
package org.apache.hadoop.hdfs.util;
|
|
|
|
|
|
|
|
+import java.util.Arrays;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
|
|
import com.google.common.base.Preconditions;
|
|
import com.google.common.base.Preconditions;
|
|
@@ -34,21 +35,19 @@ import com.google.common.base.Preconditions;
|
|
* @param <E> the enum type
|
|
* @param <E> the enum type
|
|
*/
|
|
*/
|
|
public class EnumCounters<E extends Enum<E>> {
|
|
public class EnumCounters<E extends Enum<E>> {
|
|
- /** An array of enum constants. */
|
|
|
|
- private final E[] enumConstants;
|
|
|
|
|
|
+ /** The class of the enum. */
|
|
|
|
+ private final Class<E> enumClass;
|
|
/** The counter array, counters[i] corresponds to the enumConstants[i]. */
|
|
/** The counter array, counters[i] corresponds to the enumConstants[i]. */
|
|
private final long[] counters;
|
|
private final long[] counters;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Construct counters for the given enum constants.
|
|
* Construct counters for the given enum constants.
|
|
- * @param enumConstants an array of enum constants such that,
|
|
|
|
- * for all i, enumConstants[i].ordinal() == i.
|
|
|
|
|
|
+ * @param enumClass the enum class of the counters.
|
|
*/
|
|
*/
|
|
- public EnumCounters(final E[] enumConstants) {
|
|
|
|
- for(int i = 0; i < enumConstants.length; i++) {
|
|
|
|
- Preconditions.checkArgument(enumConstants[i].ordinal() == i);
|
|
|
|
- }
|
|
|
|
- this.enumConstants = enumConstants;
|
|
|
|
|
|
+ public EnumCounters(final Class<E> enumClass) {
|
|
|
|
+ final E[] enumConstants = enumClass.getEnumConstants();
|
|
|
|
+ Preconditions.checkNotNull(enumConstants);
|
|
|
|
+ this.enumClass = enumClass;
|
|
this.counters = new long[enumConstants.length];
|
|
this.counters = new long[enumConstants.length];
|
|
}
|
|
}
|
|
|
|
|
|
@@ -69,6 +68,13 @@ public class EnumCounters<E extends Enum<E>> {
|
|
counters[e.ordinal()] = value;
|
|
counters[e.ordinal()] = value;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /** Set this counters to that counters. */
|
|
|
|
+ public final void set(final EnumCounters<E> that) {
|
|
|
|
+ for(int i = 0; i < counters.length; i++) {
|
|
|
|
+ this.counters[i] = that.counters[i];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/** Add the given value to counter e. */
|
|
/** Add the given value to counter e. */
|
|
public final void add(final E e, final long value) {
|
|
public final void add(final E e, final long value) {
|
|
counters[e.ordinal()] += value;
|
|
counters[e.ordinal()] += value;
|
|
@@ -86,15 +92,33 @@ public class EnumCounters<E extends Enum<E>> {
|
|
counters[e.ordinal()] -= value;
|
|
counters[e.ordinal()] -= value;
|
|
}
|
|
}
|
|
|
|
|
|
- /** Subtract that counters from this counters. */
|
|
|
|
|
|
+ /** Subtract this counters from that counters. */
|
|
public final void subtract(final EnumCounters<E> that) {
|
|
public final void subtract(final EnumCounters<E> that) {
|
|
for(int i = 0; i < counters.length; i++) {
|
|
for(int i = 0; i < counters.length; i++) {
|
|
this.counters[i] -= that.counters[i];
|
|
this.counters[i] -= that.counters[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public boolean equals(Object obj) {
|
|
|
|
+ if (obj == this) {
|
|
|
|
+ return true;
|
|
|
|
+ } else if (obj == null || !(obj instanceof EnumCounters)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ final EnumCounters<?> that = (EnumCounters<?>)obj;
|
|
|
|
+ return this.enumClass == that.enumClass
|
|
|
|
+ && Arrays.equals(this.counters, that.counters);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int hashCode() {
|
|
|
|
+ return Arrays.hashCode(counters);
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public String toString() {
|
|
public String toString() {
|
|
|
|
+ final E[] enumConstants = enumClass.getEnumConstants();
|
|
final StringBuilder b = new StringBuilder();
|
|
final StringBuilder b = new StringBuilder();
|
|
for(int i = 0; i < counters.length; i++) {
|
|
for(int i = 0; i < counters.length; i++) {
|
|
final String name = enumConstants[i].name();
|
|
final String name = enumConstants[i].name();
|