• 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: IntStack.java 468655 2006-10-28 07:12:06Z minchau $
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 IntVector, 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 ChunkedIntVector.
32  * @xsl.usage internal
33  */
34 public class IntStack extends IntVector
35 {
36 
37   /**
38    * Default constructor.  Note that the default
39    * block size is very small, for small lists.
40    */
IntStack()41   public IntStack()
42   {
43     super();
44   }
45 
46   /**
47    * Construct a IntVector, using the given block size.
48    *
49    * @param blocksize Size of block to allocate
50    */
IntStack(int blocksize)51   public IntStack(int blocksize)
52   {
53     super(blocksize);
54   }
55 
56   /**
57    * Copy constructor for IntStack
58    *
59    * @param v IntStack to copy
60    */
IntStack(IntStack v)61   public IntStack (IntStack 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(int i)72   public int push(int i)
73   {
74 
75     if ((m_firstFree + 1) >= m_mapSize)
76     {
77       m_mapSize += m_blocksize;
78 
79       int newMap[] = new int[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 final int pop()
100   {
101     return m_map[--m_firstFree];
102   }
103 
104   /**
105    * Quickly pops a number of items from the stack.
106    */
107 
quickPop(int n)108   public final void quickPop(int n)
109   {
110     m_firstFree -= n;
111   }
112 
113   /**
114    * Looks at the object at the top of this stack without removing it
115    * from the stack.
116    *
117    * @return     the object at the top of this stack.
118    * @throws  EmptyStackException  if this stack is empty.
119    */
peek()120   public final int peek()
121   {
122     try {
123       return m_map[m_firstFree - 1];
124     }
125     catch (ArrayIndexOutOfBoundsException e)
126     {
127       throw new EmptyStackException();
128     }
129   }
130 
131   /**
132    * Looks at the object at the position the stack counting down n items.
133    *
134    * @param n The number of items down, indexed from zero.
135    * @return     the object at n items down.
136    * @throws  EmptyStackException  if this stack is empty.
137    */
peek(int n)138   public int peek(int n)
139   {
140     try {
141       return m_map[m_firstFree-(1+n)];
142     }
143     catch (ArrayIndexOutOfBoundsException e)
144     {
145       throw new EmptyStackException();
146     }
147   }
148 
149   /**
150    * Sets an object at a the top of the statck
151    *
152    *
153    * @param val object to set at the top
154    * @throws  EmptyStackException  if this stack is empty.
155    */
setTop(int val)156   public void setTop(int val)
157   {
158     try {
159       m_map[m_firstFree - 1] = val;
160     }
161     catch (ArrayIndexOutOfBoundsException e)
162     {
163       throw new EmptyStackException();
164     }
165   }
166 
167   /**
168    * Tests if this stack is empty.
169    *
170    * @return  <code>true</code> if this stack is empty;
171    *          <code>false</code> otherwise.
172    * @since   JDK1.0
173    */
empty()174   public boolean empty()
175   {
176     return m_firstFree == 0;
177   }
178 
179   /**
180    * Returns where an object is on this stack.
181    *
182    * @param   o   the desired object.
183    * @return  the distance from the top of the stack where the object is]
184    *          located; the return value <code>-1</code> indicates that the
185    *          object is not on the stack.
186    * @since   JDK1.0
187    */
search(int o)188   public int search(int o)
189   {
190 
191     int i = lastIndexOf(o);
192 
193     if (i >= 0)
194     {
195       return size() - i;
196     }
197 
198     return -1;
199   }
200 
201   /**
202    * Returns clone of current IntStack
203    *
204    * @return clone of current IntStack
205    */
clone()206   public Object clone()
207     throws CloneNotSupportedException
208   {
209   	return (IntStack) super.clone();
210   }
211 }
212