X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scenegraph%2Fsrc%2Fgnu%2Ftrove%2FTPrimitiveHash.java;fp=bundles%2Forg.simantics.scenegraph%2Fsrc%2Fgnu%2Ftrove%2FTPrimitiveHash.java;h=1a553add7c630e9ac14c14372a143fceeef8e26c;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scenegraph/src/gnu/trove/TPrimitiveHash.java b/bundles/org.simantics.scenegraph/src/gnu/trove/TPrimitiveHash.java new file mode 100644 index 000000000..1a553add7 --- /dev/null +++ b/bundles/org.simantics.scenegraph/src/gnu/trove/TPrimitiveHash.java @@ -0,0 +1,126 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2001, Eric D. Friedman All Rights Reserved. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/////////////////////////////////////////////////////////////////////////////// + +package gnu.trove; + +/** + * The base class for hashtables of primitive values. Since there is + * no notion of object equality for primitives, it isn't possible to + * use a `REMOVED' object to track deletions in an open-addressed table. + * So, we have to resort to using a parallel `bookkeeping' array of bytes, + * in which flags can be set to indicate that a particular slot in the + * hash table is FREE, FULL, or REMOVED. + * + * Created: Fri Jan 11 18:55:16 2002 + * + * @author Eric D. Friedman + * @version $Id: TPrimitiveHash.java,v 1.5 2008/10/08 16:39:10 robeden Exp $ + */ + +abstract public class TPrimitiveHash extends THash { + /** flags indicating whether each position in the hash is + * FREE, FULL, or REMOVED */ + protected transient byte[] _states; + + /* constants used for state flags */ + + /** flag indicating that a slot in the hashtable is available */ + protected static final byte FREE = 0; + + /** flag indicating that a slot in the hashtable is occupied */ + protected static final byte FULL = 1; + + /** flag indicating that the value of a slot in the hashtable + * was deleted */ + protected static final byte REMOVED = 2; + + /** + * Creates a new THash instance with the default + * capacity and load factor. + */ + public TPrimitiveHash() { + super(); + } + + /** + * Creates a new TPrimitiveHash instance with a prime + * capacity at or near the specified capacity and with the default + * load factor. + * + * @param initialCapacity an int value + */ + public TPrimitiveHash(int initialCapacity) { + this(initialCapacity, DEFAULT_LOAD_FACTOR); + } + + /** + * Creates a new TPrimitiveHash instance with a prime + * capacity at or near the minimum needed to hold + * initialCapacity elements with load factor + * loadFactor without triggering a rehash. + * + * @param initialCapacity an int value + * @param loadFactor a float value + */ + public TPrimitiveHash(int initialCapacity, float loadFactor) { + super(); + _loadFactor = loadFactor; + setUp(HashFunctions.fastCeil(initialCapacity / loadFactor)); + } + + public Object clone() { + TPrimitiveHash h = (TPrimitiveHash)super.clone(); + h._states = (byte[])this._states.clone(); + return h; + } + + /** + * Returns the capacity of the hash table. This is the true + * physical capacity, without adjusting for the load factor. + * + * @return the physical capacity of the hash table. + */ + protected int capacity() { + return _states.length; + } + + /** + * Delete the record at index. + * + * @param index an int value + */ + protected void removeAt(int index) { + _states[index] = REMOVED; + super.removeAt(index); + } + + /** + * initializes the hashtable to a prime capacity which is at least + * initialCapacity + 1. + * + * @param initialCapacity an int value + * @return the actual capacity chosen + */ + protected int setUp(int initialCapacity) { + int capacity; + + capacity = super.setUp(initialCapacity); + _states = new byte[capacity]; + return capacity; + } +} // TPrimitiveHash