package com.feedly.cassandra.dao; public class CircularLongQueue { private final int _capacity; private final long[] _timings; private int _timingsIdx; private int _numTimings; public CircularLongQueue(int capacity) { _timings = new long[capacity]; _capacity = capacity; } public void reset() { synchronized(_timings) { _timingsIdx = 0; _numTimings = 0; } } public void add(long timing) { synchronized(_timings) { if(_timingsIdx == _capacity) _timingsIdx = 0; _timings[_timingsIdx++] = timing; if(_numTimings < _capacity) _numTimings++; } } public long[] timings() { synchronized(_timings) { long[] copy = new long[_numTimings]; long[] timings = _timings; int maxIdx = _timingsIdx - 1; for(int i = copy.length - 1; i >= 0; i--) { int idx = maxIdx - i; if(idx < 0) idx += _capacity; copy[i] = timings[idx]; } return copy; } } }