/*
* Copyright (c) Henrik Niehaus & Lazy Bones development team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of the project (Lazy Bones) nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package lazybones.logging;
import java.util.Iterator;
public class CircularList<T> implements Iterable<T>, Iterator<T> {
/** Points to the start of the list */
private Node start;
/** Points to the next free node */
private Node current;
/** Holds the current Node for iteration */
private Node iterPos;
private boolean firstRotation = true;
public CircularList(int capacity) {
start = new Node(null, null, null);
current = start;
// create a link list
for (int i = 0; i < capacity - 1; i++) {
Node next = new Node(current, null, null);
current.setNext(next);
current = next;
}
// link the last node to first, so we get an circular list
current.setNext(start);
start.setPrev(current);
// reset the current node to the start
current = start;
}
public void add(T data) {
current.setData(data);
if (current == start) {
if (firstRotation) {
firstRotation = false;
} else {
start = current.getNext();
}
}
current = current.getNext();
}
private class Node {
private T data;
private Node prev;
private Node next;
public Node(Node prev, Node next, T data) {
this.prev = prev;
this.next = next;
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@SuppressWarnings("unused")
public Node getPrev() {
return prev;
}
public void setPrev(Node prev) {
this.prev = prev;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
public Iterator<T> iterator() {
iterPos = start;
firstRotation = true;
return this;
}
public boolean hasNext() {
if (iterPos == start) {
if (firstRotation) {
firstRotation = false;
return true;
} else {
return false;
}
} else {
return true;
}
}
public T next() {
Node temp = iterPos;
iterPos = temp.getNext();
return temp.getData();
}
public void remove() {
throw new RuntimeException("remove() is not implemented");
}
public static void main(String[] args) {
final int size = 5;
CircularList<String> list = new CircularList<String>(size);
for (int i = 0; i < size + 20; i++) {
list.add(Integer.toString(i));
}
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String s = iterator.next();
System.out.println(s);
}
}
}