/*
* 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.sorted;
import java.util.Comparator;
import javolution.util.function.Equalities;
import javolution.util.function.Equality;
import javolution.util.internal.comparator.WrapperComparatorImpl;
import javolution.util.internal.table.FastTableImpl;
/**
* The default {@link javolution.util.FastSortedTable FastSortedTable} implementation.
*/
public class FastSortedTableImpl<E> extends SortedTableView<E> {
private static final long serialVersionUID = 0x600L; // Version.
private final FastTableImpl<E> table = new FastTableImpl<E>(Equalities.STANDARD);
private final Comparator<? super E> comparator;
public FastSortedTableImpl(Comparator<? super E> comparator) {
super(null);
this.comparator = comparator;
}
@Override
public void add(int index, E element) {
table.add(index, element);
}
@Override
public void clear() {
table.clear();
}
@SuppressWarnings("unchecked")
@Override
public Equality<? super E> comparator() {
return (Equality<? super E>) ((comparator instanceof Equality) ? comparator :
new WrapperComparatorImpl<E>(comparator));
}
@Override
public E get(int index) {
return table.get(index);
}
@Override
public int positionOf(E element) {
return positionOf(element, 0, size());
}
private int positionOf(E element, int start, int length) {
if (length == 0) return -start - 1;
int half = length >> 1;
int cmp = comparator.compare(element, get(start + half));
if (cmp == 0) return start + half; // Found.
if (cmp < 0) return positionOf(element, start, half);
return positionOf(element, start + half + 1, length - half - 1);
}
@Override
public E remove(int index) {
return table.remove(index);
}
@Override
public E set(int index, E element) {
return table.set(index, element);
}
@Override
public int size() {
return table.size();
}
}