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    }