summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-07-04 20:05:37 +0000
committerRich Hickey <richhickey@gmail.com>2006-07-04 20:05:37 +0000
commit84406ba09fe16b4b56b5ce40de33f8bee340a947 (patch)
treebb89ed0f635231901fcf4f69643f0866465eee60 /src
parent58ff927780b540fad69fc1a8614b216c379e9a2f (diff)
made auto-morphing into hashtable
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/PersistentArrayIdentityMap.cs4
-rw-r--r--src/cli/runtime/PersistentArrayMap.cs13
-rw-r--r--src/jvm/clojure/lang/PersistentArrayIdentityMap.java3
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java12
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);