org.gridkit.jvmtool.stacktrace.CounterArray Maven / Gradle / Ivy
package org.gridkit.jvmtool.stacktrace;
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class CounterArray implements CounterCollection {
public static CounterArray EMPTY = new CounterArray(new String[0], new long[0]) {
@Override
public void set(String key, long value) {
throw new UnsupportedOperationException("Immutable");
}
@Override
public void reset() {
throw new UnsupportedOperationException("Immutable");
}
};
String[] counterNames;
long[] values;
public CounterArray() {
this(new String[0], new long[0]);
}
public CounterArray(String[] names, long[] values) {
if (names.length != values.length) {
throw new IllegalArgumentException("Array length mismatch");
}
this.counterNames = names;
this.values = values;
}
@Override
public Iterator iterator() {
return new Iterator() {
int n = 0;
{seek();}
protected void seek() {
while(n < counterNames.length) {
if (counterNames[n] != null && values[n] != Long.MIN_VALUE) {
break;
}
++n;
}
}
@Override
public boolean hasNext() {
return n < counterNames.length;
}
@Override
public String next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
String key = counterNames[n];
n++;
seek();
return key;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public long getValue(String key) {
if (key == null) {
throw new NullPointerException("key is null");
}
for(int i = 0; i != counterNames.length; ++i) {
if (key.equals(counterNames[i])) {
return values[i];
}
}
return Long.MIN_VALUE;
}
public CounterArray clone() {
int n = 0;
for(@SuppressWarnings("unused") String key: this) {
++n;
}
String[] keys = new String[n];
long[] vals = new long[n];
n = 0;
for(String key: this) {
keys[n] = key;
vals[n] = getValue(key);
++n;
}
return new CounterArray(keys, vals);
}
public void copyFrom(CounterCollection cc) {
reset();
for(String key: cc) {
set(key, cc.getValue(key));
}
}
public void set(String key, long value) {
if (key == null) {
throw new NullPointerException("key is null");
}
for(int i = 0; i != counterNames.length; ++i) {
if (key.equals(counterNames[i])) {
values[i] = value;
return;
}
}
if (value != Long.MIN_VALUE) {
int n = counterNames.length;
counterNames = Arrays.copyOf(counterNames, n + 1);
values = Arrays.copyOf(values, n + 1);
counterNames[n] = key;
values[n] = value;
}
}
public void reset() {
Arrays.fill(values, Long.MIN_VALUE);
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('[');
for(String key: this) {
if (sb.length() > 1) {
sb.append(", ");
}
sb.append(key).append(": ").append(getValue(key));
}
sb.append(']');
return sb.toString();
}
}