aa3f4adb6aef2ae5110df854776a89d2d0275b8d
[jalview.git] / src / jalview / datamodel / BoundedHiddenColsIterator.java
1 package jalview.datamodel;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 /**
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.
11  */
12 public class BoundedHiddenColsIterator implements Iterator<int[]>
13 {
14   // start position to iterate from
15   private int start;
16
17   // end position to iterate to
18   private int end;
19
20   // current index in hiddenColumns
21   private int currentPosition = 0;
22
23   // current column in hiddenColumns
24   private int[] currentRegion;
25
26   // local copy or reference to hiddenColumns
27   private List<int[]> localHidden;
28
29   /**
30    * Unbounded constructor
31    */
32   BoundedHiddenColsIterator(List<int[]> hiddenColumns)
33   {
34     if (hiddenColumns != null)
35     {
36       int last = hiddenColumns.get(hiddenColumns.size() - 1)[1];
37       init(0, last, hiddenColumns);
38     }
39     else
40     {
41       init(0, 0, hiddenColumns);
42     }
43   }
44
45   /**
46    * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
47    * 
48    * @param lowerBound
49    *          lower bound to iterate from
50    * @param upperBound
51    *          upper bound to iterate to
52    */
53   BoundedHiddenColsIterator(int lowerBound, int upperBound,
54           List<int[]> hiddenColumns)
55   {
56     init(lowerBound, upperBound, hiddenColumns);
57   }
58
59   /**
60    * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
61    * 
62    * @param lowerBound
63    *          lower bound to iterate from
64    * @param upperBound
65    *          upper bound to iterate to
66    */
67   private void init(int lowerBound, int upperBound,
68           List<int[]> hiddenColumns)
69   {
70     start = lowerBound;
71     end = upperBound;
72
73     if (hiddenColumns != null)
74     {
75       localHidden = new ArrayList<>();
76
77       // iterate until a region overlaps with [start,end]
78       int i = 0;
79       while ((i < hiddenColumns.size())
80               && (hiddenColumns.get(i)[1] < start))
81       {
82         i++;
83       }
84
85       // iterate from start to end, adding each hidden region. Positions are
86       // absolute, and all regions which *overlap* [start,end] are added.
87       while (i < hiddenColumns.size() && (hiddenColumns.get(i)[0] <= end))
88       {
89         int[] rh = hiddenColumns.get(i);
90         int[] cp = new int[2];
91         System.arraycopy(rh, 0, cp, 0, rh.length);
92         localHidden.add(cp);
93         i++;
94       }
95     }
96   }
97
98   @Override
99   public boolean hasNext()
100   {
101     return (localHidden != null) && (currentPosition < localHidden.size());
102   }
103
104   @Override
105   public int[] next()
106   {
107     currentRegion = localHidden.get(currentPosition);
108     currentPosition++;
109     return currentRegion;
110   }
111 }