package org.khelekore.prtree;
import java.util.ArrayList;
import java.util.List;
/** A node getter that multiplexes nodes from one or more NodeGetters.
* @param <N> the type of the node
*/
class MultiplexingNodeGetter<T, N> implements NodeGetter<N> {
private final List<MinMaxNodeGetter<T, N>> getters;
private int pos;
public MultiplexingNodeGetter (MinMaxNodeGetter<T, N> n1,
MinMaxNodeGetter<T, N> n2) {
getters = new ArrayList<MinMaxNodeGetter<T, N>> (2);
getters.add (n1);
getters.add (n2);
}
private MultiplexingNodeGetter (MinMaxNodeGetter<T, N> n) {
getters = new ArrayList<MinMaxNodeGetter<T, N>> (3);
getters.add (n);
}
private void add (MinMaxNodeGetter<T, N> mm) {
getters.add (mm);
}
public N getNextNode (int maxObjects) {
NodeGetter<N> getter = getters.get (pos++);
pos %= getters.size ();
return getter.getNextNode (maxObjects);
}
public boolean hasMoreNodes () {
return getters.get (pos).hasMoreNodes ();
}
public boolean hasMoreData () {
return getters.get (pos).hasMoreData ();
}
public List<MultiplexingNodeGetter<T, N>> split (int lowId, int highId) {
MinMaxNodeGetter<T, N> first = getters.get (0);
List<MinMaxNodeGetter<T, N>> splitted = first.split (lowId, highId);
MinMaxNodeGetter<T, N> splitLow = splitted.get (0);
MultiplexingNodeGetter<T, N> pLow =
new MultiplexingNodeGetter<T, N> (splitLow);
MinMaxNodeGetter<T, N> splitHigh = splitted.get (1);
MultiplexingNodeGetter<T, N> pHigh =
new MultiplexingNodeGetter<T, N> (splitHigh);
TakeCounter tcLow = splitLow.getTakeCounter ();
TakeCounter tcHigh = splitHigh.getTakeCounter ();
for (int i = 1; i < getters.size (); i++) {
MinMaxNodeGetter<T, N> g = getters.get (i);
pLow.add (g.getCopyFor (lowId, splitLow.getSize (), tcLow));
pHigh.add (g.getCopyFor (highId, splitHigh.getSize (), tcHigh));
}
List<MultiplexingNodeGetter<T, N>> ret =
new ArrayList<MultiplexingNodeGetter<T, N>> (2);
ret.add (pLow);
ret.add (pHigh);
return ret;
}
}