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:
Jake Leahy 2023-02-01 20:00:10 +11:00 • committed by GitHub
commit 900fe8f501
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 0 deletions

View file

@ -181,6 +181,32 @@ proc `[]`*(t: CacheTable; key: string): NimNode {.magic: "NctGet".} =
# get the NimNode back
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 next(t: CacheTable; iter: int): (string, NimNode, int) {.magic: "NctNext".}