1 package jalview.datamodel;
3 import java.util.ArrayList;
4 import java.util.Iterator;
8 * An iterator which iterates over hidden column regions in a range. Works with
9 * a copy of the hidden columns collection. Intended to be used by callers
10 * OUTSIDE of HiddenColumns.
12 public class HiddenColsIterator implements Iterator<int[]>
14 // current index in hiddenColumns
15 private int currentPosition = 0;
17 // current column in hiddenColumns
18 private int[] currentRegion;
20 // local copy or reference to hiddenColumns
21 private List<int[]> localHidden;
24 * Unbounded constructor
26 HiddenColsIterator(List<int[]> hiddenColumns)
28 if (!hiddenColumns.isEmpty())
30 int last = hiddenColumns.get(hiddenColumns.size() - 1)[1];
31 init(0, last, hiddenColumns);
35 init(0, 0, hiddenColumns);
40 * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
43 * lower bound to iterate from
45 * upper bound to iterate to
47 HiddenColsIterator(int lowerBound, int upperBound,
48 List<int[]> hiddenColumns)
50 init(lowerBound, upperBound, hiddenColumns);
54 * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
57 * lower bound to iterate from
59 * upper bound to iterate to
61 private void init(int lowerBound, int upperBound,
62 List<int[]> hiddenColumns)
64 int start = lowerBound;
67 if (hiddenColumns != null)
69 localHidden = new ArrayList<>();
71 // iterate until a region overlaps with [start,end]
73 while ((i < hiddenColumns.size())
74 && (hiddenColumns.get(i)[1] < start))
79 // iterate from start to end, adding each hidden region. Positions are
80 // absolute, and all regions which *overlap* [start,end] are added.
81 while (i < hiddenColumns.size() && (hiddenColumns.get(i)[0] <= end))
83 int[] rh = hiddenColumns.get(i);
84 int[] cp = new int[2];
85 System.arraycopy(rh, 0, cp, 0, rh.length);
93 public boolean hasNext()
95 return (localHidden != null) && (currentPosition < localHidden.size());
101 currentRegion = localHidden.get(currentPosition);
103 return currentRegion;
109 localHidden.remove(--currentPosition);