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