summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristophe Grand <christophe@cgrand.net>2009-08-05 14:24:59 +0200
committerRich Hickey <richhickey@gmail.com>2009-08-05 11:05:15 -0400
commit47b571fcf48b18ea59243937fc6ac4cfc6a1cf9d (patch)
tree7a3ac58c18559056851606d794a44b0fd06d60f8 /src
parentb75cdb8b61e0fd4e83934e29d5ddaf78296ba7a7 (diff)
moved ensureEditable() assertions to ATransientMap
Signed-off-by: Rich Hickey <richhickey@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/ATransientMap.java44
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java16
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java17
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;
}