001: /* Copyright (c) 2001-2005, The HSQL Development Group
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the HSQL Development Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package org.hsqldb.store;
032:
033: import org.hsqldb.lib.Collection;
034: import org.hsqldb.lib.Iterator;
035: import org.hsqldb.lib.Set;
036:
037: /**
038: * Maps integer keys to Objects. Hashes the keys.
039: *
040: * @author fredt@users
041: * @version 1.8.0
042: * @since 1.8.0
043: */
044: public class ObjectCacheHashMap extends BaseHashMap {
045:
046: Set keySet;
047: Collection values;
048:
049: public ObjectCacheHashMap(int initialCapacity)
050: throws IllegalArgumentException {
051: super (initialCapacity, 1, BaseHashMap.intKeyOrValue,
052: BaseHashMap.objectKeyOrValue, true);
053: }
054:
055: public Object get(int key) {
056:
057: if (accessCount == Integer.MAX_VALUE) {
058: resetAccessCount();
059: }
060:
061: int lookup = getLookup(key);
062:
063: if (lookup == -1) {
064: return null;
065: }
066:
067: accessTable[lookup] = accessCount++;
068:
069: return objectValueTable[lookup];
070: }
071:
072: public Object put(int key, Object value) {
073:
074: if (accessCount == Integer.MAX_VALUE) {
075: resetAccessCount();
076: }
077:
078: return super .addOrRemove(key, value, false);
079: }
080:
081: public Object remove(int key) {
082: return super .addOrRemove(key, null, true);
083: }
084:
085: /**
086: * for count number of elements with the given margin, return the access
087: * count.
088: */
089: public int getAccessCountCeiling(int count, int margin) {
090: return super .getAccessCountCeiling(count, margin);
091: }
092:
093: /**
094: * This is called after all elements below count accessCount have been
095: * removed
096: */
097: public void setAccessCountFloor(int count) {
098: super .accessMin = count;
099: }
100:
101: public ObjectCacheIterator iterator() {
102: return new ObjectCacheIterator();
103: }
104:
105: public class ObjectCacheIterator extends BaseHashIterator implements
106: Iterator {
107: }
108: }
|