@Override public int hashCode() { int h = 0; for (int i = 0; i < used; i++) { h += key(i).hashCode(); V v = value(i); if (v != null) { h += v.hashCode(); } } return h; }
private int [] getInOrder() { if (order == null) { order = new int[values.size()]; for (int i = 0; i < values.size(); i++) { order[i] = values.key(i); } Arrays.sort(order); } return order; }
@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; } }
@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 Struct clone() { Struct struct = (Struct) super.clone(); struct.values = new Hashlet<>(); struct.values.reserve(values.size()); for (int i = 0; i < values.size(); i++) { struct.values.put(values.key(i), values.value(i).clone()); } return struct; }