import com.sun.java.swing.JProgressBar;

public class ComparableVector extends java.util.Vector
{
    public static boolean dojb = false;
    public static JProgressBar jb;
    
    public ComparableVector(int size) {
        super(size);
    }
    public ComparableVector() {
        super();
    }
    
    public int compareTo(Object o) {
        ComparableVector v = (ComparableVector)o;
        int test = this.size() - v.size();
        if (test == 0) {
            test = 0;
            for (int lcv=0;(test == 0) && (lcv<this.size());lcv++) {
                Comparable c = (Comparable) this.elementAt(lcv);
                Comparable d = (Comparable) v.elementAt(lcv);
                test = c.compareTo(d);
            }
        }
        return (test);
    }
    
    public void prune() {
        int lcv=0;
	    if (dojb) jb.setMaximum(this.size());
        while (lcv + 1 < this.size()) {
            Comparable c = (Comparable) this.elementAt(lcv);
            Comparable d = (Comparable) this.elementAt(lcv+1);
            if (c.compareTo(d) == 0)
                this.removeElementAt(lcv+1);
            else
                lcv++;
            if (dojb) jb.setValue(lcv);
        }
        if (dojb) jb.setValue(this.size());
    }
    
    public void prune(Rational r) {
        if (r == null) prune();
        else {
            int lcv=0;
    	    if (dojb) jb.setMaximum(this.size());
            Expression c;
            while (lcv + 1 < this.size()) {
                c = (Expression) this.elementAt(lcv);
                Expression d = (Expression) this.elementAt(lcv+1);
                if (c.getValue().compareTo(r) != 0)
                    this.removeElementAt(lcv);
                else if (c.compareTo(d) == 0)
                    this.removeElementAt(lcv+1);
                else
                    lcv++;
                if (dojb) jb.setValue(lcv);
            }
            c = (Expression) this.elementAt(this.size()-1);
            if (c.getValue().compareTo(r) != 0)
                this.removeElementAt(this.size()-1);            
            if (dojb) jb.setValue(this.size());
        }
    }
    
	/////////////////////////////  SORTING STUFF
	public void sort() {
	    if (dojb) jb.setMaximum(3*this.size());
	    quickSort(0,this.size()-1);
	    insertionSort(0,this.size()-1);
	    if (dojb) jb.setValue(3*this.size());
	}
	private void quickSort(int min, int max)
	{
	    int M = 4;
	    int i; int j; Comparable o;
	    
	    if (dojb) jb.setValue(2*min);
	    if ((max-min)>M) {
	        i = (min+max)/2;
	        checkSwap(min,i);
	        checkSwap(min,max);
	        checkSwap(i,max);
	        
	        j = max-1;
	        swap(i,j);
	        i = min;
	        o = (Comparable)this.elementAt(j);
	        i++; j--;
	        for (;;) {
	            while((j>i) && (o.compareTo(this.elementAt(i)) >= 0))
	                i++;
	            while((j>i) && (o.compareTo(this.elementAt(j)) <= 0)) 
	                j--;
	            if (j<=i) break;
	            swap(i,j);
	        }
	        swap(i,max-1);
	        quickSort(min,j);
	        quickSort(i+1,max);
	    }
	}
	private void checkSwap(int a, int b)
	{
	    Comparable c = (Comparable)this.elementAt(a);
	    if (c.compareTo(this.elementAt(b))>0) swap(a,b);
	}
	private void swap(int a, int b)
	{
	    Object o;
	    o = this.elementAt(a);
	    this.setElementAt(this.elementAt(b),a);
	    this.setElementAt(o, b);
	}
	private void insertionSort(int min, int max)
	{
	    int i; int j; Object o; Comparable c;
	    for (i=min+1;i<=max;i++) {
	        o = this.elementAt(i);
	        j = i;
	        c = (Comparable)this.elementAt(j-1);
	        while ((j>min) && (c.compareTo(o)>0)) {
	            this.setElementAt(this.elementAt(j-1), j);
	            j--;
	            if (j>min) c = (Comparable)this.elementAt(j-1);
	        }
	        this.setElementAt(o, j);
	        if (dojb) jb.setValue(2*max+i-1);
	    }
	}
	/////////////////////////////  END SORTING this
    
}