diff options
-rw-r--r-- | src/jvm/clojure/lang/ATransientMap.java | 44 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 16 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 17 |
3 files changed, 53 insertions, 24 deletions
diff --git a/src/jvm/clojure/lang/ATransientMap.java b/src/jvm/clojure/lang/ATransientMap.java index 334168f8..0f17ba6f 100644 --- a/src/jvm/clojure/lang/ATransientMap.java +++ b/src/jvm/clojure/lang/ATransientMap.java @@ -12,8 +12,15 @@ package clojure.lang; import java.util.Map; -public abstract class ATransientMap extends AFn implements ITransientMap { +import clojure.lang.PersistentHashMap.INode; + +abstract class ATransientMap extends AFn implements ITransientMap { abstract void ensureEditable(); + abstract ITransientMap doAssoc(Object key, Object val); + abstract ITransientMap doWithout(Object key); + abstract Object doValAt(Object key, Object notFound); + abstract int doCount(); + abstract IPersistentMap doPersistent(); public ITransientMap conj(Object o) { ensureEditable(); @@ -40,7 +47,40 @@ public abstract class ATransientMap extends AFn implements ITransientMap { return ret; } - public Object valAt(Object key) { + public final Object invoke(Object arg1) throws Exception{ + return valAt(arg1); + } + + public final Object invoke(Object arg1, Object notFound) throws Exception{ + return valAt(arg1, notFound); + } + + public final Object valAt(Object key) { return valAt(key, null); } + + public final ITransientMap assoc(Object key, Object val) { + ensureEditable(); + return doAssoc(key, val); + } + + public final ITransientMap without(Object key) { + ensureEditable(); + return doWithout(key); + } + + public final IPersistentMap persistent() { + ensureEditable(); + return doPersistent(); + } + + public final Object valAt(Object key, Object notFound) { + ensureEditable(); + return doValAt(key, notFound); + } + + public final int count() { + ensureEditable(); + return doCount(); + } } diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 790a8cf7..9f598d9d 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -13,7 +13,6 @@ package clojure.lang; import java.util.Arrays; import java.util.Iterator; import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; /** * Simple implementation of persistent map on an array @@ -288,8 +287,7 @@ static final class TransientArrayMap extends ATransientMap { return -1; } - public ITransientMap assoc(Object key, Object val){ - ensureEditable(); + ITransientMap doAssoc(Object key, Object val){ int i = indexOf(key); if(i >= 0) //already have key, { @@ -306,8 +304,7 @@ static final class TransientArrayMap extends ATransientMap { return this; } - public ITransientMap without(Object key) { - ensureEditable(); + ITransientMap doWithout(Object key) { int i = indexOf(key); if(i >= 0) //have key, will remove { @@ -321,21 +318,18 @@ static final class TransientArrayMap extends ATransientMap { return this; } - public Object valAt(Object key, Object notFound) { - ensureEditable(); + Object doValAt(Object key, Object notFound) { int i = indexOf(key); if (i >= 0) return array[i + 1]; return notFound; } - public int count() { - ensureEditable(); + int doCount() { return len / 2; } - public IPersistentMap persistent() { - ensureEditable(); + IPersistentMap doPersistent() { return new PersistentArrayMap(Arrays.copyOf(array, len)); } diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java index bcad8be0..15587aea 100644 --- a/src/jvm/clojure/lang/PersistentHashMap.java +++ b/src/jvm/clojure/lang/PersistentHashMap.java @@ -210,16 +210,14 @@ static final class TransientHashMap extends ATransientMap { this.count = count; } - public ITransientMap assoc(Object key, Object val) { - ensureEditable(); + ITransientMap doAssoc(Object key, Object val) { Box addedLeaf = new Box(null); this.root = root.assoc(edit, 0, Util.hash(key), key, val, addedLeaf); if (addedLeaf.val != null) this.count++; return this; } - public ITransientMap without(Object key) { - ensureEditable(); + ITransientMap doWithout(Object key) { Box removedLeaf = new Box(null); INode newroot = root.without(edit, Util.hash(key), key, removedLeaf); this.root = newroot == null ? EMPTY.root : newroot; @@ -227,26 +225,23 @@ static final class TransientHashMap extends ATransientMap { return this; } - public IPersistentMap persistent() { - ensureEditable(); + IPersistentMap doPersistent() { edit.set(null); return new PersistentHashMap(count, root); } - public IMapEntry entryAt(Object key){ + private IMapEntry entryAt(Object key){ return root.find(Util.hash(key), key); } - public Object valAt(Object key, Object notFound) { - ensureEditable(); + Object doValAt(Object key, Object notFound) { IMapEntry e = entryAt(key); if(e != null) return e.val(); return notFound; } - public int count() { - ensureEditable(); + int doCount() { return count; } |