From 45928ffe7f2b9e59633fb7931f2a3c75c9d6589f Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Tue, 4 Jul 2006 18:02:35 +0000 Subject: added val to add(), throws exception if key present --- src/cli/runtime/IPersistentMap.cs | 2 +- src/cli/runtime/LispReader.cs | 3 ++- src/cli/runtime/PersistentArrayMap.cs | 21 +++++++++++++++++---- src/cli/runtime/PersistentHashtableMap.cs | 21 +++++++++++++++++++-- src/cli/runtime/PersistentHybridMap.cs | 11 ++++++++--- src/cli/runtime/PersistentListIdentityMap.cs | 23 +++++++++++++++++++++-- src/cli/runtime/PersistentListMap.cs | 23 +++++++++++++++++++++-- src/cli/runtime/PersistentTree.cs | 11 ++++++++--- 8 files changed, 97 insertions(+), 18 deletions(-) (limited to 'src/cli/runtime') 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) -- cgit v1.2.3-70-g09d2