001/**
002 * ========================================
003 * JCommon : a free Java report library
004 * ========================================
005 *
006 * Project Info:  http://www.jfree.org/jcommon/
007 *
008 * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
009 *
010 * This library is free software; you can redistribute it and/or modify it under the terms
011 * of the GNU Lesser General Public License as published by the Free Software Foundation;
012 * either version 2.1 of the License, or (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016 * See the GNU Lesser General Public License for more details.
017 *
018 * You should have received a copy of the GNU Lesser General Public License along with this
019 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020 * Boston, MA 02111-1307, USA.
021 *
022 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023 * in the United States and other countries.]
024 *
025 * ------------
026 * $Id: FastStack.java,v 1.2 2006/12/11 12:02:27 taqua Exp $
027 * ------------
028 * (C) Copyright 2002-2006, by Object Refinery Limited.
029 */
030
031package org.jfree.util;
032
033import java.io.Serializable;
034import java.util.Arrays;
035import java.util.EmptyStackException;
036
037/**
038 * A very simple unsynchronized stack. This one is faster than the
039 * java.util-Version.
040 *
041 * @author Thomas Morgner
042 */
043public final class FastStack implements Serializable, Cloneable
044{
045  private Object[] contents;
046  private int size;
047  private int initialSize;
048
049  public FastStack()
050  {
051    initialSize = 10;
052  }
053
054  public FastStack(int size)
055  {
056    initialSize = Math.max(1, size);
057  }
058
059  public boolean isEmpty()
060  {
061    return size == 0;
062  }
063
064  public int size()
065  {
066    return size;
067  }
068
069  public void push(Object o)
070  {
071    if (contents == null)
072    {
073      contents = new Object[initialSize];
074      contents[0] = o;
075      size = 1;
076      return;
077    }
078
079    final int oldSize = size;
080    size += 1;
081    if (contents.length == size)
082    {
083      // grow ..
084      final Object[] newContents = new Object[size + initialSize];
085      System.arraycopy(contents, 0, newContents, 0, size);
086      this.contents = newContents;
087    }
088    this.contents[oldSize] = o;
089  }
090
091  public Object peek()
092  {
093    if (size == 0)
094    {
095      throw new EmptyStackException();
096    }
097    return contents[size - 1];
098  }
099
100  public Object pop()
101  {
102    if (size == 0)
103    {
104      throw new EmptyStackException();
105    }
106    size -= 1;
107    final Object retval = contents[size];
108    contents[size] = null;
109    return retval;
110  }
111
112  public Object clone()
113  {
114    try
115    {
116      FastStack stack = (FastStack) super.clone();
117      if (contents != null)
118      {
119        stack.contents = (Object[]) contents.clone();
120      }
121      return stack;
122    }
123    catch (CloneNotSupportedException cne)
124    {
125      throw new IllegalStateException("Clone not supported? Why?");
126    }
127  }
128
129  public void clear()
130  {
131    size = 0;
132    if (contents != null)
133    {
134      Arrays.fill(contents, null);
135    }
136  }
137
138  public Object get(final int index)
139  {
140    if (index >= size)
141    {
142      throw new IndexOutOfBoundsException();
143    }
144    return contents[index];
145  }
146}