import java.util.*;

/**
 * Description: 
 * 
 * @author Glenn Lancaster
 * @version 22 May 07
 */
public class MyList extends AbstractList
{
  private E[] arr;
  private int cnt;
  public MyList()
  {
    arr = (E[]) new Object[100];
    cnt = 0;
  }

  public int size() {
    return cnt;
  }

  public E get(int i) {
    if ( i < 0 || i >= size() ) {
      throw new IndexOutOfBoundsException();
    }
    return arr[i];
  }

  public E set(int i, E elem) {
    if ( i < 0 || i >= size() ) {
      throw new IndexOutOfBoundsException();
    }
    E tmp = arr[i];
    arr[i] = elem;
    return tmp;
  }

  
  public void add(int i, E elem)
  {
    if ( i < 0 || i > size() ) {
      throw new IndexOutOfBoundsException();
    }
    if ( size() >= arr.length ) {
      throw new IllegalStateException();
    }
    int j = size();
    while( j > i ) {
      arr[j] = arr[j-1];
      j--;
    }
    arr[i] = elem;
    cnt++;
  }

  public E remove(int i)
  {
    if ( i < 0 || i >= size() ) {
      throw new IndexOutOfBoundsException();
    }
    E tmp = arr[i];
    for(int j = i; j < size(); j++) {
      arr[j] = arr[j+1];
    }
    cnt--;
    return tmp;
  }

  
  public static void printList(Iterator p)
  {
    while(p.hasNext()) {
      System.out.println(p.next());
    }
  }

  public static void main(String[] args)
  {
    MyList lst = new MyList();
    MyList lst2 = new MyList();
    
    for(int i = 0; i < 20; i++) {
      lst.add(new Integer(100 + i));
      lst2.add(new Integer(100 + i));
    }

    System.out.println("lst.equals(lst2) is " + lst.equals(lst2));

    System.out.println("\nPrinting using an iterator");

    Iterator p = lst.iterator();
    printList(p);

    List sub = lst.subList(5, 15);
    
    System.out.println("\nCopying a sublist 5 - 15, include 5, exclude 15");
    p = sub.iterator();
    printList(p);
    System.out.println("lst.size() = " + lst.size());

    lst.removeRange(5,15);

    System.out.println("\nAfter removing range 5 - 15; include 5, exclude 15");
    p = lst.iterator();
    printList(p);
    System.out.println("lst.size() = " + lst.size());

    System.out.println("\nUse a ListIterator to print the list backwards");
    ListIterator q = lst.listIterator(lst.size());
    while(q.hasPrevious()) {
      System.out.println(q.previous());
    }
    System.out.println("lst.size() = " + lst.size());

    System.out.println("\nAfter removing all elements");
    lst.clear();
    p = lst.iterator();
    printList(p);
    System.out.println("lst.size() = " + lst.size());
  }
    

}