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 468654 2006-10-28 07:09:23Z minchau $ 020 */ 021 package org.apache.xml.serializer.utils; 022 023 024 /** 025 * Simple stack for boolean values. 026 * 027 * This class is a copy of the one in org.apache.xml.utils. 028 * It exists to cut the serializers dependancy on that package. 029 * A minor changes from that package are: 030 * doesn't implement Clonable 031 * 032 * This class is not a public API, it is only public because it is 033 * used in org.apache.xml.serializer. 034 * 035 * @xsl.usage internal 036 */ 037 public final class BoolStack 038 { 039 040 /** Array of boolean values */ 041 private boolean m_values[]; 042 043 /** Array size allocated */ 044 private int m_allocatedSize; 045 046 /** Index into the array of booleans */ 047 private int m_index; 048 049 /** 050 * Default constructor. Note that the default 051 * block size is very small, for small lists. 052 */ 053 public BoolStack() 054 { 055 this(32); 056 } 057 058 /** 059 * Construct a IntVector, using the given block size. 060 * 061 * @param size array size to allocate 062 */ 063 public BoolStack(int size) 064 { 065 066 m_allocatedSize = size; 067 m_values = new boolean[size]; 068 m_index = -1; 069 } 070 071 /** 072 * Get the length of the list. 073 * 074 * @return Current length of the list 075 */ 076 public final int size() 077 { 078 return m_index + 1; 079 } 080 081 /** 082 * Clears the stack. 083 * 084 */ 085 public final void clear() 086 { 087 m_index = -1; 088 } 089 090 /** 091 * Pushes an item onto the top of this stack. 092 * 093 * 094 * @param val the boolean to be pushed onto this stack. 095 * @return the <code>item</code> argument. 096 */ 097 public final boolean push(boolean val) 098 { 099 100 if (m_index == m_allocatedSize - 1) 101 grow(); 102 103 return (m_values[++m_index] = val); 104 } 105 106 /** 107 * Removes the object at the top of this stack and returns that 108 * object as the value of this function. 109 * 110 * @return The object at the top of this stack. 111 * @throws EmptyStackException if this stack is empty. 112 */ 113 public final boolean pop() 114 { 115 return m_values[m_index--]; 116 } 117 118 /** 119 * Removes the object at the top of this stack and returns the 120 * next object at the top as the value of this function. 121 * 122 * 123 * @return Next object to the top or false if none there 124 */ 125 public final boolean popAndTop() 126 { 127 128 m_index--; 129 130 return (m_index >= 0) ? m_values[m_index] : false; 131 } 132 133 /** 134 * Set the item at the top of this stack 135 * 136 * 137 * @param b Object to set at the top of this stack 138 */ 139 public final void setTop(boolean b) 140 { 141 m_values[m_index] = b; 142 } 143 144 /** 145 * Looks at the object at the top of this stack without removing it 146 * from the stack. 147 * 148 * @return the object at the top of this stack. 149 * @throws EmptyStackException if this stack is empty. 150 */ 151 public final boolean peek() 152 { 153 return m_values[m_index]; 154 } 155 156 /** 157 * Looks at the object at the top of this stack without removing it 158 * from the stack. If the stack is empty, it returns false. 159 * 160 * @return the object at the top of this stack. 161 */ 162 public final boolean peekOrFalse() 163 { 164 return (m_index > -1) ? m_values[m_index] : false; 165 } 166 167 /** 168 * Looks at the object at the top of this stack without removing it 169 * from the stack. If the stack is empty, it returns true. 170 * 171 * @return the object at the top of this stack. 172 */ 173 public final boolean peekOrTrue() 174 { 175 return (m_index > -1) ? m_values[m_index] : true; 176 } 177 178 /** 179 * Tests if this stack is empty. 180 * 181 * @return <code>true</code> if this stack is empty; 182 * <code>false</code> otherwise. 183 */ 184 public boolean isEmpty() 185 { 186 return (m_index == -1); 187 } 188 189 /** 190 * Grows the size of the stack 191 * 192 */ 193 private void grow() 194 { 195 196 m_allocatedSize *= 2; 197 198 boolean newVector[] = new boolean[m_allocatedSize]; 199 200 System.arraycopy(m_values, 0, newVector, 0, m_index + 1); 201 202 m_values = newVector; 203 } 204 }