summaryrefslogtreecommitdiff
path: root/src/cli/runtime/PersistentHashtableMap.cs
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/cli/runtime/PersistentHashtableMap.cs
parent86a8196bbba908bf6cf3f5d9ab3d3ebb7f94a646 (diff)
added val to add(), throws exception if key present
Diffstat (limited to 'src/cli/runtime/PersistentHashtableMap.cs')
-rw-r--r--src/cli/runtime/PersistentHashtableMap.cs21
1 files changed, 19 insertions, 2 deletions
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);