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: StringVector.java 468655 2006-10-28 07:12:06Z minchau $
20 */
21package org.apache.xml.utils;
22
23/**
24 * A very simple table that stores a list of strings, optimized
25 * for small lists.
26 * @xsl.usage internal
27 */
28public class StringVector implements java.io.Serializable
29{
30    static final long serialVersionUID = 4995234972032919748L;
31
32  /** @serial Size of blocks to allocate           */
33  protected int m_blocksize;
34
35  /** @serial Array of strings this contains          */
36  protected String m_map[];
37
38  /** @serial Number of strings this contains          */
39  protected int m_firstFree = 0;
40
41  /** @serial Size of the array          */
42  protected int m_mapSize;
43
44  /**
45   * Default constructor.  Note that the default
46   * block size is very small, for small lists.
47   */
48  public StringVector()
49  {
50
51    m_blocksize = 8;
52    m_mapSize = m_blocksize;
53    m_map = new String[m_blocksize];
54  }
55
56  /**
57   * Construct a StringVector, using the given block size.
58   *
59   * @param blocksize Size of the blocks to allocate
60   */
61  public StringVector(int blocksize)
62  {
63
64    m_blocksize = blocksize;
65    m_mapSize = blocksize;
66    m_map = new String[blocksize];
67  }
68
69  /**
70   * Get the length of the list.
71   *
72   * @return Number of strings in the list
73   */
74  public int getLength()
75  {
76    return m_firstFree;
77  }
78
79  /**
80   * Get the length of the list.
81   *
82   * @return Number of strings in the list
83   */
84  public final int size()
85  {
86    return m_firstFree;
87  }
88
89  /**
90   * Append a string onto the vector.
91   *
92   * @param value Sting to add to the vector
93   */
94  public final void addElement(String value)
95  {
96
97    if ((m_firstFree + 1) >= m_mapSize)
98    {
99      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}
224