package jo.sm.data;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import jo.vecmath.Point2i;
public class BooleanMatrix2D implements Iterable<Point2i> {
private Map<Integer, RLEBooleanArray> mValues;
public BooleanMatrix2D() {
mValues = new HashMap<>();
}
public boolean isEmpty() {
return mValues.isEmpty();
}
@Override
public Iterator<Point2i> iterator() {
return new BooleanMatrix2DIterator();
}
public void set(int i, int j, boolean v) {
RLEBooleanArray arr = mValues.get(i);
if (arr == null) {
if (v) {
arr = new RLEBooleanArray();
mValues.put(i, arr);
arr.set(j, true);
}
} else {
arr.set(j, v);
if (arr.isEmpty()) {
mValues.remove(i);
}
}
}
public boolean get(int i, int j) {
RLEBooleanArray arr = mValues.get(i);
if (arr == null) {
return false;
} else {
return arr.get(j);
}
}
class BooleanMatrix2DIterator implements Iterator<Point2i> {
private int mIIdx;
private Integer[] mIs;
private Iterator<Integer> mJs;
public BooleanMatrix2DIterator() {
mIs = mValues.keySet().toArray(new Integer[0]);
Arrays.sort(mIs);
mIIdx = 0;
if (mIs.length == 0) {
mJs = null;
} else {
mJs = mValues.get(mIs[mIIdx]).iterator();
}
}
@Override
public boolean hasNext() {
return mJs != null;
}
@Override
public Point2i next() {
Point2i ret = new Point2i(mIs[mIIdx], mJs.next());
if (!mJs.hasNext()) {
mIIdx++;
if (mIIdx >= mIs.length) {
mJs = null;
} else {
mJs = mValues.get(mIs[mIIdx]).iterator();
}
}
return ret;
}
@Override
public void remove() {
throw new IllegalStateException("Not implemented");
}
}
}