@@ -0,0 +1,2262 @@
+/*%0A * Copyright 2016 Timothy Brooks%0A *%0A * Licensed under the Apache License, Version 2.0 (the %22License%22);%0A * you may not use this file except in compliance with the License.%0A * You may obtain a copy of the License at%0A *%0A * http://www.apache.org/licenses/LICENSE-2.0%0A *%0A * Unless required by applicable law or agreed to in writing, software%0A * distributed under the License is distributed on an %22AS IS%22 BASIS,%0A * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.%0A * See the License for the specific language governing permissions and%0A * limitations under the License.%0A *%0A */%0A%0Apackage net.uncontended.precipice.metrics.experimental;%0A%0Aimport net.uncontended.precipice.metrics.AddCounter;%0Aimport net.uncontended.precipice.metrics.CountMetrics;%0Aimport net.uncontended.precipice.time.Clock;%0Aimport net.uncontended.precipice.time.SystemTime;%0A%0Aimport java.util.concurrent.atomic.AtomicReference;%0A%0Apublic class IntervalCountMetrics%3CT extends Enum%3CT%3E%3E implements CountMetrics%3CT%3E %7B%0A%0A    private final Class%3CT%3E type;%0A    private final Clock clock;%0A    private final CountMetrics%3CT%3E totalCounter;%0A    private final AtomicReference%3CCountMetrics%3CT%3E%3E intervalCounter;%0A    private volatile CountMetrics%3CT%3E previousInterval;%0A%0A    public IntervalCountMetrics(Class%3CT%3E type) %7B%0A        this(type, new SystemTime());%0A    %7D%0A%0A    public IntervalCountMetrics(Class%3CT%3E type, Clock clock) %7B%0A        this.type = type;%0A        this.clock = clock;%0A        this.totalCounter = new AddCounter%3C%3E(this.type);%0A        this.intervalCounter = new AtomicReference%3CCountMetrics%3CT%3E%3E(new AddCounter%3C%3E(this.type));%0A    %7D%0A%0A    @Override%0A    public void add(T metric, long delta) %7B%0A        add(metric, delta, clock.nanoTime());%0A%0A    %7D%0A%0A    @Override%0A    public void add(T metric, long delta, long nanoTime) %7B%0A        totalCounter.add(metric, delta, nanoTime);%0A    %7D%0A%0A    @Override%0A    public long getCount(T metric) %7B%0A        return totalCounter.getCount(metric);%0A    %7D%0A%0A    @Override%0A    public Class%3CT%3E getMetricType() %7B%0A        return type;%0A    %7D%0A%0A    public synchronized CountMetrics%3CT%3E intervalCounts() %7B%0A        return intervalCounter.getAndSet(new AddCounter%3C%3E(this.type));%0A    %7D%0A%0A    public CountMetrics%3CT%3E previousIntervalCounts() %7B%0A        return previousInterval;%0A    %7D%0A%7D%0A

Add possible interval count metrics implementation