001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.util;
014    
015    import java.util.ListIterator;
016    import java.util.NoSuchElementException;
017    import org.jikesrvm.VM;
018    
019    public final class LinkedListIteratorRVM<T> implements ListIterator<T> {
020      boolean canRemove = false;
021    
022      /** The list we are iterating over */
023      final LinkedListRVM<T> l;
024    
025      /** Pointer to the current (most recently returned) element. */
026      private LinkedListRVM.Element<T> cursor = null;
027    
028      /**
029       * Constructor
030       *
031       * @param l The list to iterate over.
032       */
033      LinkedListIteratorRVM(LinkedListRVM<T> l) {
034        this.l = l;
035      }
036    
037      @Override
038      public void add(T arg0) {
039        l.insertAfter(cursor, arg0);
040        cursor = cursor.next;
041      }
042    
043      @Override
044      public boolean hasNext() {
045        return cursor != l.tail;
046      }
047    
048      @Override
049      public boolean hasPrevious() {
050        return cursor != null && cursor != l.head;
051      }
052    
053      @Override
054      public T next() {
055        if (cursor == null) {
056          cursor = l.head;
057        } else {
058          if (cursor.next == null) {
059            throw new NoSuchElementException();
060          }
061          cursor = cursor.next;
062        }
063        canRemove = true;
064        return cursor.entry;
065      }
066    
067      @Override
068      public void remove() {
069        if (canRemove) {
070          l.removeInternal(cursor);
071          canRemove = false;
072        } else {
073          throw new IllegalStateException();
074        }
075      }
076    
077      /* ---------------------------------------------------------------------- */
078      /*                      Methods below unimplemented                       */
079      /* ---------------------------------------------------------------------- */
080    
081      @Override
082      public int nextIndex() {
083        if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED);
084        return 0;
085      }
086    
087      @Override
088      public T previous() {
089        if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED);
090        return null;
091      }
092    
093      @Override
094      public int previousIndex() {
095        if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED);
096        return 0;
097      }
098    
099      @Override
100      public void set(Object arg0) {
101        if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED);
102      }
103    
104    }