JAL-2759 Rearranged iterators
[jalview.git] / src / jalview / datamodel / BoundedStartRegionIterator.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 visible start positions of hidden column
9  * regions in a range.
10  */
11 public class BoundedStartRegionIterator implements Iterator<Integer>
12 {
13   // start position to iterate from
14   private int start;
15
16   // end position to iterate to
17   private int end;
18
19   // current index in hiddenColumns
20   private int currentPosition = 0;
21
22   // local copy or reference to hiddenColumns
23   private List<Integer> positions = null;
24
25   /**
26    * Construct an iterator over hiddenColums bounded at [lowerBound,upperBound]
27    * 
28    * @param lowerBound
29    *          lower bound to iterate from
30    * @param upperBound
31    *          upper bound to iterate to
32    * @param useCopyCols
33    *          whether to make a local copy of hiddenColumns for iteration (set
34    *          to true if calling from outwith the HiddenColumns class)
35    */
36   BoundedStartRegionIterator(int lowerBound, int upperBound,
37           List<int[]> hiddenColumns)
38   {
39     start = lowerBound;
40     end = upperBound;
41
42     if (hiddenColumns != null)
43     {
44       positions = new ArrayList<>(hiddenColumns.size());
45
46       // navigate to start, keeping count of hidden columns
47       int i = 0;
48       int hiddenSoFar = 0;
49       while ((i < hiddenColumns.size())
50               && (hiddenColumns.get(i)[0] < start + hiddenSoFar))
51       {
52         int[] region = hiddenColumns.get(i);
53         hiddenSoFar += region[1] - region[0] + 1;
54         i++;
55       }
56
57       // iterate from start to end, adding start positions of each
58       // hidden region. Positions are visible columns count, not absolute
59       while (i < hiddenColumns.size()
60               && (hiddenColumns.get(i)[0] <= end + hiddenSoFar))
61       {
62         int[] region = hiddenColumns.get(i);
63         positions.add(region[0] - hiddenSoFar);
64         hiddenSoFar += region[1] - region[0] + 1;
65         i++;
66       }
67     }
68     else
69     {
70       positions = new ArrayList<>();
71     }
72
73   }
74
75   @Override
76   public boolean hasNext()
77   {
78     return (currentPosition < positions.size());
79   }
80
81   /**
82    * Get next hidden region start position
83    * 
84    * @return the start position in *visible* coordinates
85    */
86   @Override
87   public Integer next()
88   {
89     int result = positions.get(currentPosition);
90     currentPosition++;
91     return result;
92   }
93 }
94