diff options
author | Araq <rumpf_a@web.de> | 2011-06-11 17:03:45 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2011-06-11 17:03:45 +0200 |
commit | ec2bd53ead04bc2ea6b8d6186f5f28f253ff859d (patch) | |
tree | 55fdf00baef570e1ca1c1ca5c8f75f50f787ffd7 /lib/pure/collections | |
parent | 922e216b86c1502567ee9a7ea7f3e684ed396bb5 (diff) | |
download | Nim-ec2bd53ead04bc2ea6b8d6186f5f28f253ff859d.tar.gz |
implemented tables.add
Diffstat (limited to 'lib/pure/collections')
-rw-r--r-- | lib/pure/collections/sets.nim | 4 | ||||
-rw-r--r-- | lib/pure/collections/tables.nim | 22 |
2 files changed, 24 insertions, 2 deletions
diff --git a/lib/pure/collections/sets.nim b/lib/pure/collections/sets.nim index 331881d88..a577964c9 100644 --- a/lib/pure/collections/sets.nim +++ b/lib/pure/collections/sets.nim @@ -26,7 +26,7 @@ type TSlotEnum = enum seEmpty, seFilled, seDeleted TKeyValuePair[A] = tuple[slot: TSlotEnum, key: A] TKeyValuePairSeq[A] = seq[TKeyValuePair[A]] - TSet* {.final, myShallow.}[A] = object + TSet* {.final, myShallow.}[A] = object ## a generic hash set data: TKeyValuePairSeq[A] counter: int @@ -141,7 +141,7 @@ proc `$`*[A](s: TSet[A]): string = ## The `$` operator for hash sets. dollarImpl() -# ------------------------------ ordered table ------------------------------ +# ------------------------------ ordered set ------------------------------ type TOrderedKeyValuePair[A] = tuple[ diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index d1ed7586a..d353db3fb 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -102,19 +102,37 @@ proc Enlarge[A, B](t: var TTable[A, B]) = if t.data[i].slot == seFilled: RawInsert(t, n, t.data[i].key, t.data[i].val) swap(t.data, n) +template AddImpl() = + if mustRehash(len(t.data), t.counter): Enlarge(t) + RawInsert(t, t.data, key, val) + inc(t.counter) + template PutImpl() = var index = RawGet(t, key) if index >= 0: t.data[index].val = val else: + AddImpl() + +template HasKeyOrPutImpl() = + var index = RawGet(t, key) + if index >= 0: + t.data[index].val = val + result = true + else: if mustRehash(len(t.data), t.counter): Enlarge(t) RawInsert(t, t.data, key, val) inc(t.counter) + result = false proc `[]=`*[A, B](t: var TTable[A, B], key: A, val: B) = ## puts a (key, value)-pair into `t`. putImpl() +proc add*[A, B](t: var TTable[A, B], key: A, val: B) = + ## puts a new (key, value)-pair into `t` even if ``t[key]`` already exists. + AddImpl() + proc del*[A, B](t: var TTable[A, B], key: A) = ## deletes `key` from hash table `t`. var index = RawGet(t, key) @@ -230,6 +248,10 @@ proc `[]=`*[A, B](t: var TOrderedTable[A, B], key: A, val: B) = ## puts a (key, value)-pair into `t`. putImpl() +proc add*[A, B](t: var TOrderedTable[A, B], key: A, val: B) = + ## puts a new (key, value)-pair into `t` even if ``t[key]`` already exists. + AddImpl() + proc initOrderedTable*[A, B](initialSize=64): TOrderedTable[A, B] = ## creates a new ordered hash table that is empty. `initialSize` needs to be ## a power of two. |