package org.nutz.lang.util; import java.util.ArrayList; import org.nutz.json.Json; import org.nutz.lang.Lang; public class LinkedIntArray { public LinkedIntArray() { this(256); } public LinkedIntArray(int size) { if (size <= 0) Lang.makeThrow("width must >0!"); this.width = size; cache = new ArrayList<int[]>(); } private int offset; private int cursor; private int width; private ArrayList<int[]> cache; public LinkedIntArray push(int e) { int[] array; int row = cursor / width; int i = cursor % width; if (cache.size() == 0 || (cursor != offset && i == 0)) { array = new int[width]; cache.add(array); } else { array = cache.get(row); } array[i] = e; cursor++; return this; } public int popFirst() { return innerGet(offset++); } public int popLast() { return innerGet(--cursor); } public LinkedIntArray popLast(int num) { for (int i = 0; i < num; i++) popLast(); return this; } public int first() { if (size() == 0) return (char) 0; return innerGet(offset); } public int last() { if (size() == 0) return (char) 0; return innerGet(cursor - 1); } public LinkedIntArray set(int index, int e) { checkBound(index); index += offset; int[] array = cache.get(index / width); array[index % width] = e; return this; } public LinkedIntArray setLast(int e) { set(this.size() - 1, e); return this; } private void checkBound(int index) { if (index >= size() || index < 0) throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size()); } public LinkedIntArray clear() { cache.clear(); cursor = 0; offset = 0; return this; } private int innerGet(int index) { int[] array = cache.get(index / width); return array[index % width]; } public int get(int index) { checkBound(index); return innerGet(index + offset); } public boolean isEmpty() { return 0 == cursor - offset; } public int size() { return cursor - offset; } public int[] toArray() { int[] re = new int[size()]; for (int i = 0; i < re.length; i++) re[i] = (char) this.get(i); return re; } public String toString() { return Lang.concat(',', toArray()).toString(); } public String toJson() { return Json.toJson(toArray()); } }