diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-07-04 18:02:35 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-07-04 18:02:35 +0000 |
commit | 45928ffe7f2b9e59633fb7931f2a3c75c9d6589f (patch) | |
tree | cdade057178a2795ee134ea946cefff882c7c035 | |
parent | 86a8196bbba908bf6cf3f5d9ab3d3ebb7f94a646 (diff) |
added val to add(), throws exception if key present
-rw-r--r-- | src/cli/runtime/IPersistentMap.cs | 2 | ||||
-rw-r--r-- | src/cli/runtime/LispReader.cs | 3 | ||||
-rw-r--r-- | src/cli/runtime/PersistentArrayMap.cs | 21 | ||||
-rw-r--r-- | src/cli/runtime/PersistentHashtableMap.cs | 21 | ||||
-rw-r--r-- | src/cli/runtime/PersistentHybridMap.cs | 11 | ||||
-rw-r--r-- | src/cli/runtime/PersistentListIdentityMap.cs | 23 | ||||
-rw-r--r-- | src/cli/runtime/PersistentListMap.cs | 23 | ||||
-rw-r--r-- | src/cli/runtime/PersistentTree.cs | 11 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IPersistentMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 20 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashtableMap.java | 23 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHybridMap.java | 9 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentListIdentityMap.java | 25 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentListMap.java | 23 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTree.java | 19 |
15 files changed, 197 insertions, 39 deletions
diff --git a/src/cli/runtime/IPersistentMap.cs b/src/cli/runtime/IPersistentMap.cs index 14c913c4..c3996b81 100644 --- a/src/cli/runtime/IPersistentMap.cs +++ b/src/cli/runtime/IPersistentMap.cs @@ -22,7 +22,7 @@ bool contains(Object key); IMapEntry find(Object key);
-IPersistentMap add(Object key);
+IPersistentMap add(Object key, Object val);
IPersistentMap put(Object key, Object val);
diff --git a/src/cli/runtime/LispReader.cs b/src/cli/runtime/LispReader.cs index 9ccd21c7..36c47d3a 100644 --- a/src/cli/runtime/LispReader.cs +++ b/src/cli/runtime/LispReader.cs @@ -298,6 +298,7 @@ public static ISeq readDelimitedList(char delim, LineNumberingTextReader r, bool return ret;
}
+/*
public static void Main(String[] args){
LineNumberingTextReader r = new LineNumberingTextReader(Console.In);
TextWriter w = Console.Out;
@@ -317,7 +318,7 @@ public static void Main(String[] args){ Console.Error.WriteLine(e.StackTrace);
}
}
-
+//*/
}
diff --git a/src/cli/runtime/PersistentArrayMap.cs b/src/cli/runtime/PersistentArrayMap.cs index 6cc42aad..df874d1a 100644 --- a/src/cli/runtime/PersistentArrayMap.cs +++ b/src/cli/runtime/PersistentArrayMap.cs @@ -62,10 +62,23 @@ public IMapEntry find(Object key) { return null;
}
-public IPersistentMap add(Object key) {
-
- return put(key,null);
-}
+public IPersistentMap add(Object key, Object val) {
+ 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)
+ Array.Copy(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/cli/runtime/PersistentHashtableMap.cs b/src/cli/runtime/PersistentHashtableMap.cs index d0fd4cc0..51759d25 100644 --- a/src/cli/runtime/PersistentHashtableMap.cs +++ b/src/cli/runtime/PersistentHashtableMap.cs @@ -82,8 +82,13 @@ public IMapEntry find(Object key) { return null;
}
-public IPersistentMap add(Object key) {
- return put(key, null);
+public IPersistentMap add(Object key, Object val) {
+ 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) {
@@ -115,6 +120,18 @@ PersistentArray doPut(int i,Object key,Object val,PersistentArray array){ return (PersistentArray)array.set(i, newEntries);
}
+PersistentArray doAdd(int i,Object key,Object val,PersistentArray array) {
+ IPersistentMap entries = (IPersistentMap) array.get(i);
+ IPersistentMap newEntries;
+ if (entries != null)
+ {
+ newEntries = entries.add(key, val);
+ }
+ else
+ newEntries = createListMap(key, val);
+
+ return (PersistentArray)array.set(i, newEntries);
+}
public IPersistentMap remove(Object key) {
int i = bucketFor(key,array);
IPersistentMap entries = (IPersistentMap) array.get(i);
diff --git a/src/cli/runtime/PersistentHybridMap.cs b/src/cli/runtime/PersistentHybridMap.cs index b8214d12..211ca7a3 100644 --- a/src/cli/runtime/PersistentHybridMap.cs +++ b/src/cli/runtime/PersistentHybridMap.cs @@ -48,9 +48,14 @@ 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) {
+ 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) {
IPersistentMap newImpl = impl.put(key,val);
diff --git a/src/cli/runtime/PersistentListIdentityMap.cs b/src/cli/runtime/PersistentListIdentityMap.cs index ce8242d8..0a60ebc6 100644 --- a/src/cli/runtime/PersistentListIdentityMap.cs +++ b/src/cli/runtime/PersistentListIdentityMap.cs @@ -71,9 +71,9 @@ namespace clojure.lang return null;
}
- public virtual IPersistentMap add(Object key)
+ public virtual IPersistentMap add(Object key, Object val)
{
- return put(key, null);
+ return put(key, val);
}
public virtual IPersistentMap put(Object key, Object val)
@@ -205,6 +205,15 @@ namespace clojure.lang return null;
}
+ override public IPersistentMap add(Object key, Object val)
+ {
+ if ((key == _key))
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key, val, this);
+ }
+
override public IPersistentMap put(Object key, Object val)
{
if ((key == _key)) //replace
@@ -284,6 +293,16 @@ namespace clojure.lang return _rest.find(key);
}
+ override public IPersistentMap add(Object key, Object val)
+ {
+ IMapEntry e = find(key);
+ if (e != null)
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key, val, this);
+ }
+
override public IPersistentMap put(Object key, Object val)
{
IMapEntry e = find(key);
diff --git a/src/cli/runtime/PersistentListMap.cs b/src/cli/runtime/PersistentListMap.cs index dc432fcd..04065097 100644 --- a/src/cli/runtime/PersistentListMap.cs +++ b/src/cli/runtime/PersistentListMap.cs @@ -60,8 +60,8 @@ public virtual IMapEntry find(Object key){ return null;
}
-public virtual IPersistentMap add(Object key){
- return put(key, null);
+public virtual IPersistentMap add(Object key, Object val){
+ return put(key, val);
}
public virtual IPersistentMap put(Object key, Object val){
@@ -185,6 +185,15 @@ internal class Tail : PersistentListMap { return null;
}
+ override public IPersistentMap add(Object key, Object val)
+ {
+ if (equalKey(key, _key))
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key, val, this);
+ }
+
override public IPersistentMap put(Object key, Object val)
{
if(equalKey(key,_key)) //replace
@@ -255,6 +264,16 @@ internal class Link : PersistentListMap { return _rest.find(key);
}
+ override public IPersistentMap add(Object key, Object val)
+ {
+ IMapEntry e = find(key);
+ if(e != null)
+ {
+ throw new Exception("Key already present");
+ }
+ return new Link(key,val,this);
+ }
+
override public IPersistentMap put(Object key, Object val)
{
IMapEntry e = find(key);
diff --git a/src/cli/runtime/PersistentTree.cs b/src/cli/runtime/PersistentTree.cs index b9335bdf..36f0346f 100644 --- a/src/cli/runtime/PersistentTree.cs +++ b/src/cli/runtime/PersistentTree.cs @@ -52,9 +52,14 @@ public bool contains(Object key){ return find(key) != null; }
- public IPersistentMap add(Object key)
+public IPersistentMap add(Object key,Object val){ + Box found = new Box(null); + Node t = add(tree, key, val, found); + if(t == null) //null == already contains key { - return put(key, null); + throw new Exception("Key already present");
+ } + return new PersistentTree(comp, t.blacken(), _count + 1); } public IPersistentMap put(Object key, Object val){ @@ -778,7 +783,7 @@ public void Reset() #endregion
} - /*
+ //*
[STAThread] static public void Main(String[] args){ if(args.Length != 1)
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(); |