/**
*
*/
package cz.cuni.mff.peckam.java.origamist.unused.utils;
import cz.cuni.mff.peckam.java.origamist.math.Vector;
/**
*
*
* @author Martin Pecka
*/
public class MultiDimIntervalTree<K extends Comparable<? super K>, V> extends
IntervalTree<K, MultiDimIntervalTree<K, V>.ValueOrTree>
{
/** */
private static final long serialVersionUID = 5640892912045611L;
protected int dimension;
protected int size = 0;
/**
* @param dimension
*/
public MultiDimIntervalTree(int dimension)
{
this.dimension = dimension;
}
/**
* @return the dimension
*/
public int getDimension()
{
return dimension;
}
public V put(Vector<Interval<K>> key, V value)
{
if (this.dimension == 1) {
Interval<K> interval = key.get(key.getDimension() - 1);
IntervalEntry entry = getIntervalEntry(interval);
if (entry == null) {
put(interval, new ValueOrTree(value));
size++;
return null;
} else {
ValueOrTree old = entry.setValue(new ValueOrTree(value));
return old == null ? null : old.value;
}
} else {
Interval<K> interval = key.get(key.getDimension() - this.dimension);
IntervalEntry entry = getIntervalEntry(interval);
if (entry == null) {
put(interval, new ValueOrTree());
entry = getIntervalEntry(interval);
}
int oldSize = entry.value.tree.size();
V result = entry.value.tree.put(key, value);
if (oldSize != entry.value.tree.size())
size++;
return result;
}
}
public V remove(Vector<Interval<K>> key)
{
if (this.dimension == 1) {
IntervalEntry entry = getIntervalEntry(key.get(key.getDimension() - 1));
ValueOrTree old = remove(entry.getKey());
if (old != null)
size--;
return old == null ? null : old.value;
} else {
Interval<K> interval = key.get(key.getDimension() - this.dimension);
IntervalEntry entry = getIntervalEntry(interval);
if (entry == null)
return null;
int oldSize = entry.value.tree.size();
V returnVal = entry.value.tree.remove(key);
if (oldSize != entry.value.tree.size())
size--;
if (entry.value.tree.size() == 0)
remove(entry.getKey());
return returnVal;
}
}
public V get(Vector<Interval<K>> key)
{
if (this.dimension == 1) {
IntervalEntry entry = getIntervalEntry(key.get(key.getDimension() - 1));
if (entry == null)
return null;
return entry.value.value;
} else {
IntervalEntry entry = getIntervalEntry(key.get(key.getDimension() - this.dimension));
if (entry == null)
return null;
return entry.value.tree.get(key);
}
}
public boolean contains(Vector<Interval<K>> key)
{
if (this.dimension == 1) {
IntervalEntry entry = getIntervalEntry(key.get(key.getDimension() - 1));
return entry != null;
} else {
IntervalEntry entry = getIntervalEntry(key.get(key.getDimension() - this.dimension));
if (entry == null)
return false;
return entry.value.tree.contains(key);
}
}
@Override
public int size()
{
return this.size;
}
class ValueOrTree
{
V value = null;
MultiDimIntervalTree<K, V> tree = null;
public ValueOrTree()
{
tree = new MultiDimIntervalTree<K, V>(dimension - 1);
}
public ValueOrTree(V value)
{
this.value = value;
}
@Override
public String toString()
{
return "ValueOrTree [value=" + value + ", tree=" + tree + "]";
}
}
}