package pt.ist.fenixframework.core.adt.linkedlist;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
import pt.ist.fenixframework.core.AbstractDomainObject;
public class LinkedList<T extends AbstractDomainObject> extends LinkedList_Base implements Set<T> {
public LinkedList() {
super();
setHead(new ListNode<T>(null, null));
}
public boolean insert(T value) {
ListNode<T> previous = getHead();
ListNode<T> next = previous.getNext();
Comparable toInsert = value.getOid();
Comparable oid = null;
while (next != null && (oid = next.getValue().getOid()).compareTo(toInsert) < 0) {
previous = next;
next = previous.getNext();
}
if (next == null || toInsert.compareTo(oid) != 0) {
previous.setNext(new ListNode(value, next));
return true;
}
return false;
}
public boolean removeObject(T value) {
ListNode<T> previous = getHead();
ListNode<T> next = previous.getNext();
Comparable toInsert = value.getOid();
Comparable oid = null;
while (next != null && (oid = next.getValue().getOid()).compareTo(toInsert) < 0) {
previous = next;
next = previous.getNext();
}
if (oid != null && toInsert.compareTo(oid) == 0) {
if (next != null) {
previous.setNext(next.getNext());
} else {
previous.setNext(null);
}
return true;
}
return false;
}
public boolean contains(T value) {
ListNode<T> previous = getHead();
ListNode<T> next = previous.getNext();
Comparable toInsert = value.getOid();
Comparable oid = false;
while (next != null && (oid = next.getValue().getOid()).compareTo(toInsert) < 0) {
previous = next;
next = previous.getNext();
}
return next != null && toInsert.compareTo(oid) == 0;
}
public int size() {
ListNode<T> iter = getHead();
int size = 0;
while (iter != null) {
size++;
iter = iter.getNext();
}
return size;
}
public Iterator<T> iterator() {
return new Iterator<T>() {
private ListNode<T> iter = getHead().getNext(); // skip head tomb
@Override
public boolean hasNext() {
return iter != null;
}
@Override
public T next() {
if (iter == null) {
throw new NoSuchElementException();
}
Object value = iter.getValue();
iter = iter.getNext();
return (T)value;
}
@Override
public void remove() {
throw new UnsupportedOperationException("This implementation does not allow element removal via the iterator");
}
};
}
@Override
public boolean add(T e) {
return insert(e);
}
@Override
public boolean remove(Object o) {
if (! (o instanceof AbstractDomainObject)) {
return false;
}
return removeObject((T)o);
}
@Override
public boolean contains(Object o) {
if (! (o instanceof AbstractDomainObject)) {
return false;
}
return contains((T)o);
}
/* The following methods are not needed at the moment but we need to implement Set */
@Override
public boolean addAll(Collection<? extends T> c) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
throw new UnsupportedOperationException();
}
@Override
public boolean containsAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public boolean isEmpty() {
throw new UnsupportedOperationException();
}
@Override
public boolean removeAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public Object[] toArray() {
throw new UnsupportedOperationException();
}
@Override
public <T> T[] toArray(T[] a) {
throw new UnsupportedOperationException();
}
}