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