package btools.codec; /** * Special integer fifo suitable for 3-pass encoding */ public class IntegerFifo3Pass { private int[] a; private int size; private int pos; private int pass; public IntegerFifo3Pass(int capacity) { a = capacity < 4 ? new int[4] : new int[capacity]; } /** * Starts a new encoding pass and resets the reading pointer * from the stats collected in pass2 and writes that to the given context */ public void init() { pass++; pos = 0; } /** * writes to the fifo in pass2 */ public void add(int value) { if (pass == 2) { if (size == a.length) { int[] aa = new int[2 * size]; System.arraycopy(a, 0, aa, 0, size); a = aa; } a[size++] = value; } } /** * reads from the fifo in pass3 (in pass1/2 returns just 1) */ public int getNext() { return pass == 3 ? get(pos++) : 1; } private int get(int idx) { if (idx >= size) { throw new IndexOutOfBoundsException("list size=" + size + " idx=" + idx); } return a[idx]; } }