From 800a956ffed030dbce4ec2bf394a331ec6dbc83b Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Tue, 6 Jun 2006 15:35:19 +0000 Subject: interim checkin --- src/org/clojure/runtime/ArrayMap.java | 2 +- src/org/clojure/runtime/HashtableMap.java | 93 +++++++++++++--- src/org/clojure/runtime/ListMap.java | 173 ++++++++++++++++++++++++++++++ src/org/clojure/runtime/RBTree.java | 3 + 4 files changed, 255 insertions(+), 16 deletions(-) create mode 100644 src/org/clojure/runtime/ListMap.java (limited to 'src/org') diff --git a/src/org/clojure/runtime/ArrayMap.java b/src/org/clojure/runtime/ArrayMap.java index 45bde6b0..49dec167 100644 --- a/src/org/clojure/runtime/ArrayMap.java +++ b/src/org/clojure/runtime/ArrayMap.java @@ -23,7 +23,7 @@ import java.util.Iterator; * null keys and values are ok, but you won't be able to distinguish a null value via get - use contains/find */ -public class ArrayMap implements IMap, Iterable{ +public class ArrayMap implements IMap { final Object[] array; diff --git a/src/org/clojure/runtime/HashtableMap.java b/src/org/clojure/runtime/HashtableMap.java index 52119123..0bb1c53a 100644 --- a/src/org/clojure/runtime/HashtableMap.java +++ b/src/org/clojure/runtime/HashtableMap.java @@ -48,6 +48,12 @@ HashtableMap(int count,PersistentArray array) { this.growAtCount = (int) (this.array.length()*FILL_FACTOR); } +HashtableMap(int count,PersistentArray array,int growAt) { + this._count = count; + this.array = array; + this.growAtCount = growAt; +} + int calcPrimeCapacity(int capacity) { return BigInteger.valueOf((long) (capacity/FILL_FACTOR)).nextProbablePrime().intValue(); } @@ -82,7 +88,7 @@ public IMap put(Object key, Object val) { return this; if(array.get(i) != null && ((IMap)newArray.get(i)).count() == ((IMap)array.get(i)).count()) //key already there, no growth incr = 0; - return create(_count + incr, newArray); + return create(_count + incr, newArray, growAtCount); } PersistentArray doPut(int i,Object key,Object val,PersistentArray array){ @@ -95,7 +101,8 @@ PersistentArray doPut(int i,Object key,Object val,PersistentArray array){ return array; } else - newEntries = createArrayMap(new Object[]{key, val}); + newEntries = createListMap(key, val); + //newEntries = createArrayMap(new Object[]{key, val}); return array.set(i, newEntries); } @@ -139,22 +146,27 @@ IMap grow(){ return create(_count,newArray); } +/* static class Iter implements Iterator, IMapEntry{ - PersistentArray buckets; - int b; - Object[] nextEntries; - int nextE; + PersistentArray buckets; + + int b; - Object[] entries; - int e; + Object[] nextEntries; - Iter(PersistentArray buckets){ + int nextE; + + Object[] entries; + + int e; + + Iter(PersistentArray buckets){ this.buckets = buckets; this.b = -1; nextBucket(); } - private void nextBucket() { + private void nextBucket() { nextEntries = null; nextE = 0; for(b = b+1;b