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: StringToIntTable.java 468655 2006-10-28 07:12:06Z minchau $ 020 */ 021 package org.apache.xml.utils; 022 023 /** 024 * A very simple lookup table that stores a list of strings, the even 025 * number strings being keys, and the odd number strings being values. 026 * @xsl.usage internal 027 */ 028 public class StringToIntTable 029 { 030 031 public static final int INVALID_KEY = -10000; 032 033 /** Block size to allocate */ 034 private int m_blocksize; 035 036 /** Array of strings this table points to. Associated with ints 037 * in m_values */ 038 private String m_map[]; 039 040 /** Array of ints this table points. Associated with strings from 041 * m_map. */ 042 private int m_values[]; 043 044 /** Number of ints in the table */ 045 private int m_firstFree = 0; 046 047 /** Size of this table */ 048 private int m_mapSize; 049 050 /** 051 * Default constructor. Note that the default 052 * block size is very small, for small lists. 053 */ 054 public StringToIntTable() 055 { 056 057 m_blocksize = 8; 058 m_mapSize = m_blocksize; 059 m_map = new String[m_blocksize]; 060 m_values = new int[m_blocksize]; 061 } 062 063 /** 064 * Construct a StringToIntTable, using the given block size. 065 * 066 * @param blocksize Size of block to allocate 067 */ 068 public StringToIntTable(int blocksize) 069 { 070 071 m_blocksize = blocksize; 072 m_mapSize = blocksize; 073 m_map = new String[blocksize]; 074 m_values = new int[m_blocksize]; 075 } 076 077 /** 078 * Get the length of the list. 079 * 080 * @return the length of the list 081 */ 082 public final int getLength() 083 { 084 return m_firstFree; 085 } 086 087 /** 088 * Append a string onto the vector. 089 * 090 * @param key String to append 091 * @param value The int value of the string 092 */ 093 public final void put(String key, int value) 094 { 095 096 if ((m_firstFree + 1) >= m_mapSize) 097 { 098 m_mapSize += m_blocksize; 099 100 String newMap[] = new String[m_mapSize]; 101 102 System.arraycopy(m_map, 0, newMap, 0, m_firstFree + 1); 103 104 m_map = newMap; 105 106 int newValues[] = new int[m_mapSize]; 107 108 System.arraycopy(m_values, 0, newValues, 0, m_firstFree + 1); 109 110 m_values = newValues; 111 } 112 113 m_map[m_firstFree] = key; 114 m_values[m_firstFree] = value; 115 116 m_firstFree++; 117 } 118 119 /** 120 * Tell if the table contains the given string. 121 * 122 * @param key String to look for 123 * 124 * @return The String's int value 125 * 126 */ 127 public final int get(String key) 128 { 129 130 for (int i = 0; i < m_firstFree; i++) 131 { 132 if (m_map[i].equals(key)) 133 return m_values[i]; 134 } 135 136 return INVALID_KEY; 137 } 138 139 /** 140 * Tell if the table contains the given string. Ignore case. 141 * 142 * @param key String to look for 143 * 144 * @return The string's int value 145 */ 146 public final int getIgnoreCase(String key) 147 { 148 149 if (null == key) 150 return INVALID_KEY; 151 152 for (int i = 0; i < m_firstFree; i++) 153 { 154 if (m_map[i].equalsIgnoreCase(key)) 155 return m_values[i]; 156 } 157 158 return INVALID_KEY; 159 } 160 161 /** 162 * Tell if the table contains the given string. 163 * 164 * @param key String to look for 165 * 166 * @return True if the string is in the table 167 */ 168 public final boolean contains(String key) 169 { 170 171 for (int i = 0; i < m_firstFree; i++) 172 { 173 if (m_map[i].equals(key)) 174 return true; 175 } 176 177 return false; 178 } 179 180 /** 181 * Return array of keys in the table. 182 * 183 * @return Array of strings 184 */ 185 public final String[] keys() 186 { 187 String [] keysArr = new String[m_firstFree]; 188 189 for (int i = 0; i < m_firstFree; i++) 190 { 191 keysArr[i] = m_map[i]; 192 } 193 194 return keysArr; 195 } 196 }