Updated with latest from mchmmer branch
[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(Iterator<int[]> it)
27   {
28     rangeIterator = it;
29     if (rangeIterator.hasNext())
30     {
31       nextRange = rangeIterator.next();
32       next = nextRange[0];
33       last = nextRange[1];
34     }
35   }
36
37   @Override
38   public boolean hasNext()
39   {
40     return rangeIterator.hasNext() || next <= last;
41   }
42
43   @Override
44   public Integer next()
45   {
46     if (!hasNext())
47     {
48       throw new NoSuchElementException();
49     }
50
51     current = next;
52
53     // recalculate next
54     next++;
55
56     // if there are more ranges need to check if next is in a range
57     checkNextRange();
58     return current;
59   }
60
61   /**
62    * Check how next position relates to next range, and update next position if
63    * necessary
64    */
65   private void checkNextRange()
66   {
67     if (nextRange != null && next > nextRange[1])
68     {
69       if (rangeIterator.hasNext())
70       {
71         nextRange = rangeIterator.next();
72         next = nextRange[0];
73         last = nextRange[1];
74       }
75       else
76       {
77         nextRange = null;
78       }
79
80     }
81   }
82
83   @Override
84   public void remove()
85   {
86     throw new UnsupportedOperationException();
87   }
88 }