• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the  "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 /*
19  * $Id$
20  */
21 package org.apache.xml.utils;
22 
23 import java.util.EmptyStackException;
24 
25 /**
26  * Implement a stack of simple integers.
27  *
28  * %OPT%
29  * This is currently based on ObjectVector, which permits fast acess but pays a
30  * heavy recopying penalty if/when its size is increased. If we expect deep
31  * stacks, we should consider a version based on ChunkedObjectVector.
32  * @xsl.usage internal
33  */
34 public class ObjectStack extends ObjectVector
35 {
36 
37   /**
38    * Default constructor.  Note that the default
39    * block size is very small, for small lists.
40    */
ObjectStack()41   public ObjectStack()
42   {
43     super();
44   }
45 
46   /**
47    * Construct a ObjectVector, using the given block size.
48    *
49    * @param blocksize Size of block to allocate
50    */
ObjectStack(int blocksize)51   public ObjectStack(int blocksize)
52   {
53     super(blocksize);
54   }
55 
56   /**
57    * Copy constructor for ObjectStack
58    *
59    * @param v ObjectStack to copy
60    */
ObjectStack(ObjectStack v)61   public ObjectStack (ObjectStack v)
62   {
63   	super(v);
64   }
65 
66   /**
67    * Pushes an item onto the top of this stack.
68    *
69    * @param   i   the int to be pushed onto this stack.
70    * @return  the <code>item</code> argument.
71    */
push(Object i)72   public Object push(Object i)
73   {
74 
75     if ((m_firstFree + 1) >= m_mapSize)
76     {
77       m_mapSize += m_blocksize;
78 
79       Object newMap[] = new Object[m_mapSize];
80 
81       System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
82 
83       m_map = newMap;
84     }
85 
86     m_map[m_firstFree] = i;
87 
88     m_firstFree++;
89 
90     return i;
91   }
92 
93   /**
94    * Removes the object at the top of this stack and returns that
95    * object as the value of this function.
96    *
97    * @return     The object at the top of this stack.
98    */
pop()99   public Object pop()
100   {
101     Object val = m_map[--m_firstFree];
102     m_map[m_firstFree] = null;
103 
104     return val;
105   }
106 
107   /**
108    * Quickly pops a number of items from the stack.
109    */
110 
quickPop(int n)111   public void quickPop(int n)
112   {
113     m_firstFree -= n;
114   }
115 
116   /**
117    * Looks at the object at the top of this stack without removing it
118    * from the stack.
119    *
120    * @return     the object at the top of this stack.
121    * @throws  EmptyStackException  if this stack is empty.
122    */
peek()123   public Object peek()
124   {
125     try {
126       return m_map[m_firstFree - 1];
127     }
128     catch (ArrayIndexOutOfBoundsException e)
129     {
130       throw new EmptyStackException();
131     }
132   }
133 
134   /**
135    * Looks at the object at the position the stack counting down n items.
136    *
137    * @param n The number of items down, indexed from zero.
138    * @return     the object at n items down.
139    * @throws  EmptyStackException  if this stack is empty.
140    */
peek(int n)141   public Object peek(int n)
142   {
143     try {
144       return m_map[m_firstFree-(1+n)];
145     }
146     catch (ArrayIndexOutOfBoundsException e)
147     {
148       throw new EmptyStackException();
149     }
150   }
151 
152   /**
153    * Sets an object at a the top of the statck
154    *
155    *
156    * @param val object to set at the top
157    * @throws  EmptyStackException  if this stack is empty.
158    */
setTop(Object val)159   public void setTop(Object val)
160   {
161     try {
162       m_map[m_firstFree - 1] = val;
163     }
164     catch (ArrayIndexOutOfBoundsException e)
165     {
166       throw new EmptyStackException();
167     }
168   }
169 
170   /**
171    * Tests if this stack is empty.
172    *
173    * @return  <code>true</code> if this stack is empty;
174    *          <code>false</code> otherwise.
175    * @since   JDK1.0
176    */
empty()177   public boolean empty()
178   {
179     return m_firstFree == 0;
180   }
181 
182   /**
183    * Returns where an object is on this stack.
184    *
185    * @param   o   the desired object.
186    * @return  the distance from the top of the stack where the object is]
187    *          located; the return value <code>-1</code> indicates that the
188    *          object is not on the stack.
189    * @since   JDK1.0
190    */
search(Object o)191   public int search(Object o)
192   {
193 
194     int i = lastIndexOf(o);
195 
196     if (i >= 0)
197     {
198       return size() - i;
199     }
200 
201     return -1;
202   }
203 
204   /**
205    * Returns clone of current ObjectStack
206    *
207    * @return clone of current ObjectStack
208    */
clone()209   public Object clone()
210     throws CloneNotSupportedException
211   {
212   	return (ObjectStack) super.clone();
213   }
214 
215 }
216