- return new VisibleContigsIterator(start, end + 1, true);
- }
- }
-
- /**
- * A local iterator which iterates over hidden column regions in a range.
- * Intended for use ONLY within the HiddenColumns class, because it works
- * directly with the hiddenColumns collection without locking (callers should
- * lock hiddenColumns).
- */
- private class RegionsIterator implements Iterator<int[]>
- {
- // start position to iterate from
- private int start;
-
- // end position to iterate to
- private int end;
-
- // current index in hiddenColumns
- private int currentPosition = 0;
-
- // current column in hiddenColumns
- private int[] nextRegion = null;
-
- private int[] currentRegion = null;
-
- private int removedIndex = -1;
-
- // Constructor with bounds
- RegionsIterator(int lowerBound, int upperBound)
- {
- start = lowerBound;
- end = upperBound;
-
- if (hiddenColumns != null)
- {
- // iterate until a region overlaps with [start,end]
- currentPosition = 0;
- while ((currentPosition < hiddenColumns.size())
- && (hiddenColumns.get(currentPosition)[1] < start))
- {
- currentPosition++;
- }
- if (currentPosition < hiddenColumns.size())
- {
- nextRegion = hiddenColumns.get(currentPosition);
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (hiddenColumns != null) && (nextRegion != null)
- && (nextRegion[0] <= end);
- }
-
- @Override
- public int[] next()
- {
- currentRegion = nextRegion;
- currentPosition++;
- if (currentPosition < hiddenColumns.size())
- {
- nextRegion = hiddenColumns.get(currentPosition);
- }
- else
- {
- nextRegion = null;
- }
- return currentRegion;
- }
-
- @Override
- public void remove()
- {
- if ((currentRegion != null) && (removedIndex != currentPosition))
- {
- currentPosition--;
- hiddenColumns.subList(currentPosition, currentPosition + 1).clear();
- removedIndex = currentPosition;
- }
- else
- {
- // already removed element last returned by next()
- // or next() has not yet been called
- throw new IllegalStateException();
- }
- }
-
- }
-
- /**
- * A local iterator which reverse iterates over hidden column regions in a
- * range. Intended for use ONLY within the HiddenColumns class, because it
- * works directly with the hiddenColumns collection without locking (callers
- * should lock hiddenColumns).
- */
- private class ReverseRegionsIterator implements Iterator<int[]>
- {
- // start position to iterate to
- private int start;
-
- // end position to iterate from
- private int end;
-
- // current index in hiddenColumns
- private int currentPosition = 0;
-
- // current column in hiddenColumns
- private int[] nextRegion = null;
-
- // Constructor with bounds
- ReverseRegionsIterator(int lowerBound, int upperBound)
- {
- init(lowerBound, upperBound);
- }
-
- /**
- * Construct an iterator over hiddenColums bounded at
- * [lowerBound,upperBound]
- *
- * @param lowerBound
- * lower bound to iterate to
- * @param upperBound
- * upper bound to iterate from
- */
- private void init(int lowerBound, int upperBound)
- {
- start = lowerBound;
- end = upperBound;
-
- if (hiddenColumns != null)
- {
- // iterate until a region overlaps with [start,end]
- currentPosition = hiddenColumns.size() - 1;
- while (currentPosition >= 0
- && hiddenColumns.get(currentPosition)[1] > end)
- {
- currentPosition--;
- }
- if (currentPosition >= 0)
- {
- nextRegion = hiddenColumns.get(currentPosition);
- }
- }
- }
-
- @Override
- public boolean hasNext()
- {
- return (hiddenColumns != null) && (nextRegion != null)
- && (nextRegion[1] >= start);
- }
-
- @Override
- public int[] next()
- {
- int[] region = nextRegion;
- currentPosition--;
- if (currentPosition >= 0)
- {
- nextRegion = hiddenColumns.get(currentPosition);
- }
- else
- {
- nextRegion = null;
- }
- return region;
- }
-
- }
-
- /**
- * An iterator which iterates over hidden column regions in a range. Works
- * with a copy of the hidden columns collection. Intended to be used by
- * callers OUTSIDE of HiddenColumns.
- */
- private class BoundedHiddenColsIterator implements Iterator<int[]>
- {
- // start position to iterate from
- private int start;
-
- // end position to iterate to
- private int end;
-
- // current index in hiddenColumns
- private int currentPosition = 0;
-
- // current column in hiddenColumns
- private int[] currentRegion;
-
- // local copy or reference to hiddenColumns
- private List<int[]> localHidden;
-
- /**
- * Unbounded constructor
- */
- BoundedHiddenColsIterator()
- {
- if (hiddenColumns != null)
- {
- int last = hiddenColumns.get(hiddenColumns.size() - 1)[1];
- init(0, last);
- }
- else
- {
- init(0, 0);
- }
- }
-
- /**
- * Construct an iterator over hiddenColums bounded at
- * [lowerBound,upperBound]
- *
- * @param lowerBound
- * lower bound to iterate from
- * @param upperBound
- * upper bound to iterate to
- */
- BoundedHiddenColsIterator(int lowerBound, int upperBound)
- {
- init(lowerBound, upperBound);
- }
-
- /**
- * Construct an iterator over hiddenColums bounded at
- * [lowerBound,upperBound]
- *
- * @param lowerBound
- * lower bound to iterate from
- * @param upperBound
- * upper bound to iterate to
- */
- private void init(int lowerBound, int upperBound)
- {
- start = lowerBound;
- end = upperBound;
-