package btools.codec; /** * Simple container for a list of lists of integers */ public class LinkedListContainer { private int[] ia; // prev, data, prev, data, ... private int size; private int[] startpointer; // 0=void, odd=head-data-cell private int listpointer; /** * Construct a container for the given number of lists *
* If no default-buffer is given, an int[nlists*4] is constructed, * able to hold 2 entries per list on average * * @param nlists the number of lists * @param defaultbuffer an optional data array for re-use (gets replaced if too small) */ public LinkedListContainer(int nlists, int[] defaultbuffer) { ia = defaultbuffer == null ? new int[nlists * 4] : defaultbuffer; startpointer = new int[nlists]; } /** * Add a data element to the given list * * @param listNr the list to add the data to * @param data the data value */ public void addDataElement(int listNr, int data) { if (size + 2 > ia.length) { resize(); } ia[size++] = startpointer[listNr]; startpointer[listNr] = size; ia[size++] = data; } /** * Initialize a list for reading * * @param listNr the list to initialize * @return the number of entries in that list */ public int initList(int listNr) { int cnt = 0; int lp = listpointer = startpointer[listNr]; while (lp != 0) { lp = ia[lp - 1]; cnt++; } return cnt; } /** * Get a data element from the list previously initialized. * Data elements are return in reverse order (lifo) * * @return the data element * @throws IllegalArgumentException if no more element */ public int getDataElement() { if (listpointer == 0) { throw new IllegalArgumentException("no more element!"); } int data = ia[listpointer]; listpointer = ia[listpointer - 1]; return data; } private void resize() { int[] ia2 = new int[2 * ia.length]; System.arraycopy(ia, 0, ia2, 0, ia.length); ia = ia2; } }