com.gemstone.gnu.trove.TFloatIntHashMap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gemfire-trove Show documentation
Show all versions of gemfire-trove Show documentation
SnappyData store based off Pivotal GemFireXD
The newest version!
///////////////////////////////////////////////////////////////////////////////
// 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.
///////////////////////////////////////////////////////////////////////////////
/*
* Contains changes for GemFireXD distributed data platform.
*
* Portions Copyright (c) 2010-2015 Pivotal Software, Inc. 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 com.gemstone.gnu.trove;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* An open addressed Map implementation for float keys and int values.
*
* Created: Sun Nov 4 08:52:45 2001
*
* @author Eric D. Friedman
* @version $Id: TFloatIntHashMap.java,v 1.15 2003/11/21 17:32:30 ericdf Exp $
*/
public class TFloatIntHashMap extends TFloatHash implements Serializable {
private static final long serialVersionUID = 7646740668793937150L;
/** the values of the map */
protected transient int[] _values;
/**
* Creates a new TFloatIntHashMap
instance with the default
* capacity and load factor.
*/
public TFloatIntHashMap() {
super();
}
/**
* Creates a new TFloatIntHashMap
instance with a prime
* capacity equal to or greater than initialCapacity and
* with the default load factor.
*
* @param initialCapacity an int
value
*/
public TFloatIntHashMap(int initialCapacity) {
super(initialCapacity);
}
/**
* Creates a new TFloatIntHashMap
instance with a prime
* capacity equal to or greater than initialCapacity and
* with the specified load factor.
*
* @param initialCapacity an int
value
* @param loadFactor a float
value
*/
public TFloatIntHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
}
/**
* Creates a new TFloatIntHashMap
instance with the default
* capacity and load factor.
* @param strategy used to compute hash codes and to compare keys.
*/
public TFloatIntHashMap(TFloatHashingStrategy strategy) {
super(strategy);
}
/**
* Creates a new TFloatIntHashMap
instance whose capacity
* is the next highest prime above initialCapacity + 1
* unless that value is already prime.
*
* @param initialCapacity an int
value
* @param strategy used to compute hash codes and to compare keys.
*/
public TFloatIntHashMap(int initialCapacity, TFloatHashingStrategy strategy) {
super(initialCapacity, strategy);
}
/**
* Creates a new TFloatIntHashMap
instance with a prime
* value at or near the specified capacity and load factor.
*
* @param initialCapacity used to find a prime capacity for the table.
* @param loadFactor used to calculate the threshold over which
* rehashing takes place.
* @param strategy used to compute hash codes and to compare keys.
*/
public TFloatIntHashMap(int initialCapacity, float loadFactor, TFloatHashingStrategy strategy) {
super(initialCapacity, loadFactor, strategy);
}
/**
* @return a deep clone of this collection
*/
@Override // GemStoneAddition
public Object clone() {
TFloatIntHashMap m = (TFloatIntHashMap)super.clone();
m._values = this._values.clone();
return m;
}
/**
* @return a TFloatIntIterator with access to this map's keys and values
*/
public TFloatIntIterator iterator() {
return new TFloatIntIterator(this);
}
/**
* initializes the hashtable to a prime capacity which is at least
* initialCapacity + 1.
*
* @param initialCapacity an int
value
* @return the actual capacity chosen
*/
@Override // GemStoneAddition
protected int setUp(int initialCapacity) {
int capacity;
capacity = super.setUp(initialCapacity);
_values = new int[capacity];
return capacity;
}
/**
* Inserts a key/value pair into the map.
*
* @param key an float
value
* @param value an int
value
* @return the previous value associated with key,
* or (int)0 if none was found.
*/
public int put(float key, int value) {
byte previousState;
int previous = 0;
int index = insertionIndex(key);
boolean isNewMapping = true;
if (index < 0) {
index = -index -1;
previous = _values[index];
isNewMapping = false;
}
previousState = _states[index];
_set[index] = key;
_states[index] = FULL;
_values[index] = value;
if (isNewMapping) {
postInsertHook(previousState == FREE);
}
return previous;
}
/**
* rehashes the map to the new capacity.
*
* @param newCapacity an int
value
*/
@Override // GemStoneAddition
protected void rehash(int newCapacity) {
int oldCapacity = _set.length;
float oldKeys[] = _set;
int oldVals[] = _values;
byte oldStates[] = _states;
_set = new float[newCapacity];
_values = new int[newCapacity];
_states = new byte[newCapacity];
for (int i = oldCapacity; i-- > 0;) {
if(oldStates[i] == FULL) {
float o = oldKeys[i];
int index = insertionIndex(o);
_set[index] = o;
_values[index] = oldVals[i];
_states[index] = FULL;
}
}
}
/**
* retrieves the value for key
*
* @param key an float
value
* @return the value of key or (int)0 if no such mapping exists.
*/
public int get(float key) {
int index = index(key);
return index < 0 ? (int)0 : _values[index];
}
/**
* Empties the map.
*
*/
@Override // GemStoneAddition
public void clear() {
super.clear();
float[] keys = _set;
int[] vals = _values;
byte[] states = _states;
for (int i = keys.length; i-- > 0;) {
keys[i] = 0;
vals[i] = 0;
states[i] = FREE;
}
}
/**
* Deletes a key/value pair from the map.
*
* @param key an float
value
* @return an int
value, or (int)0 if no mapping for key exists
*/
public int remove(float key) {
int prev = 0;
int index = index(key);
if (index >= 0) {
prev = _values[index];
removeAt(index); // clear key,state; adjust size
}
return prev;
}
/**
* Compares this map with another map for equality of their stored
* entries.
*
* @param other an Object
value
* @return a boolean
value
*/
@Override // GemStoneAddition
public boolean equals(Object other) {
if (! (other instanceof TFloatIntHashMap)) {
return false;
}
TFloatIntHashMap that = (TFloatIntHashMap)other;
if (that.size() != this.size()) {
return false;
}
return forEachEntry(new EqProcedure(that));
}
@Override // GemStoneAddition
public int hashCode() {
HashProcedure p = new HashProcedure();
forEachEntry(p);
return p.getHashCode();
}
protected/*GemStoneAddition*/ final class HashProcedure implements TFloatIntProcedure {
private int h = 0;
public int getHashCode() {
return h;
}
public final boolean execute(float key, int value) {
h += (_hashingStrategy.computeHashCode(key) ^ HashFunctions.hash(value));
return true;
}
}
private static final class EqProcedure implements TFloatIntProcedure {
private final TFloatIntHashMap _otherMap;
EqProcedure(TFloatIntHashMap otherMap) {
_otherMap = otherMap;
}
public final boolean execute(float key, int value) {
int index = _otherMap.index(key);
if (index >= 0 && eq(value, _otherMap.get(key))) {
return true;
}
return false;
}
/**
* Compare two ints for equality.
*/
private final boolean eq(int v1, int v2) {
return v1 == v2;
}
}
/**
* removes the mapping at index from the map.
*
* @param index an int
value
*/
@Override // GemStoneAddition
protected void removeAt(int index) {
super.removeAt(index); // clear key, state; adjust size
_values[index] = 0;
}
/**
* Returns the values of the map.
*
* @return a Collection
value
*/
public int[] getValues() {
int[] vals = new int[size()];
int[] v = _values;
byte[] states = _states;
for (int i = v.length, j = 0; i-- > 0;) {
if (states[i] == FULL) {
vals[j++] = v[i];
}
}
return vals;
}
/**
* returns the keys of the map.
*
* @return a Set
value
*/
public float[] keys() {
float[] keys = new float[size()];
float[] k = _set;
byte[] states = _states;
for (int i = k.length, j = 0; i-- > 0;) {
if (states[i] == FULL) {
keys[j++] = k[i];
}
}
return keys;
}
/**
* checks for the presence of val in the values of the map.
*
* @param val an int
value
* @return a boolean
value
*/
public boolean containsValue(int val) {
byte[] states = _states;
int[] vals = _values;
for (int i = vals.length; i-- > 0;) {
if (states[i] == FULL && val == vals[i]) {
return true;
}
}
return false;
}
/**
* checks for the present of key in the keys of the map.
*
* @param key an float
value
* @return a boolean
value
*/
public boolean containsKey(float key) {
return contains(key);
}
/**
* Executes procedure for each key in the map.
*
* @param procedure a TFloatProcedure
value
* @return false if the loop over the keys terminated because
* the procedure returned false for some key.
*/
public boolean forEachKey(TFloatProcedure procedure) {
return forEach(procedure);
}
/**
* Executes procedure for each value in the map.
*
* @param procedure a TIntProcedure
value
* @return false if the loop over the values terminated because
* the procedure returned false for some value.
*/
public boolean forEachValue(TIntProcedure procedure) {
byte[] states = _states;
int[] values = _values;
for (int i = values.length; i-- > 0;) {
if (states[i] == FULL && ! procedure.execute(values[i])) {
return false;
}
}
return true;
}
/**
* Executes procedure for each key/value entry in the
* map.
*
* @param procedure a TOFloatIntProcedure
value
* @return false if the loop over the entries terminated because
* the procedure returned false for some entry.
*/
public boolean forEachEntry(TFloatIntProcedure procedure) {
byte[] states = _states;
float[] keys = _set;
int[] values = _values;
for (int i = keys.length; i-- > 0;) {
if (states[i] == FULL && ! procedure.execute(keys[i],values[i])) {
return false;
}
}
return true;
}
/**
* Retains only those entries in the map for which the procedure
* returns a true value.
*
* @param procedure determines which entries to keep
* @return true if the map was modified.
*/
public boolean retainEntries(TFloatIntProcedure procedure) {
boolean modified = false;
byte[] states = _states;
float[] keys = _set;
int[] values = _values;
for (int i = keys.length; i-- > 0;) {
if (states[i] == FULL && ! procedure.execute(keys[i],values[i])) {
removeAt(i);
modified = true;
}
}
return modified;
}
/**
* Transform the values in this map using function.
*
* @param function a TIntFunction
value
*/
public void transformValues(TIntFunction function) {
byte[] states = _states;
int[] values = _values;
for (int i = values.length; i-- > 0;) {
if (states[i] == FULL) {
values[i] = function.execute(values[i]);
}
}
}
/**
* Increments the primitive value mapped to key by 1
*
* @param key the key of the value to increment
* @return true if a mapping was found and modified.
*/
public boolean increment(float key) {
return adjustValue(key, 1);
}
/**
* Adjusts the primitive value mapped to key.
*
* @param key the key of the value to increment
* @param amount the amount to adjust the value by.
* @return true if a mapping was found and modified.
*/
public boolean adjustValue(float key, int amount) {
int index = index(key);
if (index < 0) {
return false;
} else {
_values[index] += amount;
return true;
}
}
private void writeObject(ObjectOutputStream stream)
throws IOException {
stream.defaultWriteObject();
// number of entries
stream.writeInt(_size);
SerializationProcedure writeProcedure = new SerializationProcedure(stream);
if (! forEachEntry(writeProcedure)) {
throw writeProcedure.exception;
}
}
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
int size = stream.readInt();
setUp(size);
while (size-- > 0) {
float key = stream.readFloat();
int val = stream.readInt();
put(key, val);
}
}
} // TFloatIntHashMap