14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file
44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information
54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file
64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License.
84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at
94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software
134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and
164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License.
174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id$
204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xml.utils;
224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * A very simple table that stores a list of objects.
254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This version is based on a "realloc" strategy -- a simle array is
274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * used, and when more storage is needed, a larger array is obtained
284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * and all existing data is recopied into it. As a result, read/write
294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * access to existing nodes is O(1) fast but appending may be O(N**2)
304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * slow.
314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage internal
324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class ObjectVector implements Cloneable
344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Size of blocks to allocate          */
374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  protected int m_blocksize;
384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Array of objects          */
404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  protected Object m_map[];
414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Number of ints in array          */
434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  protected int m_firstFree = 0;
444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /** Size of array          */
464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  protected int m_mapSize;
474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Default constructor.  Note that the default
504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * block size is very small, for small lists.
514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public ObjectVector()
534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_blocksize = 32;
564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_mapSize = m_blocksize;
574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map = new Object[m_blocksize];
584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a IntVector, using the given block size.
624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param blocksize Size of block to allocate
644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public ObjectVector(int blocksize)
664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_blocksize = blocksize;
694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_mapSize = blocksize;
704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map = new Object[blocksize];
714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Construct a IntVector, using the given block size.
754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param blocksize Size of block to allocate
774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public ObjectVector(int blocksize, int increaseSize)
794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_blocksize = increaseSize;
824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_mapSize = blocksize;
834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map = new Object[blocksize];
844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Copy constructor for ObjectVector
884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param v Existing ObjectVector to copy
904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public ObjectVector(ObjectVector v)
924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	m_map = new Object[v.m_mapSize];
944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_mapSize = v.m_mapSize;
954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree = v.m_firstFree;
964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	m_blocksize = v.m_blocksize;
974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	System.arraycopy(v.m_map, 0, m_map, 0, m_firstFree);
984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get the length of the list.
1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return length of the list
1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final int size()
1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return m_firstFree;
1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get the length of the list.
1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return length of the list
1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void setSize(int sz)
1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree = sz;
1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Append an object onto the vector.
1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param value Object to add to the list
1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void addElement(Object value)
1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if ((m_firstFree + 1) >= m_mapSize)
1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_mapSize += m_blocksize;
1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      Object newMap[] = new Object[m_mapSize];
1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map = newMap;
1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map[m_firstFree] = value;
1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree++;
1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Append several Object values onto the vector.
1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param value Object to add to the list
1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void addElements(Object value, int numberOfElements)
1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if ((m_firstFree + numberOfElements) >= m_mapSize)
1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_mapSize += (m_blocksize+numberOfElements);
1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      Object newMap[] = new Object[m_mapSize];
1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map = newMap;
1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = 0; i < numberOfElements; i++)
1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map[m_firstFree] = value;
1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_firstFree++;
1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Append several slots onto the vector, but do not set the values.
1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param numberOfElements number of slots to append
1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void addElements(int numberOfElements)
1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if ((m_firstFree + numberOfElements) >= m_mapSize)
1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_mapSize += (m_blocksize+numberOfElements);
1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      Object newMap[] = new Object[m_mapSize];
1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map = newMap;
1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree += numberOfElements;
1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Inserts the specified object in this vector at the specified index.
1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Each component in this vector with an index greater or equal to
1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * the specified index is shifted upward to have an index one greater
1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * than the value it had previously.
1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param value Object to insert
2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param at Index of where to insert
2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void insertElementAt(Object value, int at)
2044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if ((m_firstFree + 1) >= m_mapSize)
2074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_mapSize += m_blocksize;
2094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      Object newMap[] = new Object[m_mapSize];
2114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1);
2134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map = newMap;
2154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (at <= (m_firstFree - 1))
2184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      System.arraycopy(m_map, at, m_map, at + 1, m_firstFree - at);
2204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map[at] = value;
2234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree++;
2254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Remove all elements objects from the list.
2294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void removeAllElements()
2314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
2344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map[i] = null;
2364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree = 0;
2394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Removes the first occurrence of the argument from this vector.
2434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * If the object is found in this vector, each component in the vector
2444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * with an index greater or equal to the object's index is shifted
2454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * downward to have an index one smaller than the value it had
2464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * previously.
2474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s Object to remove from array
2494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return True if the object was removed, false if it was not found
2514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final boolean removeElement(Object s)
2534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
2564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
2574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (m_map[i] == s)
2584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
2594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if ((i + 1) < m_firstFree)
2604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          System.arraycopy(m_map, i + 1, m_map, i - 1, m_firstFree - i);
2614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        else
2624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          m_map[i] = null;
2634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        m_firstFree--;
2654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return true;
2674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
2684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
2694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return false;
2714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Deletes the component at the specified index. Each component in
2754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * this vector with an index greater or equal to the specified
2764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * index is shifted downward to have an index one smaller than
2774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * the value it had previously.
2784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param i index of where to remove an object
2804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
2814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void removeElementAt(int i)
2824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
2834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (i > m_firstFree)
2854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      System.arraycopy(m_map, i + 1, m_map, i, m_firstFree);
2864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    else
2874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      m_map[i] = null;
2884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_firstFree--;
2904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
2914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
2934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Sets the component at the specified index of this vector to be the
2944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * specified object. The previous component at that position is discarded.
2954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * The index must be a value greater than or equal to 0 and less
2974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * than the current size of the vector.
2984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
2994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param value object to set
3004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param index Index of where to set the object
3014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void setElementAt(Object value, int index)
3034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map[index] = value;
3054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Get the nth element.
3094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param i index of object to get
3114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return object at given index
3134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final Object elementAt(int i)
3154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return m_map[i];
3174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Tell if the table contains the given Object.
3214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param s object to look for
3234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return true if the object is in the list
3254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final boolean contains(Object s)
3274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
3304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (m_map[i] == s)
3324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return true;
3334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return false;
3364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Searches for the first occurence of the given argument,
3404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * beginning the search at index, and testing for equality
3414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * using the equals method.
3424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param elem object to look for
3444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param index Index of where to begin search
3454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return the index of the first occurrence of the object
3464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * argument in this vector at position index or later in the
3474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * vector; returns -1 if the object is not found.
3484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final int indexOf(Object elem, int index)
3504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = index; i < m_firstFree; i++)
3534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (m_map[i] == elem)
3554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return i;
3564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return java.lang.Integer.MIN_VALUE;
3594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Searches for the first occurence of the given argument,
3634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * beginning the search at index, and testing for equality
3644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * using the equals method.
3654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param elem object to look for
3674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return the index of the first occurrence of the object
3684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * argument in this vector at position index or later in the
3694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * vector; returns -1 if the object is not found.
3704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final int indexOf(Object elem)
3724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = 0; i < m_firstFree; i++)
3754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (m_map[i] == elem)
3774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return i;
3784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return java.lang.Integer.MIN_VALUE;
3814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Searches for the first occurence of the given argument,
3854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * beginning the search at index, and testing for equality
3864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * using the equals method.
3874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param elem Object to look for
3894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return the index of the first occurrence of the object
3904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * argument in this vector at position index or later in the
3914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * vector; returns -1 if the object is not found.
3924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final int lastIndexOf(Object elem)
3944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    for (int i = (m_firstFree - 1); i >= 0; i--)
3974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (m_map[i] == elem)
3994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return i;
4004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
4014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return java.lang.Integer.MIN_VALUE;
4034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
4044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /*
4064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Reset the array to the supplied size.
4074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param size
4094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
4104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public final void setToSize(int size) {
4114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    Object newMap[] = new Object[size];
4134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    System.arraycopy(m_map, 0, newMap, 0, m_firstFree);
4154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_mapSize = size;
4164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    m_map = newMap;
4184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
4204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
4214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
4224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Returns clone of current ObjectVector
4234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
4244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return clone of current ObjectVector
4254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
4264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public Object clone()
4274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    throws CloneNotSupportedException
4284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
4294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  	return new ObjectVector(this);
4304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
4314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
432