mirror of
https://github.com/nim-lang/Nim.git
synced 2026-08-29 10:01:39 +00:00
table.mgetOrPut without default val (#22994)
RFC: https://github.com/nim-lang/RFCs/issues/539 - ~~mgetOrPutDefaultImpl template into `tableimpl.nim` to avoid macros~~ - mgetOrPut for `Table`, `TableRef`, `OrderedTable`, `OrderedTableRef` - `tests/stdlib/tmget.nim` tests update --------- Co-authored-by: inv2004 <>
This commit is contained in:
@@ -45,7 +45,7 @@ template addImpl(enlarge) {.dirty.} =
|
|||||||
rawInsert(t, t.data, key, val, hc, j)
|
rawInsert(t, t.data, key, val, hc, j)
|
||||||
inc(t.counter)
|
inc(t.counter)
|
||||||
|
|
||||||
template maybeRehashPutImpl(enlarge) {.dirty.} =
|
template maybeRehashPutImpl(enlarge, val) {.dirty.} =
|
||||||
checkIfInitialized()
|
checkIfInitialized()
|
||||||
if mustRehash(t):
|
if mustRehash(t):
|
||||||
enlarge(t)
|
enlarge(t)
|
||||||
@@ -59,7 +59,7 @@ template putImpl(enlarge) {.dirty.} =
|
|||||||
var hc: Hash = default(Hash)
|
var hc: Hash = default(Hash)
|
||||||
var index = rawGet(t, key, hc)
|
var index = rawGet(t, key, hc)
|
||||||
if index >= 0: t.data[index].val = val
|
if index >= 0: t.data[index].val = val
|
||||||
else: maybeRehashPutImpl(enlarge)
|
else: maybeRehashPutImpl(enlarge, val)
|
||||||
|
|
||||||
template mgetOrPutImpl(enlarge) {.dirty.} =
|
template mgetOrPutImpl(enlarge) {.dirty.} =
|
||||||
checkIfInitialized()
|
checkIfInitialized()
|
||||||
@@ -67,17 +67,30 @@ template mgetOrPutImpl(enlarge) {.dirty.} =
|
|||||||
var index = rawGet(t, key, hc)
|
var index = rawGet(t, key, hc)
|
||||||
if index < 0:
|
if index < 0:
|
||||||
# not present: insert (flipping index)
|
# not present: insert (flipping index)
|
||||||
maybeRehashPutImpl(enlarge)
|
when declared(val):
|
||||||
|
maybeRehashPutImpl(enlarge, val)
|
||||||
|
else:
|
||||||
|
maybeRehashPutImpl(enlarge, default(B))
|
||||||
# either way return modifiable val
|
# either way return modifiable val
|
||||||
result = t.data[index].val
|
result = t.data[index].val
|
||||||
|
|
||||||
|
# template mgetOrPutDefaultImpl(enlarge) {.dirty.} =
|
||||||
|
# checkIfInitialized()
|
||||||
|
# var hc: Hash = default(Hash)
|
||||||
|
# var index = rawGet(t, key, hc)
|
||||||
|
# if index < 0:
|
||||||
|
# # not present: insert (flipping index)
|
||||||
|
# maybeRehashPutImpl(enlarge, default(B))
|
||||||
|
# # either way return modifiable val
|
||||||
|
# result = t.data[index].val
|
||||||
|
|
||||||
template hasKeyOrPutImpl(enlarge) {.dirty.} =
|
template hasKeyOrPutImpl(enlarge) {.dirty.} =
|
||||||
checkIfInitialized()
|
checkIfInitialized()
|
||||||
var hc: Hash = default(Hash)
|
var hc: Hash = default(Hash)
|
||||||
var index = rawGet(t, key, hc)
|
var index = rawGet(t, key, hc)
|
||||||
if index < 0:
|
if index < 0:
|
||||||
result = false
|
result = false
|
||||||
maybeRehashPutImpl(enlarge)
|
maybeRehashPutImpl(enlarge, val)
|
||||||
else: result = true
|
else: result = true
|
||||||
|
|
||||||
# delImplIdx is KnuthV3 Algo6.4R adapted to i=i+1 (from i=i-1) which has come to
|
# delImplIdx is KnuthV3 Algo6.4R adapted to i=i+1 (from i=i-1) which has come to
|
||||||
|
|||||||
@@ -474,6 +474,18 @@ proc mgetOrPut*[A, B](t: var Table[A, B], key: A, val: B): var B =
|
|||||||
|
|
||||||
mgetOrPutImpl(enlarge)
|
mgetOrPutImpl(enlarge)
|
||||||
|
|
||||||
|
proc mgetOrPut*[A, B](t: var Table[A, B], key: A): var B =
|
||||||
|
## Retrieves the value at `t[key]` or puts the
|
||||||
|
## default initialization value for type `B` (e.g. 0 for any
|
||||||
|
## integer type).
|
||||||
|
runnableExamples:
|
||||||
|
var a = {'a': 5}.newTable
|
||||||
|
doAssert a.mgetOrPut('a') == 5
|
||||||
|
a.mgetOrPut('z').inc
|
||||||
|
doAssert a == {'a': 5, 'z': 1}.newTable
|
||||||
|
|
||||||
|
mgetOrPutImpl(enlarge)
|
||||||
|
|
||||||
proc len*[A, B](t: Table[A, B]): int =
|
proc len*[A, B](t: Table[A, B]): int =
|
||||||
## Returns the number of keys in `t`.
|
## Returns the number of keys in `t`.
|
||||||
runnableExamples:
|
runnableExamples:
|
||||||
@@ -1013,6 +1025,18 @@ proc mgetOrPut*[A, B](t: TableRef[A, B], key: A, val: B): var B =
|
|||||||
doAssert t[25] == @[25, 35]
|
doAssert t[25] == @[25, 35]
|
||||||
t[].mgetOrPut(key, val)
|
t[].mgetOrPut(key, val)
|
||||||
|
|
||||||
|
proc mgetOrPut*[A, B](t: TableRef[A, B], key: A): var B =
|
||||||
|
## Retrieves the value at `t[key]` or puts the
|
||||||
|
## default initialization value for type `B` (e.g. 0 for any
|
||||||
|
## integer type).
|
||||||
|
runnableExamples:
|
||||||
|
var a = {'a': 5}.newTable
|
||||||
|
doAssert a.mgetOrPut('a') == 5
|
||||||
|
a.mgetOrPut('z').inc
|
||||||
|
doAssert a == {'a': 5, 'z': 1}.newTable
|
||||||
|
|
||||||
|
t[].mgetOrPut(key)
|
||||||
|
|
||||||
proc len*[A, B](t: TableRef[A, B]): int =
|
proc len*[A, B](t: TableRef[A, B]): int =
|
||||||
## Returns the number of keys in `t`.
|
## Returns the number of keys in `t`.
|
||||||
runnableExamples:
|
runnableExamples:
|
||||||
@@ -1503,6 +1527,18 @@ proc mgetOrPut*[A, B](t: var OrderedTable[A, B], key: A, val: B): var B =
|
|||||||
|
|
||||||
mgetOrPutImpl(enlarge)
|
mgetOrPutImpl(enlarge)
|
||||||
|
|
||||||
|
proc mgetOrPut*[A, B](t: var OrderedTable[A, B], key: A): var B =
|
||||||
|
## Retrieves the value at `t[key]` or puts the
|
||||||
|
## default initialization value for type `B` (e.g. 0 for any
|
||||||
|
## integer type).
|
||||||
|
runnableExamples:
|
||||||
|
var a = {'a': 5}.toOrderedTable
|
||||||
|
doAssert a.mgetOrPut('a') == 5
|
||||||
|
a.mgetOrPut('z').inc
|
||||||
|
doAssert a == {'a': 5, 'z': 1}.toOrderedTable
|
||||||
|
|
||||||
|
mgetOrPutImpl(enlarge)
|
||||||
|
|
||||||
proc len*[A, B](t: OrderedTable[A, B]): int {.inline.} =
|
proc len*[A, B](t: OrderedTable[A, B]): int {.inline.} =
|
||||||
## Returns the number of keys in `t`.
|
## Returns the number of keys in `t`.
|
||||||
runnableExamples:
|
runnableExamples:
|
||||||
@@ -1992,6 +2028,18 @@ proc mgetOrPut*[A, B](t: OrderedTableRef[A, B], key: A, val: B): var B =
|
|||||||
|
|
||||||
result = t[].mgetOrPut(key, val)
|
result = t[].mgetOrPut(key, val)
|
||||||
|
|
||||||
|
proc mgetOrPut*[A, B](t: OrderedTableRef[A, B], key: A): var B =
|
||||||
|
## Retrieves the value at `t[key]` or puts the
|
||||||
|
## default initialization value for type `B` (e.g. 0 for any
|
||||||
|
## integer type).
|
||||||
|
runnableExamples:
|
||||||
|
var a = {'a': 5}.toOrderedTable
|
||||||
|
doAssert a.mgetOrPut('a') == 5
|
||||||
|
a.mgetOrPut('z').inc
|
||||||
|
doAssert a == {'a': 5, 'z': 1}.toOrderedTable
|
||||||
|
|
||||||
|
t[].mgetOrPut(key)
|
||||||
|
|
||||||
proc len*[A, B](t: OrderedTableRef[A, B]): int {.inline.} =
|
proc len*[A, B](t: OrderedTableRef[A, B]): int {.inline.} =
|
||||||
## Returns the number of keys in `t`.
|
## Returns the number of keys in `t`.
|
||||||
runnableExamples:
|
runnableExamples:
|
||||||
|
|||||||
@@ -3,15 +3,19 @@ discard """
|
|||||||
output: '''Can't access 6
|
output: '''Can't access 6
|
||||||
10
|
10
|
||||||
11
|
11
|
||||||
|
2
|
||||||
Can't access 6
|
Can't access 6
|
||||||
10
|
10
|
||||||
11
|
11
|
||||||
|
2
|
||||||
Can't access 6
|
Can't access 6
|
||||||
10
|
10
|
||||||
11
|
11
|
||||||
|
2
|
||||||
Can't access 6
|
Can't access 6
|
||||||
10
|
10
|
||||||
11
|
11
|
||||||
|
2
|
||||||
0
|
0
|
||||||
10
|
10
|
||||||
11
|
11
|
||||||
@@ -41,6 +45,9 @@ block:
|
|||||||
x[5] += 1
|
x[5] += 1
|
||||||
var c = x[5]
|
var c = x[5]
|
||||||
echo c
|
echo c
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
echo x[7]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var x = newTable[int, int]()
|
var x = newTable[int, int]()
|
||||||
@@ -53,6 +60,9 @@ block:
|
|||||||
x[5] += 1
|
x[5] += 1
|
||||||
var c = x[5]
|
var c = x[5]
|
||||||
echo c
|
echo c
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
echo x[7]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var x = initOrderedTable[int, int]()
|
var x = initOrderedTable[int, int]()
|
||||||
@@ -65,6 +75,9 @@ block:
|
|||||||
x[5] += 1
|
x[5] += 1
|
||||||
var c = x[5]
|
var c = x[5]
|
||||||
echo c
|
echo c
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
echo x[7]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var x = newOrderedTable[int, int]()
|
var x = newOrderedTable[int, int]()
|
||||||
@@ -77,6 +90,9 @@ block:
|
|||||||
x[5] += 1
|
x[5] += 1
|
||||||
var c = x[5]
|
var c = x[5]
|
||||||
echo c
|
echo c
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
x.mgetOrPut(7).inc
|
||||||
|
echo x[7]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var x = initCountTable[int]()
|
var x = initCountTable[int]()
|
||||||
|
|||||||
Reference in New Issue
Block a user