001: /*
002: * $Id: IVMap.java,v 1.2 2002/02/15 23:44:28 skavish Exp $
003: *
004: * ===========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.util;
052:
053: import java.io.*;
054: import java.util.*;
055:
056: import org.openlaszlo.iv.flash.api.*;
057:
058: /**
059: * Simple unsynchronized hashtable with integer keys.
060: *
061: * @author Dmitry Skavish
062: */
063: public final class IVMap {
064:
065: private static final int DEFAULT_SIZE = 257;
066: private static final float DEFAULT_RATIO = 0.75f;
067:
068: private MyNode[] buckets;
069: private int size;
070: private int limit;
071: private int length;
072:
073: /**
074: * Create empty hashtable.
075: */
076: public IVMap() {
077: clear();
078: }
079:
080: /**
081: * Add flash definition to the hashtable by it's ID.
082: *
083: * @param def flash definition to add
084: */
085: public void add(FlashDef def) {
086: put(def.getID(), def);
087: }
088:
089: /**
090: * Add flash definition to the hashtable by integer key.
091: *
092: * @param key object's key
093: * @param def flash definition to add
094: */
095: public void put(int key, FlashDef def) {
096: int probe = key % length;
097: MyNode newNode = new MyNode(key, def);
098: newNode.next = buckets[probe];
099: buckets[probe] = newNode;
100: if (size++ > limit)
101: expand();
102: }
103:
104: /**
105: * Retrieve flash definition by integer key.
106: *
107: * @param key defintion's key
108: * @return found flash defintion or null
109: */
110: public FlashDef get(int key) {
111: for (MyNode node = buckets[key % length]; node != null; node = node.next) {
112: if (key == node.key)
113: return node.value;
114: }
115: return null;
116: }
117:
118: /**
119: * Number of objects in the hashtable.
120: *
121: * @return number of objects
122: */
123: public int size() {
124: return size;
125: }
126:
127: /**
128: * Enumeration of all the values (FlashDef's) of the hashtable.
129: *
130: * @return values of the hashtable
131: */
132: public Enumeration values() {
133: return new Enumeration() {
134: int cur = 0;
135: MyNode node = null;
136:
137: public boolean hasMoreElements() {
138: while (node == null) {
139: if (cur >= length)
140: return false;
141: node = buckets[cur++];
142: }
143: return true;
144: }
145:
146: public Object nextElement() {
147: if (!hasMoreElements())
148: return null;
149: Object value = node.value;
150: node = node.next;
151: return value;
152: }
153: };
154: }
155:
156: /**
157: * Clear hashtable.
158: */
159: public void clear() {
160: length = DEFAULT_SIZE;
161: buckets = new MyNode[length];
162: size = 0;
163: limit = (int) (length * DEFAULT_RATIO);
164: }
165:
166: protected void expand() {
167: length = length * 2 + 1;
168: MyNode[] new_bucket = new MyNode[length];
169: for (int i = buckets.length; --i >= 0;) {
170: MyNode node = buckets[i];
171: while (node != null) {
172: MyNode cnode = node;
173: node = node.next;
174: int probe = cnode.key % length;
175: cnode.next = new_bucket[probe];
176: new_bucket[probe] = cnode;
177: }
178: }
179: limit = (int) (length * DEFAULT_RATIO);
180: buckets = new_bucket;
181: }
182:
183: static class MyNode {
184: public int key;
185: public FlashDef value;
186: public MyNode next;
187:
188: public MyNode(int key, FlashDef value) {
189: this.key = key;
190: ;
191: this.value = value;
192: }
193: }
194:
195: }
|