import tart.core.Math.max;
/** Array-backed list type. */
final class ArrayList[%ElementType] : List[ElementType] {
private {
var data:ElementType[];
var _length:int;
def grow(amount:int) {
let nlength = self._length + amount;
if data.length < nlength {
let ndata = ElementType[](nlength + nlength / 2 + 16);
ElementType[].copyElements(ndata, 0, data, 0, self._length);
self.data = ndata;
}
self._length = nlength;
}
}
def construct(data:ElementType...; initialCapacity:int = 0) {
initialCapacity = max(initialCapacity, data.length);
self.data = ElementType[](initialCapacity);
ElementType[].copyElements(self.data, 0, data, 0, data.length);
_length = data.length;
}
def construct(data:Array[ElementType], initialCapacity:int = 0) {
initialCapacity = max(initialCapacity, data.length);
self.data = ElementType[](initialCapacity);
ElementType[].copyElements(self.data, 0, data, 0, data.length);
_length = data.length;
}
def add(e:ElementType) {
}
def [index:int]:ElementType {
get {
Preconditions.checkIndex(index >= 0);
Preconditions.checkIndex(index < _length);
return data[index];
}
set {
Preconditions.checkIndex(index >= 0);
Preconditions.checkIndex(index < _length);
data[index] = value;
}
}
def length:int {
get { return _length; }
}
def iterate -> Iterator[ElementType] {
return ArrayListIterator(self);
}
private final class ArrayListIterator : Iterator[ElementType], HasLength {
private var list:ArrayList;
private var index:int;
def construct(list:ArrayList) {
self.list = list;
self.index = 0;
}
def next -> ElementType or void {
if (self.index < self.list.length) {
return self.list.data[self.index++];
} else {
return;
}
}
def length:long { get { return list.length; } }
}
}
Tuesday, September 8, 2009
ArrayList
The compiler is getting to the point where I can start to sketch out some of the basic container classes. Here's what the ArrayList class looks like:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment