ring: show used
authorirengrig <Irina.Chernushina@jetbrains.com>
Mon, 30 Aug 2010 11:27:36 +0000 (15:27 +0400)
committerirengrig <Irina.Chernushina@jetbrains.com>
Tue, 31 Aug 2010 13:45:30 +0000 (17:45 +0400)
platform/vcs-api/src/com/intellij/openapi/vcs/Ring.java

index 93f10b15cf6c9b75a2d4995ec96f4f73b61c5746..578a10552dabb7ae13ee5fe9c03c5a5302bbecd2 100644 (file)
 package com.intellij.openapi.vcs;
 
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 
 /**
  * @author irengrig
  */
 public abstract class Ring<T extends Comparable<T>> {
   protected final LinkedList<T> myFreeNumbers;
+  protected final T myFirst;
   protected T myNextAvailable;
 
   public Ring(final T first) {
     myFreeNumbers = new LinkedList<T>();
     myNextAvailable = first;
+    myFirst = first;
   }
 
   public void back(final T number) {
@@ -36,6 +40,32 @@ public abstract class Ring<T extends Comparable<T>> {
     myFreeNumbers.add(- idx - 1, number);
   }
 
+  public boolean minus(final T t) {
+    return myFreeNumbers.remove(t);
+  }
+
+  public List<T> getUsed() {
+    final List<T> result = new LinkedList<T>();
+
+    T current = myFirst;
+    final Iterator<T> iterator = myFreeNumbers.iterator();
+    T currentUsed = iterator.hasNext() ? iterator.next() : null;
+    while (current.compareTo(myNextAvailable) < 0) {
+      final int compResult = (currentUsed == null) ? -1 : current.compareTo(currentUsed);
+      if (compResult < 0) {
+        result.add(current);
+      } else if (compResult == 0) {
+        if (iterator.hasNext()) {
+          currentUsed = iterator.next();
+        } else {
+          currentUsed = null;
+        }
+      }
+      current = getNext(current);
+    }
+    return result;
+  }
+
   protected abstract T getNext(final T t);
 
   public T getFree() {