- else
- {
- try
- {
- LOCK.readLock().lock();
- return new VisibleContigsIterator(start, end + 1, hiddenColumns);
- } finally
- {
- LOCK.readLock().unlock();
- }
- }
- }
-
- /**
- * An iterator which iterates over visible regions in a range. The range is
- * specified in terms of visible column positions. Provides a special
- * "endsAtHidden" indicator to allow callers to determine if the final visible
- * column is adjacent to a hidden region.
- */
- public class VisibleBlocksVisBoundsIterator implements Iterator<int[]>
- {
- private List<int[]> vcontigs = new ArrayList<>();
-
- private int currentPosition = 0;
-
- private boolean endsAtHidden = false;
-
- /**
- * Constructor for iterator over visible regions in a range.
- *
- * @param start
- * start position in terms of visible column position
- * @param end
- * end position in terms of visible column position
- * @param usecopy
- * whether to use a local copy of hidden columns
- */
- VisibleBlocksVisBoundsIterator(int start, int end, boolean usecopy)
- {
- /* actually this implementation always uses a local copy but this may change in future */
- try
- {
- if (usecopy)
- {
- LOCK.readLock().lock();
- }
-
- if (hiddenColumns != null && hiddenColumns.size() > 0)
- {
- int blockStart = start;
- int blockEnd = end;
- int hiddenSoFar = 0;
- int visSoFar = 0;
-
- // iterate until a region begins within (start,end]
- int i = 0;
- while ((i < hiddenColumns.size())
- && (hiddenColumns.get(i)[0] <= blockStart + hiddenSoFar))
- {
- hiddenSoFar += hiddenColumns.get(i)[1] - hiddenColumns.get(i)[0]
- + 1;
- i++;
- }
-
- blockStart += hiddenSoFar; // convert start to absolute position
- blockEnd += hiddenSoFar; // convert end to absolute position
-
- // iterate from start to end, adding each visible region. Positions
- // are
- // absolute, and all hidden regions which overlap [start,end] are
- // used.
- while (i < hiddenColumns.size()
- && (hiddenColumns.get(i)[0] <= blockEnd))
- {
- int[] region = hiddenColumns.get(i);
-
- // end position of this visible region is either just before the
- // start of the next hidden region, or the absolute position of
- // 'end', whichever is lowest
- blockEnd = Math.min(blockEnd, region[0] - 1);
-
- vcontigs.add(new int[] { blockStart, blockEnd });