package net.teamlixo.eggcrack.list; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; public abstract class AbstractExtendedList<T> implements ExtendedList<T> { private final List<T> list; public AbstractExtendedList(List<T> list) { this.list = list; } @Override public Iterator iterator(boolean looping) { if (looping) return new LoopedIterator(this, true); else return new LoopedIterator(this, false); } @Override public void add(T object) { list.add(object); } @Override public void remove(T object) { list.remove(object); } @Override public int size() { return list.size(); } @Override public void clear() { list.clear(); } @Override public List<T> toList() { return list; } private void remove(int i) { list.remove(i); } private T get(int i) { return list.get(i); } public class LoopedIterator implements Iterator { private final Object lock = new Object(); private final ExtendedList<T> list; private volatile int idx = -1; private final boolean looping; public LoopedIterator(ExtendedList<T> list, boolean b) { this.list = list; this.looping = b; } @Override public boolean hasNext() { return looping ? list.size() > 0 : idx + 1 < list.size(); } @Override public T next() { synchronized (lock) { idx ++; if (idx >= list.size()) { if (looping) idx = 0; else throw new NoSuchElementException(); } return AbstractExtendedList.this.get(idx); } } @Override public void remove() { synchronized (lock) { AbstractExtendedList.this.remove(idx); idx --; } } public float getProgress() { return looping ? -1F : (float)idx / (float)list.size(); } } }