package jalview.datamodel; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * An iterator which iterates over hidden column regions in a range. Works with * a copy of the hidden columns collection. Intended to be used by callers * OUTSIDE of HiddenColumns. */ public class HiddenColsIterator implements Iterator { // current index in hiddenColumns private int currentPosition = 0; // current column in hiddenColumns private int[] currentRegion; // local copy or reference to hiddenColumns private List localHidden; /** * Unbounded constructor */ HiddenColsIterator(List hiddenColumns) { if (!hiddenColumns.isEmpty()) { int last = hiddenColumns.get(hiddenColumns.size() - 1)[1]; init(0, last, hiddenColumns); } else { init(0, 0, hiddenColumns); } } /** * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound] * * @param lowerBound * lower bound to iterate from * @param upperBound * upper bound to iterate to */ HiddenColsIterator(int lowerBound, int upperBound, List hiddenColumns) { init(lowerBound, upperBound, hiddenColumns); } /** * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound] * * @param lowerBound * lower bound to iterate from * @param upperBound * upper bound to iterate to */ private void init(int lowerBound, int upperBound, List hiddenColumns) { int start = lowerBound; int end = upperBound; if (hiddenColumns != null) { localHidden = new ArrayList<>(); // iterate until a region overlaps with [start,end] int i = 0; while ((i < hiddenColumns.size()) && (hiddenColumns.get(i)[1] < start)) { i++; } // iterate from start to end, adding each hidden region. Positions are // absolute, and all regions which *overlap* [start,end] are added. while (i < hiddenColumns.size() && (hiddenColumns.get(i)[0] <= end)) { int[] rh = hiddenColumns.get(i); int[] cp = new int[2]; System.arraycopy(rh, 0, cp, 0, rh.length); localHidden.add(cp); i++; } } } @Override public boolean hasNext() { return (localHidden != null) && (currentPosition < localHidden.size()); } @Override public int[] next() { currentRegion = localHidden.get(currentPosition); currentPosition++; return currentRegion; } }