package org.basex.util.list; import java.util.Arrays; import java.util.Iterator; import java.util.RandomAccess; import org.basex.util.Array; import org.basex.util.Util; /** * This is an abstract class for storing objects in an array-based list. * @param <E> generic value type * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class ObjList<E> extends ElementList implements Iterable<E>, RandomAccess { /** Element container. */ Object[] list; /** * Default constructor. */ public ObjList() { this(CAP); } /** * Constructor, specifying an initial array capacity. * @param c array capacity */ public ObjList(final int c) { list = new Object[c]; } /** * Adds an element to the array. * @param e element to be added */ public void add(final E e) { if(size == list.length) list = Arrays.copyOf(list, newSize()); list[size++] = e; } /** * Returns the specified element. * @param p position * @return value */ @SuppressWarnings("unchecked") public E get(final int p) { return (E) list[p]; } /** * Checks if the specified element is found in the list. * @param e element to be checked * @return result of check */ public boolean contains(final E e) { for(int i = 0; i < size; ++i) if(list[i].equals(e)) return true; return false; } /** * Sets an element at the specified index position. * @param i index * @param e element to be set */ public void set(final int i, final E e) { if(i >= list.length) list = Arrays.copyOf(list, newSize(i + 1)); list[i] = e; size = Math.max(size, i + 1); } /** * Deletes the specified element. * @param i element to be deleted */ public void delete(final int i) { Array.move(list, i + 1, -1, --size - i); } /** * Fills and returns the array with all elements. * @param a container to be filled * @return array with all elements */ public E[] toArray(final E[] a) { if(a.length != size) Util.notexpected(); System.arraycopy(list, 0, a, 0, size); return a; } @Override public Iterator<E> iterator() { return new Iterator<E>() { private int c = -1; private boolean r; @Override public boolean hasNext() { if(!r) r = more(); return r; } @Override @SuppressWarnings("unchecked") public E next() { if(!r) more(); r = false; return (E) list[c]; } private boolean more() { return ++c < size; } @Override public void remove() { Util.notexpected(); } }; } @Override public String toString() { // no implicit copying of the list return getClass().getSimpleName() + Arrays.asList(list).subList(0, size); } }