summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-07-04 18:02:35 +0000
committerRich Hickey <richhickey@gmail.com>2006-07-04 18:02:35 +0000
commit45928ffe7f2b9e59633fb7931f2a3c75c9d6589f (patch)
treecdade057178a2795ee134ea946cefff882c7c035 /src/jvm/clojure
parent86a8196bbba908bf6cf3f5d9ab3d3ebb7f94a646 (diff)
added val to add(), throws exception if key present
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/IPersistentMap.java2
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java20
-rw-r--r--src/jvm/clojure/lang/PersistentHashtableMap.java23
-rw-r--r--src/jvm/clojure/lang/PersistentHybridMap.java9
-rw-r--r--src/jvm/clojure/lang/PersistentListIdentityMap.java25
-rw-r--r--src/jvm/clojure/lang/PersistentListMap.java23
-rw-r--r--src/jvm/clojure/lang/PersistentTree.java19
7 files changed, 100 insertions, 21 deletions
diff --git a/src/jvm/clojure/lang/IPersistentMap.java b/src/jvm/clojure/lang/IPersistentMap.java
index 92138d1b..f3e0d45f 100644
--- a/src/jvm/clojure/lang/IPersistentMap.java
+++ b/src/jvm/clojure/lang/IPersistentMap.java
@@ -19,7 +19,7 @@ boolean contains(Object key);
IMapEntry find(Object key);
-IPersistentMap add(Object key);
+IPersistentMap add(Object key, Object val) throws Exception;
IPersistentMap put(Object key, Object val);
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java
index 7b4a408c..1521d5cf 100644
--- a/src/jvm/clojure/lang/PersistentArrayMap.java
+++ b/src/jvm/clojure/lang/PersistentArrayMap.java
@@ -60,10 +60,22 @@ public IMapEntry find(Object key) {
return null;
}
-public IPersistentMap add(Object key) {
-
- return put(key,null);
-}
+public IPersistentMap add(Object key, Object val) throws Exception {
+ int i = indexOf(key);
+ Object[] newArray;
+ if(i >= 0)
+ {
+ throw new Exception("Key already present");
+ }
+ else //didn't have key, grow
+ {
+ 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);}
public IPersistentMap put(Object key, Object val) {
int i = indexOf(key);
diff --git a/src/jvm/clojure/lang/PersistentHashtableMap.java b/src/jvm/clojure/lang/PersistentHashtableMap.java
index e45a368c..290adb93 100644
--- a/src/jvm/clojure/lang/PersistentHashtableMap.java
+++ b/src/jvm/clojure/lang/PersistentHashtableMap.java
@@ -74,8 +74,13 @@ public IMapEntry find(Object key) {
return null;
}
-public IPersistentMap add(Object key) {
- return put(key, null);
+public IPersistentMap add(Object key, Object val) throws Exception {
+ if(_count > growAtCount)
+ return grow().add(key, val);
+ int i = bucketFor(key,array);
+ int incr = 1;
+ PersistentArray newArray = doAdd(i, key, val, array);
+ return create(_count + incr, newArray, growAtCount);
}
public IPersistentMap put(Object key, Object val) {
@@ -102,7 +107,19 @@ PersistentArray doPut(int i,Object key,Object val,PersistentArray array){
}
else
newEntries = createListMap(key, val);
- //newEntries = createArrayMap(new Object[]{key, val});
+
+ return array.set(i, newEntries);
+}
+
+PersistentArray doAdd(int i,Object key,Object val,PersistentArray array) throws Exception{
+ IPersistentMap entries = (IPersistentMap) array.get(i);
+ IPersistentMap newEntries;
+ if (entries != null)
+ {
+ newEntries = entries.add(key, val);
+ }
+ else
+ newEntries = createListMap(key, val);
return array.set(i, newEntries);
}
diff --git a/src/jvm/clojure/lang/PersistentHybridMap.java b/src/jvm/clojure/lang/PersistentHybridMap.java
index 9bc9ca92..a8b7627a 100644
--- a/src/jvm/clojure/lang/PersistentHybridMap.java
+++ b/src/jvm/clojure/lang/PersistentHybridMap.java
@@ -46,8 +46,13 @@ public IMapEntry find(Object key) {
return impl.find(key);
}
-public IPersistentMap add(Object key) {
- return put(key, null);
+public IPersistentMap add(Object key, Object val) throws Exception {
+ IPersistentMap newImpl = impl.add(key,val);
+ if(newImpl.capacity() == CAPACITY_THRESHOLD)
+ {
+ newImpl = createHashtableMap(((PersistentArrayMap)newImpl).array);
+ }
+ return create(newImpl);
}
public IPersistentMap put(Object key, Object val) {
diff --git a/src/jvm/clojure/lang/PersistentListIdentityMap.java b/src/jvm/clojure/lang/PersistentListIdentityMap.java
index 1945ca42..1eea34f3 100644
--- a/src/jvm/clojure/lang/PersistentListIdentityMap.java
+++ b/src/jvm/clojure/lang/PersistentListIdentityMap.java
@@ -61,8 +61,8 @@ public IMapEntry find(Object key){
return null;
}
-public IPersistentMap add(Object key){
- return put(key, null);
+public IPersistentMap add(Object key, Object val) throws Exception {
+ return put(key, val);
}
public PersistentListIdentityMap put(Object key, Object val){
@@ -166,7 +166,15 @@ static class Tail extends PersistentListIdentityMap {
return null;
}
- public PersistentListIdentityMap put(Object key, Object val){
+ public PersistentListIdentityMap add(Object key, Object val) throws Exception{
+ if(key == _key)
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key,val,this);
+ }
+
+ public PersistentListIdentityMap put(Object key, Object val){
if(key == _key) //replace
{
if(val == _val)
@@ -232,7 +240,16 @@ static class Link extends PersistentListIdentityMap {
return _rest.find(key);
}
- public PersistentListIdentityMap put(Object key, Object val){
+ public PersistentListIdentityMap add(Object key, Object val) throws Exception{
+ IMapEntry e = find(key);
+ if(e != null)
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key,val,this);
+ }
+
+ public PersistentListIdentityMap put(Object key, Object val){
IMapEntry e = find(key);
if(e != null)
{
diff --git a/src/jvm/clojure/lang/PersistentListMap.java b/src/jvm/clojure/lang/PersistentListMap.java
index d92adbe5..53777019 100644
--- a/src/jvm/clojure/lang/PersistentListMap.java
+++ b/src/jvm/clojure/lang/PersistentListMap.java
@@ -60,8 +60,8 @@ public IMapEntry find(Object key){
return null;
}
-public IPersistentMap add(Object key){
- return put(key, null);
+public IPersistentMap add(Object key, Object val) throws Exception {
+ return put(key, val);
}
public PersistentListMap put(Object key, Object val){
@@ -164,6 +164,14 @@ static class Tail extends PersistentListMap {
return null;
}
+ public PersistentListMap add(Object key, Object val) throws Exception {
+ if(equalKey(key,_key)) //replace
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key,val,this);
+ }
+
public PersistentListMap put(Object key, Object val){
if(equalKey(key,_key)) //replace
{
@@ -231,7 +239,16 @@ static class Link extends PersistentListMap {
return _rest.find(key);
}
- public PersistentListMap put(Object key, Object val){
+ public PersistentListMap add(Object key, Object val) throws Exception {
+ IMapEntry e = find(key);
+ if(e != null)
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key,val,this);
+ }
+
+ public PersistentListMap put(Object key, Object val){
IMapEntry e = find(key);
if(e != null)
{
diff --git a/src/jvm/clojure/lang/PersistentTree.java b/src/jvm/clojure/lang/PersistentTree.java
index 1403ce0c..1616fa20 100644
--- a/src/jvm/clojure/lang/PersistentTree.java
+++ b/src/jvm/clojure/lang/PersistentTree.java
@@ -42,8 +42,14 @@ public boolean contains(Object key){
return find(key) != null;
}
-public PersistentTree add(Object key){
- return put(key, null);
+public PersistentTree add(Object key, Object val) throws Exception {
+ Box found = new Box(null);
+ Node t = add(tree, key, val, found);
+ if(t == null) //null == already contains key
+ {
+ throw new Exception("Key already present");
+ }
+ return new PersistentTree(comp, t.blacken(), _count + 1);
}
public PersistentTree put(Object key, Object val){
@@ -726,8 +732,13 @@ static public void main(String args[]){
}
Collections.shuffle(Arrays.asList(ints));
//force the ListMap class loading now
- PersistentListMap.EMPTY.add(1).add(2).add(3);
- System.out.println("Building set");
+ try {
+ PersistentListMap.EMPTY.add(1, null).add(2,null).add(3,null);
+ } catch (Exception e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ System.out.println("Building set");
//IPersistentMap set = new PersistentHybridMap(1001);
IPersistentMap set = new PersistentHashtableMap(1001);
//IPersistentMap set = new ListMap();