sclass ShortBuffer is Iterable { short[] data; int size; *() {} *(int size) { if (size != 0) data = new short[size]; } *(Iterable l) { if (l cast Cl) allocate(l.size()); addAll(l); } void add(short i) { if (size >= lShortArray(data)) { data = resizeShortArray(data, Math.max(1, toShort(Math.min(maximumSafeArraySize(), lShortArray(data)*2L)))); if (size >= data.length) fail("ShortBuffer too large: " + size); } data[size++] = i; } void allocate(int n) { data = resizeShortArray(data, max(n, size())); } void setSize(int n) { data = resizeShortArray(data, n); size = min(l(data), size); } void addAll(Iterable l) { if (l != null) for (i : l) add(i); } void addAll(short... l) { if (l != null) for (short i : l) add(i); } // Note: may return the internal array short[] toArray aka toShortArray() { ret size == 0 ? null : resizeShortArray(data, size); } // abandoned version /*L toList() { ret intArrayToList(data, 0, size); }*/ // now all these return a virtual list L toList aka asList aka asVirtualList() { ret new RandomAccessAbstractList { public int size() { ret size; } public Short get(int i) { ret ShortBuffer.this.get(i); } public Short set(int i, Short val) { Short a = get(i); data[i] = val; ret a; } }; } void reset { size = 0; } void clear { reset(); } int size() { ret size; } bool isEmpty() { ret size == 0; } short get(int idx) { if (idx >= size) fail("Index out of range: " + idx + "/" + size); ret data[idx]; } void set(int idx, short value) { if (idx >= size) fail("Index out of range: " + idx + "/" + size); data[idx] = value; } short popLast() { if (size == 0) fail("empty buffer"); ret data[--size]; } short last() { ret data[size-1]; } short nextToLast() { ret data[size-2]; } toString { ret squareBracket(joinWithSpace(toList())); } public Iterator iterator() { ret new ItIt { int i = 0; public bool hasNext() { ret i < size; } public Short next() { //if (!hasNext()) fail("Index out of bounds: " + i); ret data[i++]; } }; } public ShortIterator shortIterator() { ret new ShortIterator { int i = 0; public bool hasNext() { ret i < size; } public short next() { //if (!hasNext()) fail("Index out of bounds: " + i); ret data[i++]; } toString { ret "Iterator@" + i + " over " + ShortBuffer.this; } }; } void trimToSize { data = resizeShortArray(data, size); } }