@Override public boolean equals(Object o) { if (! (o instanceof Hashlet) ) return false; Hashlet<?, ?> rhs = (Hashlet<?, ?>) o; if (used != rhs.used) return false; for (int i = 0; i < used; i++) { int bi = rhs.getIndexOfKey(key(i)); if (bi == -1) return false; Object a = value(i); Object b = rhs.value(bi); boolean equal = (a == null) ? b == null : a.equals(b); if ( !equal ) return false; } return true; } }
public FieldValue getValue() { return values.get(id); }
/** * Obtain the value for a specific key. * * @return the value for a key, or null if not found * @param key the key **/ public V get(Object key) { int index = getIndexOfKey(key); return (index != -1) ? value(index) : null; }
public FieldValue setValue(FieldValue value) { if (value == null) { throw new NullPointerException("Null values in Struct not supported, use removeFieldValue() to remove value instead."); } int index = values.getIndexOfKey(id); FieldValue retVal = null; if (index == -1) { values.put(id, value); invalidateOrder(); } else { retVal = values.value(index); values.setValue(index, value); } return retVal; }
@Override protected void doSetFieldValue(Field field, FieldValue value) { if (field == null) { throw new IllegalArgumentException("Invalid null field pointer"); } Field myField = getDataType().getField(field.getId()); if (myField==null) { throw new IllegalArgumentException("No such field in "+getDataType()+" : "+field.getName()); } if (!myField .getDataType().isValueCompatible(value)) { throw new IllegalArgumentException( "Incompatible data types. Got " + value.getDataType() + ", expected " + myField.getDataType()); } if (myField.getId() != field.getId()) { throw new IllegalArgumentException( "Inconsistent field: " + field); } int index = values.getIndexOfKey(field.getId()); if (index == -1) { values.put(field.getId(), value); invalidateOrder(); } else { values.setValue(index, value); } }
/** * Associate a value with a specific key. * * @return the old value for the key, if it was already present * @param key the key * @param value the value **/ public V put(K key, V value) { reserve(1); int prev = Math.abs(key.hashCode() % hashSize()); int entry = hash[prev]; while (entry != 0) { final int idx = hash[entry]; if (store[idx].equals(key)) { // found entry @SuppressWarnings("unchecked") final V ret = (V) store[capacity + idx]; store[capacity + idx] = value; return ret; } prev = entry + 1; entry = hash[prev]; } final int insertIdx = (hashSize() + (used * 2)); hash[prev] = insertIdx; hash[insertIdx] = used; store[used] = key; store[capacity + (used++)] = value; return null; }
/** * This will replace the value at the index give. * * @param i the index of the value, must be in the range [0, size() - 1] * @param value The new value you want to set for this index. * @return previous value */ public V setValue(int i, V value) { V prev = value(i); store[capacity + i] = value; return prev; }
/** * Finds the index where the key,value pair is stored. * @param key to look for * @return the index where the key is found or -1 if it is not found */ public int getIndexOfKey(Object key) { int entry = hash[Math.abs(key.hashCode() % hashSize())]; while (entry != 0) { final int idx = hash[entry]; if (store[idx].equals(key)) { // found entry return idx; } entry = hash[entry + 1]; } return -1; }
@Override public void clear() { values = new Hashlet<>(); invalidateOrder(); }
@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Struct)) return false; if (!super.equals(o)) return false; Struct struct = (Struct) o; return values.equals(struct.values); }
@Override public int hashCode() { int result = super.hashCode(); result = 31 * result + values.hashCode(); return result; }
hash = new int[hashSize() + (capacity * 2)]; if (c > 0) { System.arraycopy(s, 0, store, 0, used); System.arraycopy(s, c, store, capacity, used); for (int i = 0; i < used; i++) { int prev = Math.abs(s[i].hashCode() % hashSize()); int entry = hash[prev]; while (entry != 0) { entry = hash[prev]; final int insertIdx = (hashSize() + (i * 2)); hash[prev] = insertIdx; hash[insertIdx] = i;
@Override public FieldValue removeFieldValue(Field field) { FieldValue found = values.get(field.getId()); if (found != null) { Hashlet<Integer, FieldValue> copy = new Hashlet<>(); copy.reserve(values.size() - 1); for (int i=0; i < values.size(); i++) { if (values.key(i) != field.getId()) { copy.put(values.key(i), values.value(i)); } } values = copy; invalidateOrder(); } return found; }
@Override public FieldValue getFieldValue(Field field) { return values.get(field.getId()); }
@Override public String toString() { StringBuilder retVal = new StringBuilder(); retVal.append("Struct (").append(getDataType()).append("): "); int [] increasing = getInOrder(); for (int i = 0; i < increasing.length; i++) { int id = increasing[i]; retVal.append(getDataType().getField(id)).append("=").append(values.get(id)).append(", "); } return retVal.toString(); }