/* Copyright (C) 1998, 1999  Cygnus Solutions

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package java.util;

/**
 * @author Warren Levy <warrenl@cygnus.com>
 * @date August 20, 1998.
 */
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
 * "The Java Language Specification", ISBN 0-201-63451-1
 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
 * Status:  Believed complete and correct
 */

public class Stack extends Vector
{
  // Could use Vector methods internally for the following methods
  // but have used Vector fields directly for efficiency (i.e. this
  // often reduces out duplicate bounds checking).

  public boolean empty()
  {
    return elementCount == 0;
  }

  public synchronized Object peek()
  {
    if (elementCount == 0)
      throw new EmptyStackException();

    return elementData[elementCount - 1];
  }

  public synchronized Object pop()
  {
    if (elementCount == 0)
      throw new EmptyStackException();

    Object obj = elementData[--elementCount];

    // Set topmost element to null to assist the gc in cleanup
    elementData[elementCount] = null;
    return obj;
  }

  public Object push(Object obj)
  {
    // When growing the Stack, use the Vector routines in case more
    // memory is needed.
    // Note: spec indicates that this method *always* returns obj passed in!

    addElement(obj);
    return obj;
  }

  public synchronized int search(Object obj)
  {
    // Return the position of obj on the stack as measured from the top;
    // i.e. the top element is 1, the next element down is 2, etc.
    // If obj is not on the stack, return -1

    for (int i = elementCount-1; i >=0; --i)
      if (elementData[i].equals(obj))
	return elementCount - i;

    return -1;
  }
}
