diff options
author | cheatfate <ka@hardcore.kiev.ua> | 2016-05-27 01:00:05 +0300 |
---|---|---|
committer | cheatfate <ka@hardcore.kiev.ua> | 2016-05-27 01:00:05 +0300 |
commit | 49c50e4e214b82466b44fab3fa9ac51d66242499 (patch) | |
tree | 34c6bc92a07a7dea63d4c72a957dee23f79fa298 /lib/pure/collections | |
parent | d2ddeb47c52f3507d0a95412dd17304de3732dda (diff) | |
download | Nim-49c50e4e214b82466b44fab3fa9ac51d66242499.tar.gz |
Introduce template withValue() for tables.nim too.
Diffstat (limited to 'lib/pure/collections')
-rw-r--r-- | lib/pure/collections/tables.nim | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 58a789e76..b702f6248 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -136,6 +136,51 @@ proc mget*[A, B](t: var Table[A, B], key: A): var B {.deprecated.} = proc getOrDefault*[A, B](t: Table[A, B], key: A): B = getOrDefaultImpl(t, key) +template withValue*[A, B](t: var Table[A, B], key: A, + value, body: untyped) = + ## retrieves the value at ``t[key]``. + ## `value` can be modified in the scope of the ``withValue`` call. + ## + ## .. code-block:: nim + ## + ## sharedTable.withValue(key, value) do: + ## # block is executed only if ``key`` in ``t`` + ## value.name = "username" + ## value.uid = 1000 + ## + mixin rawGet + var hc: Hash + var index = rawGet(t, key, hc) + let hasKey = index >= 0 + if hasKey: + var value {.inject.} = addr(t.data[index].val) + body + +template withValue*[A, B](t: var Table[A, B], key: A, + value, body1, body2: untyped) = + ## retrieves the value at ``t[key]``. + ## `value` can be modified in the scope of the ``withValue`` call. + ## + ## .. code-block:: nim + ## + ## table.withValue(key, value) do: + ## # block is executed only if ``key`` in ``t`` + ## value.name = "username" + ## value.uid = 1000 + ## do: + ## # block is executed when ``key`` not in ``t`` + ## raise newException(KeyError, "Key not found") + ## + mixin rawGet + var hc: Hash + var index = rawGet(t, key, hc) + let hasKey = index >= 0 + if hasKey: + var value {.inject.} = addr(t.data[index].val) + body1 + else: + body2 + iterator allValues*[A, B](t: Table[A, B]; key: A): B = ## iterates over any value in the table `t` that belongs to the given `key`. var h: Hash = hash(key) and high(t.data) |