1 package jalview.datamodel;
3 import java.util.ArrayList;
4 import java.util.Iterator;
8 * An iterator which iterates over regions in a range. Works with a copy of the
9 * collection of regions.
11 public class RangeIterator implements Iterator<int[]>
13 // current index in regionsList
14 private int currentPosition = 0;
16 // current column in regionsList
17 private int[] currentRegion;
19 // local copy or reference to regionsList
20 private List<int[]> localRegions;
23 * Unbounded constructor
26 * list of regions to iterate over
28 RangeIterator(List<int[]> regionsList)
30 if (!regionsList.isEmpty())
32 int last = regionsList.get(regionsList.size() - 1)[1];
33 init(0, last, regionsList);
37 init(0, 0, regionsList);
42 * Construct an iterator over regionsList bounded at [lowerBound,upperBound]
45 * lower bound to iterate from
47 * upper bound to iterate to
49 * list of regions to iterate over
51 RangeIterator(int lowerBound, int upperBound,
52 List<int[]> regionsList)
54 init(lowerBound, upperBound, regionsList);
58 * Construct an iterator over regionsList bounded at [lowerBound,upperBound]
61 * lower bound to iterate from
63 * upper bound to iterate to
65 private void init(int lowerBound, int upperBound,
66 List<int[]> regionsList)
68 int start = lowerBound;
71 if (regionsList != null)
73 localRegions = new ArrayList<>();
75 // iterate until a region overlaps with [start,end]
77 while ((i < regionsList.size()) && (regionsList.get(i)[1] < start))
82 // iterate from start to end, adding each region. Positions are
83 // absolute, and all regions which *overlap* [start,end] are added.
84 while (i < regionsList.size() && (regionsList.get(i)[0] <= end))
86 int[] rh = regionsList.get(i);
87 int[] cp = new int[2];
88 System.arraycopy(rh, 0, cp, 0, rh.length);
96 public boolean hasNext()
98 return (localRegions != null) && (currentPosition < localRegions.size());
104 currentRegion = localRegions.get(currentPosition);
106 return currentRegion;
112 localRegions.remove(--currentPosition);