/* * Copyright 2015 MiLaboratory.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.milaboratory.util; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.core.JsonProcessingException; import java.util.concurrent.atomic.AtomicLongArray; @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE) public final class AtomicEnumHistogram<E extends Enum<E>> { private final Class<E> enumClass; private final AtomicLongArray hist; public AtomicEnumHistogram(Class<E> enumClass) { this.enumClass = enumClass; this.hist = new AtomicLongArray(enumClass.getEnumConstants().length + 1); } public void add(E value) { if (value == null) hist.incrementAndGet(hist.length() - 1); else hist.incrementAndGet(value.ordinal()); } public String[] getLabels() { String[] labels = new String[enumClass.getEnumConstants().length + 1]; int i = 0; for (E e : enumClass.getEnumConstants()) labels[i++] = e.name(); labels[i] = "null"; return labels; } public long[] getHist() { long[] result = new long[hist.length()]; for (int i = 0; i < result.length; i++) result[i] = hist.get(i); return result; } @JsonUnwrapped @JsonValue public SerializableResult getSerializableResult() { return new SerializableResult(getLabels(), getHist()); } @Override public String toString() { try { return GlobalObjectMappers.toOneLine(getSerializableResult()); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, isGetterVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE) public static final class SerializableResult { public final String[] labels; public final long[] hist; public SerializableResult(String[] labels, long[] hist) { this.labels = labels; this.hist = hist; } } }