diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-11-02 10:40:24 -0500 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-11-02 10:40:24 -0500 |
commit | f1133b97df5384f3336ba79fdc6d0acd2f4f3eed (patch) | |
tree | cb9fd3b31bc2596f315cd4324285e61fedf6a9eb | |
parent | 9c3e97a85c042d2c3f276f0c1e0d270db35553aa (diff) |
struct map perf tweaks, enable keyslots to be arraymap
-rw-r--r-- | src/jvm/clojure/lang/PersistentStructMap.java | 22 |
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); } |