001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: BoolStack.java 468655 2006-10-28 07:12:06Z minchau $
020 */
021 package org.apache.xml.utils;
022
023
024 /**
025 * Simple stack for boolean values.
026 * @xsl.usage internal
027 */
028 public final class BoolStack implements Cloneable
029 {
030
031 /** Array of boolean values */
032 private boolean m_values[];
033
034 /** Array size allocated */
035 private int m_allocatedSize;
036
037 /** Index into the array of booleans */
038 private int m_index;
039
040 /**
041 * Default constructor. Note that the default
042 * block size is very small, for small lists.
043 */
044 public BoolStack()
045 {
046 this(32);
047 }
048
049 /**
050 * Construct a IntVector, using the given block size.
051 *
052 * @param size array size to allocate
053 */
054 public BoolStack(int size)
055 {
056
057 m_allocatedSize = size;
058 m_values = new boolean[size];
059 m_index = -1;
060 }
061
062 /**
063 * Get the length of the list.
064 *
065 * @return Current length of the list
066 */
067 public final int size()
068 {
069 return m_index + 1;
070 }
071
072 /**
073 * Clears the stack.
074 *
075 */
076 public final void clear()
077 {
078 m_index = -1;
079 }
080
081 /**
082 * Pushes an item onto the top of this stack.
083 *
084 *
085 * @param val the boolean to be pushed onto this stack.
086 * @return the <code>item</code> argument.
087 */
088 public final boolean push(boolean val)
089 {
090
091 if (m_index == m_allocatedSize - 1)
092 grow();
093
094 return (m_values[++m_index] = val);
095 }
096
097 /**
098 * Removes the object at the top of this stack and returns that
099 * 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 */
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 */
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 */
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 */
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 */
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 */
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 */
175 public boolean isEmpty()
176 {
177 return (m_index == -1);
178 }
179
180 /**
181 * Grows the size of the stack
182 *
183 */
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
196 public Object clone()
197 throws CloneNotSupportedException
198 {
199 return super.clone();
200 }
201
202 }