summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-11-02 10:40:24 -0500
committerRich Hickey <richhickey@gmail.com>2009-11-02 10:40:24 -0500
commitf1133b97df5384f3336ba79fdc6d0acd2f4f3eed (patch)
treecb9fd3b31bc2596f315cd4324285e61fedf6a9eb
parent9c3e97a85c042d2c3f276f0c1e0d270db35553aa (diff)
struct map perf tweaks, enable keyslots to be arraymap
-rw-r--r--src/jvm/clojure/lang/PersistentStructMap.java22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/jvm/clojure/lang/PersistentStructMap.java b/src/jvm/clojure/lang/PersistentStructMap.java
index 3ce43073..c0ce10cd 100644
--- a/src/jvm/clojure/lang/PersistentStructMap.java
+++ b/src/jvm/clojure/lang/PersistentStructMap.java
@@ -16,7 +16,7 @@ import java.util.Iterator;
import java.util.Map;
import java.io.Serializable;
-public class PersistentStructMap extends APersistentMap{
+final public class PersistentStructMap extends APersistentMap{
public static class Def implements Serializable{
final ISeq keys;
@@ -35,13 +35,15 @@ final IPersistentMap ext;
static public Def createSlotMap(ISeq keys){
if(keys == null)
throw new IllegalArgumentException("Must supply keys");
- PersistentHashMap ret = PersistentHashMap.EMPTY;
+ int c = RT.count(keys);
+ Object[] v = new Object[2*c];
int i = 0;
for(ISeq s = keys; s != null; s = s.next(), i++)
{
- ret = (PersistentHashMap) ret.assoc(s.first(), i);
+ v[2*i] = s.first();
+ v[2*i+1] = i;
}
- return new Def(keys, ret);
+ return new Def(keys, RT.map(v));
}
static public PersistentStructMap create(Def def, ISeq keyvals){
@@ -141,19 +143,19 @@ public IPersistentMap assoc(Object key, Object val){
}
public Object valAt(Object key){
- Map.Entry e = def.keyslots.entryAt(key);
- if(e != null)
+ Integer i = (Integer) def.keyslots.valAt(key);
+ if(i != null)
{
- return vals[(Integer) e.getValue()];
+ return vals[i];
}
return ext.valAt(key);
}
public Object valAt(Object key, Object notFound){
- Map.Entry e = def.keyslots.entryAt(key);
- if(e != null)
+ Integer i = (Integer) def.keyslots.valAt(key);
+ if(i != null)
{
- return vals[(Integer) e.getValue()];
+ return vals[i];
}
return ext.valAt(key, notFound);
}