/*
 * Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
 * and the EPL 1.0 (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.util;

import java.util.HashMap;
import java.util.Iterator;

import org.h2.api.ErrorCode;
import org.h2.message.DbException;

A simple hash table with an optimization for the last recently used object.
/** * A simple hash table with an optimization for the last recently used object. */
public class SmallMap { private final HashMap<Integer, Object> map = new HashMap<>(); private Object cache; private int cacheId; private int lastId; private final int maxElements;
Create a map with the given maximum number of entries.
Params:
  • maxElements – the maximum number of entries
/** * Create a map with the given maximum number of entries. * * @param maxElements the maximum number of entries */
public SmallMap(int maxElements) { this.maxElements = maxElements; }
Add an object to the map. If the size of the map is larger than twice the maximum size, objects with a low id are removed.
Params:
  • id – the object id
  • o – the object
Returns:the id
/** * Add an object to the map. If the size of the map is larger than twice the * maximum size, objects with a low id are removed. * * @param id the object id * @param o the object * @return the id */
public int addObject(int id, Object o) { if (map.size() > maxElements * 2) { Iterator<Integer> it = map.keySet().iterator(); while (it.hasNext()) { Integer k = it.next(); if (k + maxElements < lastId) { it.remove(); } } } if (id > lastId) { lastId = id; } map.put(id, o); cacheId = id; cache = o; return id; }
Remove an object from the map.
Params:
  • id – the id of the object to remove
/** * Remove an object from the map. * * @param id the id of the object to remove */
public void freeObject(int id) { if (cacheId == id) { cacheId = -1; cache = null; } map.remove(id); }
Get an object from the map if it is stored.
Params:
  • id – the id of the object
  • ifAvailable – only return it if available, otherwise return null
Throws:
  • DbException – if isAvailable is false and the object has not been found
Returns:the object or null
/** * Get an object from the map if it is stored. * * @param id the id of the object * @param ifAvailable only return it if available, otherwise return null * @return the object or null * @throws DbException if isAvailable is false and the object has not been * found */
public Object getObject(int id, boolean ifAvailable) { if (id == cacheId) { return cache; } Object obj = map.get(id); if (obj == null && !ifAvailable) { throw DbException.get(ErrorCode.OBJECT_CLOSED); } return obj; } }