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.compilers.opt.util;
014
015 import java.util.ArrayList;
016 import java.util.Iterator;
017
018 /**
019 * Stack
020 * Stack is a smaller implementation of java.util.Stack, that uses a linked
021 * list rather than a vector.
022 */
023 public class Stack<T> implements Iterable<T> {
024 private final ArrayList<T> stack = new ArrayList<T>();
025
026 public Stack() {
027 }
028
029 public Stack(T e) {
030 push(e);
031 }
032
033 public final T push(T e) {
034 stack.add(e);
035 return e;
036 }
037
038 public final T pop() {
039 return stack.remove(stack.size() - 1);
040 }
041
042 public final T getTOS() {
043 return stack.get(stack.size() - 1);
044 }
045
046 public final T peek() {
047 return getTOS();
048 }
049
050 public final boolean isEmpty() {
051 return stack.isEmpty();
052 }
053
054 public final boolean empty() {
055 return isEmpty();
056 }
057
058 public final boolean compare(Stack<T> s2) {
059 Iterator<T> i1 = iterator();
060 Iterator<T> i2 = s2.iterator();
061 if (isEmpty() && s2.isEmpty()) {
062 return true;
063 } else if (isEmpty() || s2.isEmpty()) {
064 return false;
065 }
066 for (T t1 = i1.next(), t2 = i2.next(); i1.hasNext() && i2.hasNext();) {
067 if (t1 != t2) {
068 return false;
069 }
070 }
071 return !i1.hasNext() && !i2.hasNext();
072 }
073
074 public final Stack<T> copy() {
075 Stack<T> s = new Stack<T>();
076 s.stack.addAll(stack);
077 return s;
078 }
079
080 public final Stack<T> shallowCopy() {
081 Stack<T> s = new Stack<T>();
082 s.stack.addAll(stack);
083 return s;
084 }
085
086 public final Iterator<T> iterator() {
087 return stack.iterator();
088 }
089
090 public String toString() {
091 StringBuilder sb = new StringBuilder(" --> ");
092 for (T t : stack) {
093 sb.append(t.toString());
094 sb.append(' ');
095 }
096 return sb.toString();
097 }
098 }