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 */
21package org.apache.xml.utils;
22
23
24/**
25 * Simple stack for boolean values.
26 * @xsl.usage internal
27 */
28public 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   */
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   */
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   */
67  public final int size()
68  {
69    return m_index + 1;
70  }
71
72  /**
73   * Clears the stack.
74   *
75   */
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   */
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   */
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}
203