Add contains to std/macrocache (#21304)
* Add test cases * Implement contains for CacheSeq * Implement contains for CacheTable * Fix implementation of hasKey * Remove contains for CacheSeq Fix runnable examples I was accidently using --doccmd:skip so I didn't spot the failure locally * Implement hasKey as a VM callback instead of magic * Implement suggestions from PR Co-Authored-By: ringabout <ringabout@users.noreply.github.com> * Update lib/core/macrocache.nim --------- Co-authored-by: ringabout <ringabout@users.noreply.github.com> Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
This commit is contained in:
parent
ff8ab06720
commit
900fe8f501
3 changed files with 39 additions and 0 deletions
|
|
@ -284,6 +284,12 @@ proc registerAdditionalOps*(c: PCtx) =
|
||||||
stackTrace2(c, "isExported() requires a symbol. '$#' is of kind '$#'" % [$n, $n.kind], n)
|
stackTrace2(c, "isExported() requires a symbol. '$#' is of kind '$#'" % [$n, $n.kind], n)
|
||||||
setResult(a, sfExported in n.sym.flags)
|
setResult(a, sfExported in n.sym.flags)
|
||||||
|
|
||||||
|
registerCallback c, "stdlib.macrocache.hasKey", proc (a: VmArgs) =
|
||||||
|
let
|
||||||
|
table = getString(a, 0)
|
||||||
|
key = getString(a, 1)
|
||||||
|
setResult(a, table in c.graph.cacheTables and key in c.graph.cacheTables[table])
|
||||||
|
|
||||||
registerCallback c, "stdlib.vmutils.vmTrace", proc (a: VmArgs) =
|
registerCallback c, "stdlib.vmutils.vmTrace", proc (a: VmArgs) =
|
||||||
c.config.isVmTrace = getBool(a, 0)
|
c.config.isVmTrace = getBool(a, 0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,32 @@ proc `[]`*(t: CacheTable; key: string): NimNode {.magic: "NctGet".} =
|
||||||
# get the NimNode back
|
# get the NimNode back
|
||||||
assert mcTable["toAdd"].kind == nnkStmtList
|
assert mcTable["toAdd"].kind == nnkStmtList
|
||||||
|
|
||||||
|
proc hasKey*(t: CacheTable; key: string): bool =
|
||||||
|
## Returns true if `key` is in the table `t`.
|
||||||
|
##
|
||||||
|
## See also:
|
||||||
|
## * [contains proc][contains(CacheTable, string)] for use with the `in` operator
|
||||||
|
runnableExamples:
|
||||||
|
import std/macros
|
||||||
|
const mcTable = CacheTable"hasKeyEx"
|
||||||
|
static:
|
||||||
|
assert not mcTable.hasKey("foo")
|
||||||
|
mcTable["foo"] = newEmptyNode()
|
||||||
|
# Will now be true since we inserted a value
|
||||||
|
assert mcTable.hasKey("foo")
|
||||||
|
discard "Implemented in vmops"
|
||||||
|
|
||||||
|
proc contains*(t: CacheTable; key: string): bool {.inline.} =
|
||||||
|
## Alias of [hasKey][hasKey(CacheTable, string)] for use with the `in` operator.
|
||||||
|
runnableExamples:
|
||||||
|
import std/macros
|
||||||
|
const mcTable = CacheTable"containsEx"
|
||||||
|
static:
|
||||||
|
mcTable["foo"] = newEmptyNode()
|
||||||
|
# Will be true since we gave it a value before
|
||||||
|
assert "foo" in mcTable
|
||||||
|
t.hasKey(key)
|
||||||
|
|
||||||
proc hasNext(t: CacheTable; iter: int): bool {.magic: "NctHasNext".}
|
proc hasNext(t: CacheTable; iter: int): bool {.magic: "NctHasNext".}
|
||||||
proc next(t: CacheTable; iter: int): (string, NimNode, int) {.magic: "NctNext".}
|
proc next(t: CacheTable; iter: int): (string, NimNode, int) {.magic: "NctNext".}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -351,3 +351,10 @@ block: # bug #15118
|
||||||
|
|
||||||
block:
|
block:
|
||||||
flop("b")
|
flop("b")
|
||||||
|
|
||||||
|
static:
|
||||||
|
block:
|
||||||
|
const containsTable = CacheTable"containsTable"
|
||||||
|
doAssert "foo" notin containsTable
|
||||||
|
containsTable["foo"] = newLit 42
|
||||||
|
doAssert "foo" in containsTable
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue