Logback: the reliable, generic, fast and flexible logging framework.
Copyright (C) 1999-2015, QOS.ch. All rights reserved.
This program and the accompanying materials are dual-licensed under
either the terms of the Eclipse Public License v1.0 as published by
the Eclipse Foundation
or (per the licensee's choosing)
under the terms of the GNU Lesser General Public License version 2.1
as published by the Free Software Foundation.
/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.core.helpers;
import java.util.ArrayList;
import java.util.List;
CyclicBuffer holds values in a cyclic array.
It allows read access to any element in the buffer not just the first or
last element.
Author: Ceki Gülcü
/**
* CyclicBuffer holds values in a cyclic array.
*
* <p>It allows read access to any element in the buffer not just the first or
* last element.
*
* @author Ceki Gülcü
*/
public class CyclicBuffer<E> {
E[] ea;
int first;
int last;
int numElems;
int maxSize;
Instantiate a new CyclicBuffer of at most maxSize
events.
The maxSize
argument must a positive integer.
Params: - maxSize –
The maximum number of elements in the buffer.
/**
* Instantiate a new CyclicBuffer of at most <code>maxSize</code> events.
*
* The <code>maxSize</code> argument must a positive integer.
*
* @param maxSize
* The maximum number of elements in the buffer.
*/
public CyclicBuffer(int maxSize) throws IllegalArgumentException {
if (maxSize < 1) {
throw new IllegalArgumentException("The maxSize argument (" + maxSize + ") is not a positive integer.");
}
init(maxSize);
}
public CyclicBuffer(CyclicBuffer<E> other) {
this.maxSize = other.maxSize;
ea = (E[]) new Object[maxSize];
System.arraycopy(other.ea, 0, this.ea, 0, maxSize);
this.last = other.last;
this.first = other.first;
this.numElems = other.numElems;
}
@SuppressWarnings("unchecked")
private void init(int maxSize) {
this.maxSize = maxSize;
ea = (E[]) new Object[maxSize];
first = 0;
last = 0;
numElems = 0;
}
Clears the buffer and resets all attributes.
/**
* Clears the buffer and resets all attributes.
*/
public void clear() {
init(this.maxSize);
}
Add an event
as the last event in the buffer.
/**
* Add an <code>event</code> as the last event in the buffer.
*
*/
public void add(E event) {
ea[last] = event;
if (++last == maxSize)
last = 0;
if (numElems < maxSize)
numElems++;
else if (++first == maxSize)
first = 0;
}
Get the ith oldest event currently in the buffer. If i
is outside the range 0 to the number of elements currently in the buffer,
then null
is returned.
/**
* Get the <i>i</i>th oldest event currently in the buffer. If <em>i</em>
* is outside the range 0 to the number of elements currently in the buffer,
* then <code>null</code> is returned.
*/
public E get(int i) {
if (i < 0 || i >= numElems)
return null;
return ea[(first + i) % maxSize];
}
public int getMaxSize() {
return maxSize;
}
Get the oldest (first) element in the buffer. The oldest element is removed
from the buffer.
/**
* Get the oldest (first) element in the buffer. The oldest element is removed
* from the buffer.
*/
public E get() {
E r = null;
if (numElems > 0) {
numElems--;
r = ea[first];
ea[first] = null;
if (++first == maxSize)
first = 0;
}
return r;
}
public List<E> asList() {
List<E> tList = new ArrayList<E>();
for (int i = 0; i < length(); i++) {
tList.add(get(i));
}
return tList;
}
Get the number of elements in the buffer. This number is guaranteed to be
in the range 0 to maxSize
(inclusive).
/**
* Get the number of elements in the buffer. This number is guaranteed to be
* in the range 0 to <code>maxSize</code> (inclusive).
*/
public int length() {
return numElems;
}
Resize the cyclic buffer to newSize
.
Throws: - IllegalArgumentException –
if
newSize
is negative.
/**
* Resize the cyclic buffer to <code>newSize</code>.
*
* @throws IllegalArgumentException
* if <code>newSize</code> is negative.
*/
@SuppressWarnings("unchecked")
public void resize(int newSize) {
if (newSize < 0) {
throw new IllegalArgumentException("Negative array size [" + newSize + "] not allowed.");
}
if (newSize == numElems)
return; // nothing to do
//
E[] temp = (E[]) new Object[newSize];
int loopLen = newSize < numElems ? newSize : numElems;
for (int i = 0; i < loopLen; i++) {
temp[i] = ea[first];
ea[first] = null;
if (++first == numElems)
first = 0;
}
ea = temp;
first = 0;
numElems = loopLen;
maxSize = newSize;
if (loopLen == newSize) {
last = 0;
} else {
last = loopLen;
}
}
}