diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-07-04 20:05:37 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-07-04 20:05:37 +0000 |
commit | 84406ba09fe16b4b56b5ce40de33f8bee340a947 (patch) | |
tree | bb89ed0f635231901fcf4f69643f0866465eee60 /src | |
parent | 58ff927780b540fad69fc1a8614b216c379e9a2f (diff) |
made auto-morphing into hashtable
Diffstat (limited to 'src')
-rw-r--r-- | src/cli/runtime/PersistentArrayIdentityMap.cs | 4 | ||||
-rw-r--r-- | src/cli/runtime/PersistentArrayMap.cs | 13 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayIdentityMap.java | 3 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 12 |
4 files changed, 29 insertions, 3 deletions
diff --git a/src/cli/runtime/PersistentArrayIdentityMap.cs b/src/cli/runtime/PersistentArrayIdentityMap.cs index c154c548..fb5a4449 100644 --- a/src/cli/runtime/PersistentArrayIdentityMap.cs +++ b/src/cli/runtime/PersistentArrayIdentityMap.cs @@ -31,6 +31,10 @@ override internal PersistentArrayMap create(params Object[] init) return new PersistentArrayIdentityMap(init);
}
+override internal IPersistentMap createHT(Object[] init){
+ return new PersistentHashtableIdentityMap(init);
+}
+
public PersistentArrayIdentityMap(params Object[] init) :base(init) {
}
diff --git a/src/cli/runtime/PersistentArrayMap.cs b/src/cli/runtime/PersistentArrayMap.cs index df874d1a..ca48ee34 100644 --- a/src/cli/runtime/PersistentArrayMap.cs +++ b/src/cli/runtime/PersistentArrayMap.cs @@ -30,6 +30,8 @@ public class PersistentArrayMap : IPersistentMap, ISequential { internal readonly Object[] array;
public static PersistentArrayMap EMPTY = new PersistentArrayMap();
+
+ internal const int HASHTABLE_THRESHOLD = 42;
protected PersistentArrayMap(){
this.array = RT.EMPTY_ARRAY;
@@ -39,6 +41,9 @@ virtual internal PersistentArrayMap create(params Object[] init){ return new PersistentArrayMap(init);
}
+virtual internal IPersistentMap createHT(Object[] init){
+ return new PersistentHashtableMap(init);
+}
/**
* This ctor captures/aliases the passed array, so do not modify later
* @param init {key1,val1,key2,val2,...}
@@ -71,7 +76,9 @@ public IPersistentMap add(Object key, Object val) { }
else //didn't have key, grow
{
- newArray = new Object[array.Length + 2];
+ if (array.Length > HASHTABLE_THRESHOLD)
+ return createHT(array).add(key, val);
+ newArray = new Object[array.Length + 2];
if(array.Length > 0)
Array.Copy(array,0,newArray,2,array.Length);
newArray[0] = key;
@@ -92,7 +99,9 @@ public IPersistentMap put(Object key, Object val) { }
else //didn't have key, grow
{
- newArray = new Object[array.Length + 2];
+ if (array.Length > HASHTABLE_THRESHOLD)
+ return createHT(array).put(key, val);
+ newArray = new Object[array.Length + 2];
if(array.Length > 0)
Array.Copy(array,0,newArray,2,array.Length);
newArray[0] = key;
diff --git a/src/jvm/clojure/lang/PersistentArrayIdentityMap.java b/src/jvm/clojure/lang/PersistentArrayIdentityMap.java index 400af18b..d74cbeeb 100644 --- a/src/jvm/clojure/lang/PersistentArrayIdentityMap.java +++ b/src/jvm/clojure/lang/PersistentArrayIdentityMap.java @@ -25,6 +25,9 @@ PersistentArrayMap create(Object... init){ return new PersistentArrayIdentityMap(init);
}
+IPersistentMap createHT(Object[] init){
+ return new PersistentHashtableIdentityMap(init);
+}
IPersistentMap empty() {
return EMPTY;
}
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 1521d5cf..4a17418e 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -26,6 +26,7 @@ import java.util.Iterator; public class PersistentArrayMap implements IPersistentMap, ISequential {
final Object[] array;
+static final int HASHTABLE_THRESHOLD = 42;
public static PersistentArrayMap EMPTY = new PersistentArrayMap();
@@ -37,6 +38,10 @@ PersistentArrayMap create(Object... init){ return new PersistentArrayMap(init);
}
+IPersistentMap createHT(Object[] init){
+ return new PersistentHashtableMap(init);
+}
+
/**
* This ctor captures/aliases the passed array, so do not modify later
* @param init {key1,val1,key2,val2,...}
@@ -69,13 +74,16 @@ public IPersistentMap add(Object key, Object val) throws Exception { }
else //didn't have key, grow
{
+ if(array.length > HASHTABLE_THRESHOLD)
+ return createHT(array).add(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);}
+ return create(newArray);
+}
public IPersistentMap put(Object key, Object val) {
int i = indexOf(key);
@@ -89,6 +97,8 @@ public IPersistentMap put(Object key, Object val) { }
else //didn't have key, grow
{
+ if(array.length > HASHTABLE_THRESHOLD)
+ return createHT(array).put(key, val);
newArray = new Object[array.length + 2];
if(array.length > 0)
System.arraycopy(array,0,newArray,2,array.length);
|