d98121a11f77804c8c988fda2533e3e4cd8b2820
[jalview.git] / src / jalview / datamodel / VisibleContigsIterator.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 regions in a range. Provides a
9  * special "endsAtHidden" indicator to allow callers to determine if the final
10  * visible column is adjacent to a hidden region.
11  */
12 public class VisibleContigsIterator implements Iterator<int[]>
13 {
14   private List<int[]> vcontigs = new ArrayList<>();
15
16   private int currentPosition = 0;
17
18   private boolean endsAtHidden = false;
19
20   VisibleContigsIterator(int start, int end,
21           List<int[]> hiddenColumns)
22   {
23     if (hiddenColumns != null && hiddenColumns.size() > 0)
24     {
25       int vstart = start;
26       int hideStart;
27       int hideEnd;
28
29       for (int[] region : hiddenColumns)
30       {
31         endsAtHidden = false;
32         hideStart = region[0];
33         hideEnd = region[1];
34
35         // navigate to start
36         if (hideEnd < vstart)
37         {
38           continue;
39         }
40         if (hideStart > vstart)
41         {
42           int[] contig = new int[] { vstart, hideStart - 1 };
43           vcontigs.add(contig);
44           endsAtHidden = true;
45         }
46         vstart = hideEnd + 1;
47
48         // exit if we're past the end
49         if (vstart >= end)
50         {
51           break;
52         }
53       }
54
55       if (vstart < end)
56       {
57         int[] contig = new int[] { vstart, end - 1 };
58         vcontigs.add(contig);
59         endsAtHidden = false;
60       }
61     }
62     else
63     {
64       int[] contig = new int[] { start, end - 1 };
65       vcontigs.add(contig);
66     }
67   }
68
69   @Override
70   public boolean hasNext()
71   {
72     return (currentPosition < vcontigs.size());
73   }
74
75   @Override
76   public int[] next()
77   {
78     int[] result = vcontigs.get(currentPosition);
79     currentPosition++;
80     return result;
81   }
82
83   public boolean endsAtHidden()
84   {
85     return endsAtHidden;
86   }
87 }
88