private PersistentArrayMap toMap() { Object array[] = new Object[values.size() * 2]; List<String> fields = getFields().toList(); for (int i = 0; i < values.size(); i++) { array[i * 2] = fields.get(i); array[(i * 2) + 1] = values.get(i); } return new PersistentArrayMap(array); }
@Override public Object deserialize(JsonNode n, ObjectMapper mapper) { HashMap<String, Object> map = new HashMap<String, Object>(); Iterator<Map.Entry<String, JsonNode>> entries = n.fields(); while (entries.hasNext()) { try { Map.Entry<String, JsonNode> ee = entries.next(); map.put(ee.getKey(), parent.deserialize(ee.getValue(), mapper)); } catch (Exception e) { LoggerFactory.getLogger(this.getClass().getName()).error(e.getMessage()); } } return PersistentArrayMap.create(map); } }
static public PersistentArrayMap createWithCheck(Object[] init){ for(int i=0;i< init.length;i += 2) { for(int j=i+2;j<init.length;j += 2) { if(equalKey(init[i],init[j])) throw new IllegalArgumentException("Duplicate key: " + init[i]); } } return new PersistentArrayMap(init); }
public IPersistentMap assocEx(Object key, Object val) { int i = indexOf(key); Object[] newArray; if(i >= 0) { throw Util.runtimeException("Key already present"); } else //didn't have key, grow { if(array.length > HASHTABLE_THRESHOLD) return createHT(array).assocEx(key, val); newArray = new Object[array.length + 2]; if(array.length > 0) System.arraycopy(array, 0, newArray, 2, array.length); newArray[0] = key; newArray[1] = val; } return create(newArray); }
public IPersistentMap without(Object key){ int i = indexOf(key); if(i >= 0) //have key, will remove { int newlen = array.length - 2; if(newlen == 0) return empty(); Object[] newArray = new Object[newlen]; for(int s = 0, d = 0; s < array.length; s += 2) { if(!equalKey(array[s], key)) //skip removal key { newArray[d] = array[s]; newArray[d + 1] = array[s + 1]; d += 2; } } return create(newArray); } //don't have key, no op return this; }
TransientMap() { this.delegate = PersistentArrayMap.EMPTY.asTransient(); }
PersistentArrayMap create(Object... init){ return new PersistentArrayMap(meta(), init); }
public IPersistentMap without(Object key){ int i = indexOf(key); if(i >= 0) //have key, will remove { int newlen = array.length - 2; if(newlen == 0) return empty(); Object[] newArray = new Object[newlen]; for(int s = 0, d = 0; s < array.length; s += 2) { if(!equalKey(array[s], key)) //skip removal key { newArray[d] = array[s]; newArray[d + 1] = array[s + 1]; d += 2; } } return create(newArray); } //don't have key, no op return this; }
public IMapEntry entryAt(Object key){ int i = indexOf(key); if(i >= 0) return new MapEntry(array[i],array[i+1]); return null; }
private int indexOf(Object key){ for(int i = 0; i < len; i += 2) { if(equalKey(array[i], key)) return i; } return -1; }
private int indexOf(Object key){ if(key instanceof Keyword) { for(int i = 0; i < array.length; i += 2) { if(key == array[i]) return i; } return -1; } else return indexOfObject(key); }
public int capacity(){ return count(); }
static public PersistentArrayMap createWithCheck(Object[] init){ for(int i=0;i< init.length;i += 2) { for(int j=i+2;j<init.length;j += 2) { if(equalKey(init[i],init[j])) throw new IllegalArgumentException("Duplicate key: " + init[i]); } } return new PersistentArrayMap(init); }
public IPersistentMap assocEx(Object key, Object val) { int i = indexOf(key); Object[] newArray; if(i >= 0) { throw Util.runtimeException("Key already present"); } else //didn't have key, grow { if(array.length > HASHTABLE_THRESHOLD) return createHT(array).assocEx(key, val); newArray = new Object[array.length + 2]; if(array.length > 0) System.arraycopy(array, 0, newArray, 2, array.length); newArray[0] = key; newArray[1] = val; } return create(newArray); }
static public IPersistentMap create(Map other){ ITransientMap ret = EMPTY.asTransient(); for(Object o : other.entrySet()) { Map.Entry e = (Entry) o; ret = ret.assoc(e.getKey(), e.getValue()); } return ret.persistent(); }
PersistentArrayMap create(Object... init){ return new PersistentArrayMap(meta(), init); }
final public Object valAt(Object key, Object notFound){ int i = indexOf(key); if(i >= 0) return array[i + 1]; return notFound; }
private int indexOf(Object key){ for(int i = 0; i < len; i += 2) { if(equalKey(array[i], key)) return i; } return -1; }
private int indexOf(Object key){ if(key instanceof Keyword) { for(int i = 0; i < array.length; i += 2) { if(key == array[i]) return i; } return -1; } else return indexOfObject(key); }
public int capacity(){ return count(); }