StringToIntTable.java revision 4c7a0d97cf2b27790e6236965a1d798d710d7ec7
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: StringToIntTable.java 468654 2006-10-28 07:09:23Z minchau $ 204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xml.serializer.utils; 224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * A very simple lookup table that stores a list of strings, the even 254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * number strings being keys, and the odd number strings being values. 264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class is a copy of the one in org.apache.xml.utils. 284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * It exists to cut the serializers dependancy on that package. 294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class is not a public API, it is only public so it can be used 314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * in org.apache.xml.serializer. 324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage internal 344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic final class StringToIntTable 364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{ 374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public static final int INVALID_KEY = -10000; 394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Block size to allocate */ 414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private int m_blocksize; 424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Array of strings this table points to. Associated with ints 444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * in m_values */ 454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private String m_map[]; 464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Array of ints this table points. Associated with strings from 484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * m_map. */ 494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private int m_values[]; 504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Number of ints in the table */ 524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private int m_firstFree = 0; 534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** Size of this table */ 554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson private int m_mapSize; 564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Default constructor. Note that the default 594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * block size is very small, for small lists. 604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public StringToIntTable() 624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_blocksize = 8; 654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_mapSize = m_blocksize; 664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_map = new String[m_blocksize]; 674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_values = new int[m_blocksize]; 684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Construct a StringToIntTable, using the given block size. 724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param blocksize Size of block to allocate 744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public StringToIntTable(int blocksize) 764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_blocksize = blocksize; 794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_mapSize = blocksize; 804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_map = new String[blocksize]; 814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_values = new int[m_blocksize]; 824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get the length of the list. 864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return the length of the list 884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public final int getLength() 904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return m_firstFree; 924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Append a string onto the vector. 964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param key String to append 984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param value The int value of the string 994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public final void put(String key, int value) 1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if ((m_firstFree + 1) >= m_mapSize) 1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_mapSize += m_blocksize; 1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String newMap[] = new String[m_mapSize]; 1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1); 1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_map = newMap; 1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int newValues[] = new int[m_mapSize]; 1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson System.arraycopy(m_values, 0, newValues, 0, m_firstFree + 1); 1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_values = newValues; 1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_map[m_firstFree] = key; 1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_values[m_firstFree] = value; 1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_firstFree++; 1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Tell if the table contains the given string. 1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param key String to look for 1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The String's int value 1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public final int get(String key) 1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < m_firstFree; i++) 1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (m_map[i].equals(key)) 1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return m_values[i]; 1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return INVALID_KEY; 1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Tell if the table contains the given string. Ignore case. 1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param key String to look for 1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return The string's int value 1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public final int getIgnoreCase(String key) 1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (null == key) 1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return INVALID_KEY; 1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < m_firstFree; i++) 1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (m_map[i].equalsIgnoreCase(key)) 1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return m_values[i]; 1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return INVALID_KEY; 1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Tell if the table contains the given string. 1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param key String to look for 1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return True if the string is in the table 1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public final boolean contains(String key) 1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < m_firstFree; i++) 1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if (m_map[i].equals(key)) 1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return true; 1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return false; 1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Return array of keys in the table. 1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return Array of strings 1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public final String[] keys() 1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson String [] keysArr = new String[m_firstFree]; 1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson for (int i = 0; i < m_firstFree; i++) 1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson keysArr[i] = m_map[i]; 1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return keysArr; 2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson} 204