content: package edu.berkeley.nlp.lm.collections;
  
  import java.util.AbstractList;
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * List which returns special boundary symbols when get() is called outside the
   * range of the list.
   * 
   * @author Dan Klein
   */
  public class BoundedList<E> extends AbstractList<E>
  {
  	private final E leftBoundary;
  
  	private final E rightBoundary;
  
  	private final List<E> list;
  
  	/**
  	 * Returns the object at the given index, provided the index is between 0
  	 * (inclusive) and size() (exclusive). If the index is < 0, then a left
  	 * boundary object is returned. If the index is >= size(), a right boundary
  	 * object is returned. The default boundary objects are both null, unless
  	 * other objects are specified on construction.
  	 */
  	@Override
  	public E get(final int index) {
  		if (index < 0) return leftBoundary;
  		if (index >= list.size()) return rightBoundary;
  		return list.get(index);
  	}
  
  	@Override
  	public int size() {
  		return list.size();
  	}
  
  	public BoundedList(final List<E> list, final E leftBoundary, final E rightBoundary) {
  		this.list = list;
  		this.leftBoundary = leftBoundary;
  		this.rightBoundary = rightBoundary;
  	}
  
  	@Override
  	public List<E> subList(final int fromIndex, final int toIndex) {
  		final List<E> retVal = new ArrayList<E>(toIndex - fromIndex);
  		for (int i = fromIndex; i < toIndex; ++i) {
  			retVal.add(get(i));
  		}
  		return retVal;
  	}
  
  }
  