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