package org.basex.gui.view.map;
import java.util.Arrays;
import java.util.Iterator;
import org.basex.util.Util;
/**
* This class organizes all map rectangles in a simple list.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class MapRects implements Iterable<MapRect> {
/** Value array. */
MapRect[] list = new MapRect[8];
/** Sorted values. */
MapRect[] sorted;
/** Number of entries. */
int size;
/**
* Default constructor.
*/
MapRects() {
this(8);
}
/**
* Constructor, specifying an initial list size.
* @param is initial size of the list
*/
private MapRects(final int is) {
list = new MapRect[is];
}
/**
* Adds a new value.
* @param v value to be added
*/
void add(final MapRect v) {
if(size == list.length) list = Arrays.copyOf(list, size << 1);
list[size++] = v;
}
/**
* Adds several new values.
* @param v values to be added
*/
void add(final MapRects v) {
for(final MapRect m : v) add(m);
}
/**
* Returns the specified value.
* @param i value index
* @return value
*/
MapRect get(final int i) {
return list[i];
}
/**
* Resets the integer list.
*/
void reset() {
size = 0;
}
/**
* Returns the position of the specified value or -1 if it has not been found.
* @param r rectangle (pre value) to be found
* @return rectangle position of -1
*/
int find(final MapRect r) {
if(sorted == null) sort();
final int p = r.pre;
int l = 0;
int h = size - 1;
while(l <= h) {
final int m = l + h >>> 1;
final int c = sorted[m].pre - p;
if(c == 0) return m;
if(c < 0) l = m + 1;
else h = m - 1;
}
return -1;
}
/**
* Creates a sorted array. If the original array is already sorted,
* the same reference is used.
*/
private void sort() {
int i = Integer.MIN_VALUE;
for(final MapRect r : this) {
if(i > r.pre) {
sorted = Arrays.copyOf(list, size);
Arrays.sort(sorted);
return;
}
i = r.pre;
}
sorted = list;
}
@Override
public Iterator<MapRect> iterator() {
return new Iterator<MapRect>() {
private int c = -1;
@Override
public boolean hasNext() { return ++c < size; }
@Override
public MapRect next() { return list[c]; }
@Override
public void remove() { Util.notexpected(); }
};
}
/**
* Creates a copy of the rectangles.
* @return copy
*/
MapRects copy() {
final MapRects rects = new MapRects(size);
rects.add(this);
return rects;
}
}