scuffed-code/tools/unicodetools/com/ibm/text/utility/IntStack.java

128 lines
3.5 KiB
Java

/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/utility/IntStack.java,v $
* $Date: 2002/06/15 02:47:14 $
* $Revision: 1.4 $
*
*******************************************************************************
*/
package com.ibm.text.utility;
// =============================================================
// Simple stack mechanism, with push, pop and access
// =============================================================
public final class IntStack implements Comparable, Cloneable {
private int[] values;
private int top = 0;
private int first = 0;
public IntStack(int initialSize) {
values = new int[initialSize];
}
public IntStack append(IntStack other) {
// TODO speed up by copying arrays
for (int i = 0; i < other.getTop(); ++i) {
push(other.get(i));
}
return this;
}
public IntStack append(int value) {
return push(value);
}
public int length() {
return top - first;
}
public IntStack push(int value) {
if (top >= values.length) { // must grow?
int[] temp = new int[values.length*2];
System.arraycopy(values,0,temp,0,values.length);
values = temp;
}
values[top++] = value;
return this;
}
public int pop() {
if (top > first) {
int result = values[--top];
if (top == first && first > 0) {
top = first = 0;
}
return result;
}
throw new IllegalArgumentException("Stack underflow");
}
public int popFront() {
if (top > first) {
int result = values[first++];
if (top == first) {
top = first = 0;
}
return result;
}
throw new IllegalArgumentException("Stack underflow");
}
public int get(int index) {
if (first <= index && index < top) return values[index];
throw new IllegalArgumentException("Stack index out of bounds");
}
public int getTop() {
return top;
}
public boolean isEmpty() {
return top - first == 0;
}
public void clear() {
top = first = 0;
}
public int compareTo(Object other) {
IntStack that = (IntStack) other;
int myLen = top - first;
int thatLen = that.top - that.first;
int limit = first + ((myLen < thatLen) ? myLen : thatLen);
int delta = that.first - first;
for (int i = first; i < limit; ++i) {
int result = values[i] - that.values[i + delta];
if (result != 0) return result;
}
return myLen - thatLen;
}
public boolean equals(Object other) {
return compareTo(other) == 0;
}
public int hashCode() {
int result = top;
for (int i = first; i < top; ++i) {
result = result * 37 + values[i];
}
return result;
}
public Object clone() {
try {
IntStack result = (IntStack) (super.clone());
result.values = (int[]) result.values.clone();
return result;
} catch (CloneNotSupportedException e) {
throw new IllegalArgumentException("Will never happen");
}
}
}