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: StringVector.java 468655 2006-10-28 07:12:06Z minchau $
020 */
021 package org.apache.xml.utils;
022
023 /**
024 * A very simple table that stores a list of strings, optimized
025 * for small lists.
026 * @xsl.usage internal
027 */
028 public class StringVector implements java.io.Serializable
029 {
030 static final long serialVersionUID = 4995234972032919748L;
031
032 /** @serial Size of blocks to allocate */
033 protected int m_blocksize;
034
035 /** @serial Array of strings this contains */
036 protected String m_map[];
037
038 /** @serial Number of strings this contains */
039 protected int m_firstFree = 0;
040
041 /** @serial Size of the array */
042 protected int m_mapSize;
043
044 /**
045 * Default constructor. Note that the default
046 * block size is very small, for small lists.
047 */
048 public StringVector()
049 {
050
051 m_blocksize = 8;
052 m_mapSize = m_blocksize;
053 m_map = new String[m_blocksize];
054 }
055
056 /**
057 * Construct a StringVector, using the given block size.
058 *
059 * @param blocksize Size of the blocks to allocate
060 */
061 public StringVector(int blocksize)
062 {
063
064 m_blocksize = blocksize;
065 m_mapSize = blocksize;
066 m_map = new String[blocksize];
067 }
068
069 /**
070 * Get the length of the list.
071 *
072 * @return Number of strings in the list
073 */
074 public int getLength()
075 {
076 return m_firstFree;
077 }
078
079 /**
080 * Get the length of the list.
081 *
082 * @return Number of strings in the list
083 */
084 public final int size()
085 {
086 return m_firstFree;
087 }
088
089 /**
090 * Append a string onto the vector.
091 *
092 * @param value Sting to add to the vector
093 */
094 public final void addElement(String value)
095 {
096
097 if ((m_firstFree + 1) >= m_mapSize)
098 {
099 m_mapSize += m_blocksize;
100
101 String newMap[] = new String[m_mapSize];
102
103 System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
104
105 m_map = newMap;
106 }
107
108 m_map[m_firstFree] = value;
109
110 m_firstFree++;
111 }
112
113 /**
114 * Get the nth element.
115 *
116 * @param i Index of string to find
117 *
118 * @return String at given index
119 */
120 public final String elementAt(int i)
121 {
122 return m_map[i];
123 }
124
125 /**
126 * Tell if the table contains the given string.
127 *
128 * @param s String to look for
129 *
130 * @return True if the string is in this table
131 */
132 public final boolean contains(String s)
133 {
134
135 if (null == s)
136 return false;
137
138 for (int i = 0; i < m_firstFree; i++)
139 {
140 if (m_map[i].equals(s))
141 return true;
142 }
143
144 return false;
145 }
146
147 /**
148 * Tell if the table contains the given string. Ignore case.
149 *
150 * @param s String to find
151 *
152 * @return True if the String is in this vector
153 */
154 public final boolean containsIgnoreCase(String s)
155 {
156
157 if (null == s)
158 return false;
159
160 for (int i = 0; i < m_firstFree; i++)
161 {
162 if (m_map[i].equalsIgnoreCase(s))
163 return true;
164 }
165
166 return false;
167 }
168
169 /**
170 * Tell if the table contains the given string.
171 *
172 * @param s String to push into the vector
173 */
174 public final void push(String s)
175 {
176
177 if ((m_firstFree + 1) >= m_mapSize)
178 {
179 m_mapSize += m_blocksize;
180
181 String newMap[] = new String[m_mapSize];
182
183 System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
184
185 m_map = newMap;
186 }
187
188 m_map[m_firstFree] = s;
189
190 m_firstFree++;
191 }
192
193 /**
194 * Pop the tail of this vector.
195 *
196 * @return The String last added to this vector or null not found.
197 * The string is removed from the vector.
198 */
199 public final String pop()
200 {
201
202 if (m_firstFree <= 0)
203 return null;
204
205 m_firstFree--;
206
207 String s = m_map[m_firstFree];
208
209 m_map[m_firstFree] = null;
210
211 return s;
212 }
213
214 /**
215 * Get the string at the tail of this vector without popping.
216 *
217 * @return The string at the tail of this vector.
218 */
219 public final String peek()
220 {
221 return (m_firstFree <= 0) ? null : m_map[m_firstFree - 1];
222 }
223 }