JAL-2759 Rationalise VisibleColsIterator and HiddenColsIterator
[jalview.git] / src / jalview / datamodel / RangeElementsIterator.java
1 package jalview.datamodel;
2
3 import java.util.Iterator;
4 import java.util.NoSuchElementException;
5
6 /**
7  * Iterator over each element in a set of ranges i.e. if ranges is {[3,6],
8  * [12,15]} it will iterate over {3,4,5,6,12,13,14,15}. Uses a local copy of the
9  * set of ranges.
10  * 
11  * @author kmourao
12  *
13  */
14 public class RangeElementsIterator implements Iterator<Integer>
15 {
16   private int last;
17
18   private int current;
19
20   private int next;
21
22   private Iterator<int[]> rangeIterator;
23
24   private int[] nextRange = null;
25
26   RangeElementsIterator(int from, int to, Iterator<int[]> it)
27   {
28     last = to;
29     current = from;
30     next = from;
31     rangeIterator = it;
32     if (rangeIterator.hasNext())
33     {
34       nextRange = rangeIterator.next();
35     }
36     checkNextRange();
37   }
38
39   @Override
40   public boolean hasNext()
41   {
42     return next <= last;
43   }
44
45   @Override
46   public Integer next()
47   {
48     if (next > last)
49     {
50       throw new NoSuchElementException();
51     }
52
53     current = next;
54
55     // recalculate next
56     next++;
57
58     // if there are more ranges need to check if next is in a range
59     checkNextRange();
60     return current;
61   }
62
63   /**
64    * Check how next position relates to next range, and update next position if
65    * necessary
66    */
67   private void checkNextRange()
68   {
69     if (nextRange != null && next >= nextRange[0])
70     {
71       next = nextRange[1] + 1;
72       if (rangeIterator.hasNext())
73       {
74         nextRange = rangeIterator.next();
75       }
76       else
77       {
78         nextRange = null;
79       }
80
81     }
82   }
83
84   @Override
85   public void remove()
86   {
87     throw new UnsupportedOperationException();
88   }
89 }