/*
* Javolution - Java(TM) Solution for Real-Time and Embedded Systems
* Copyright (C) 2012 - Javolution (http://javolution.org/)
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software is
* freely granted, provided that this notice is preserved.
*/
package javolution.util.internal.table;
import java.util.Collection;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import javolution.util.function.Equality;
import javolution.util.internal.collection.CollectionView;
import javolution.util.service.TableService;
/**
* Table view implementation; can be used as root class for implementations
* if target is {@code null}.
*/
public abstract class TableView<E> extends CollectionView<E> implements TableService<E> {
private static final long serialVersionUID = 0x600L; // Version.
/**
* The view constructor or root class constructor if target is {@code null}.
*/
public TableView(TableService<E> target) {
super(target);
}
@Override
public abstract void add(int index, E element);
@Override
public boolean addAll(int index, Collection<? extends E> c) {
return subList(index, index).addAll(c);
}
@Override
public void addFirst(E element) {
add(0, element);
}
@Override
public void addLast(E element) {
add(size(), element);
}
@Override
public abstract void clear();
@Override
public final boolean contains(Object o) {
return indexOf(o) >= 0;
}
@Override
public Iterator<E> descendingIterator() {
return new ReversedTableImpl<E>(this).iterator();
}
@Override
public final E element() {
return getFirst();
}
@Override
public abstract E get(int index);
@Override
public E getFirst() {
if (size() == 0) emptyError();
return get(0);
}
@Override
public E getLast() {
if (size() == 0) emptyError();
return get(size() - 1);
}
@SuppressWarnings("unchecked")
@Override
public int indexOf(Object o) {
Equality<Object> cmp = (Equality<Object>) this.comparator();
for (int i = 0, n = size(); i < n; i++) {
if (cmp.equal(o, get(i))) return i;
}
return -1;
}
@Override
public final boolean isEmpty() {
return size() == 0;
}
@Override
public Iterator<E> iterator() {
return listIterator(0);
}
@SuppressWarnings("unchecked")
@Override
public int lastIndexOf(Object o) {
Equality<Object> cmp = (Equality<Object>) this.comparator();
for (int i = size() - 1; i >= 0; i--) {
if (cmp.equal(o, get(i))) return i;
}
return -1;
}
@Override
public final ListIterator<E> listIterator() {
return listIterator(0);
}
@Override
public ListIterator<E> listIterator(int index) {
return new TableIteratorImpl<E>(this, index);
}
@Override
public final boolean offer(E e) {
return offerLast(e);
}
@Override
public final boolean offerFirst(E e) {
addFirst(e);
return true;
}
@Override
public final boolean offerLast(E e) {
addLast(e);
return true;
}
@Override
public final E peek() {
return peekFirst();
}
@Override
public E peekFirst() {
return (size() == 0) ? null : getFirst();
}
@Override
public E peekLast() {
return (size() == 0) ? null : getLast();
}
@Override
public final E poll() {
return pollFirst();
}
@Override
public E pollFirst() {
return (size() == 0) ? null : removeFirst();
}
@Override
public E pollLast() {
return (size() == 0) ? null : removeLast();
}
@Override
public final E pop() {
return removeFirst();
}
@Override
public final void push(E e) {
addFirst(e);
}
@Override
public final E remove() {
return removeFirst();
}
@Override
public abstract E remove(int index);
@Override
public final boolean remove(Object o) {
int i = indexOf(o);
if (i < 0) return false;
remove(i);
return true;
}
@Override
public E removeFirst() {
if (size() == 0) emptyError();
return remove(0);
}
@Override
public boolean removeFirstOccurrence(Object o) {
int i = indexOf(o);
if (i < 0) return false;
remove(i);
return true;
}
@Override
public E removeLast() {
if (size() == 0) emptyError();
return remove(size() - 1);
}
@Override
public boolean removeLastOccurrence(Object o) {
int i = lastIndexOf(o);
if (i < 0) return false;
remove(i);
return true;
}
@Override
public abstract E set(int index, E element);
@Override
public abstract int size();
@Override
public TableService<E>[] split(int n, boolean updateable) {
return SubTableImpl.splitOf(this, n, updateable); // Sub-views over this.
}
@Override
public TableService<E> subList(int fromIndex, int toIndex) {
return new SubTableImpl<E>(this, fromIndex, toIndex);
}
/** Throws NoSuchElementException */
protected void emptyError() {
throw new NoSuchElementException("Empty Table");
}
/** Throws IndexOutOfBoundsException */
protected void indexError(int index) {
throw new IndexOutOfBoundsException("index: " + index + ", size: "
+ size());
}
/** Returns the actual target */
@Override
protected TableService<E> target() {
return (TableService<E>) super.target();
}
}