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: BoolStack.java 468655 2006-10-28 07:12:06Z minchau $
20  */
21 package org.apache.xml.utils;
22 
23 
24 /**
25  * Simple stack for boolean values.
26  * @xsl.usage internal
27  */
28 public final class BoolStack implements Cloneable
29 {
30 
31   /** Array of boolean values          */
32   private boolean m_values[];
33 
34   /** Array size allocated           */
35   private int m_allocatedSize;
36 
37   /** Index into the array of booleans          */
38   private int m_index;
39 
40   /**
41    * Default constructor.  Note that the default
42    * block size is very small, for small lists.
43    */
BoolStack()44   public BoolStack()
45   {
46     this(32);
47   }
48 
49   /**
50    * Construct a IntVector, using the given block size.
51    *
52    * @param size array size to allocate
53    */
BoolStack(int size)54   public BoolStack(int size)
55   {
56 
57     m_allocatedSize = size;
58     m_values = new boolean[size];
59     m_index = -1;
60   }
61 
62   /**
63    * Get the length of the list.
64    *
65    * @return Current length of the list
66    */
size()67   public final int size()
68   {
69     return m_index + 1;
70   }
71 
72   /**
73    * Clears the stack.
74    *
75    */
clear()76   public final void clear()
77   {
78   	m_index = -1;
79   }
80 
81   /**
82    * Pushes an item onto the top of this stack.
83    *
84    *
85    * @param val the boolean to be pushed onto this stack.
86    * @return  the <code>item</code> argument.
87    */
push(boolean val)88   public final boolean push(boolean val)
89   {
90 
91     if (m_index == m_allocatedSize - 1)
92       grow();
93 
94     return (m_values[++m_index] = val);
95   }
96 
97   /**
98    * Removes the object at the top of this stack and returns that
99    * object as the value of this function.
100    *
101    * @return     The object at the top of this stack.
102    * @throws  EmptyStackException  if this stack is empty.
103    */
pop()104   public final boolean pop()
105   {
106     return m_values[m_index--];
107   }
108 
109   /**
110    * Removes the object at the top of this stack and returns the
111    * next object at the top as the value of this function.
112    *
113    *
114    * @return Next object to the top or false if none there
115    */
popAndTop()116   public final boolean popAndTop()
117   {
118 
119     m_index--;
120 
121     return (m_index >= 0) ? m_values[m_index] : false;
122   }
123 
124   /**
125    * Set the item at the top of this stack
126    *
127    *
128    * @param b Object to set at the top of this stack
129    */
setTop(boolean b)130   public final void setTop(boolean b)
131   {
132     m_values[m_index] = b;
133   }
134 
135   /**
136    * Looks at the object at the top of this stack without removing it
137    * from the stack.
138    *
139    * @return     the object at the top of this stack.
140    * @throws  EmptyStackException  if this stack is empty.
141    */
peek()142   public final boolean peek()
143   {
144     return m_values[m_index];
145   }
146 
147   /**
148    * Looks at the object at the top of this stack without removing it
149    * from the stack.  If the stack is empty, it returns false.
150    *
151    * @return     the object at the top of this stack.
152    */
peekOrFalse()153   public final boolean peekOrFalse()
154   {
155     return (m_index > -1) ? m_values[m_index] : false;
156   }
157 
158   /**
159    * Looks at the object at the top of this stack without removing it
160    * from the stack.  If the stack is empty, it returns true.
161    *
162    * @return     the object at the top of this stack.
163    */
peekOrTrue()164   public final boolean peekOrTrue()
165   {
166     return (m_index > -1) ? m_values[m_index] : true;
167   }
168 
169   /**
170    * Tests if this stack is empty.
171    *
172    * @return  <code>true</code> if this stack is empty;
173    *          <code>false</code> otherwise.
174    */
isEmpty()175   public boolean isEmpty()
176   {
177     return (m_index == -1);
178   }
179 
180   /**
181    * Grows the size of the stack
182    *
183    */
grow()184   private void grow()
185   {
186 
187     m_allocatedSize *= 2;
188 
189     boolean newVector[] = new boolean[m_allocatedSize];
190 
191     System.arraycopy(m_values, 0, newVector, 0, m_index + 1);
192 
193     m_values = newVector;
194   }
195 
clone()196   public Object clone()
197     throws CloneNotSupportedException
198   {
199     return super.clone();
200   }
201 
202 }
203