add enumutils.items for sparse enums, typetraits.SomeSparseEnum (#17080)
* add enumutils.items for enum with holes * changelog * ref in lib.rst * use `type SomeSparseEnum* = (not Ordinal) and enum` instead of concept * address comment: rename back to enum with holes
This commit is contained in:
parent
74a8f23801
commit
c274e67198
6 changed files with 58 additions and 6 deletions
|
|
@ -7,7 +7,9 @@
|
|||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
import macros
|
||||
import std/macros
|
||||
|
||||
# xxx `genEnumCaseStmt` needs tests and runnableExamples
|
||||
|
||||
macro genEnumCaseStmt*(typ: typedesc, argSym: typed, default: typed,
|
||||
userMin, userMax: static[int], normalizer: static[proc(s :string): string]): untyped =
|
||||
|
|
@ -61,4 +63,17 @@ macro genEnumCaseStmt*(typ: typedesc, argSym: typed, default: typed,
|
|||
result.add nnkElse.newTree(raiseStmt)
|
||||
else:
|
||||
expectKind(default, nnkSym)
|
||||
result.add nnkElse.newTree(default)
|
||||
result.add nnkElse.newTree(default)
|
||||
|
||||
macro enumWithHolesFullRange(a: typed): untyped =
|
||||
newNimNode(nnkCurly).add(a.getType[1][1..^1])
|
||||
|
||||
iterator items*[T: enum and not Ordinal](E: typedesc[T]): T =
|
||||
## Iterates over an enum with holes.
|
||||
runnableExamples:
|
||||
type A = enum a0 = 2, a1 = 4, a2
|
||||
type B[T] = enum b0 = 2, b1 = 4
|
||||
from std/sequtils import toSeq
|
||||
assert A.toSeq == [a0, a1, a2]
|
||||
assert B[float].toSeq == [B[float].b0, B[float].b1]
|
||||
for a in enumWithHolesFullRange(E): yield a
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue