This commit is contained in:
parent
fcd2f305ad
commit
4cd86c0842
4 changed files with 60 additions and 4 deletions
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
export system.`$` # for backward compatibility
|
||||
|
||||
include "system/inclrtl"
|
||||
|
||||
proc name*(t: typedesc): string {.magic: "TypeTrait".}
|
||||
## Returns the name of the given type.
|
||||
|
|
@ -70,6 +71,45 @@ proc distinctBase*(T: typedesc): typedesc {.magic: "TypeTrait".}
|
|||
## Returns base type for distinct types, works only for distinct types.
|
||||
## compile time error otherwise
|
||||
|
||||
import std/macros
|
||||
|
||||
macro lenTuple*(t: tuple): int {.since: (1, 1).} =
|
||||
## Return number of elements of `t`
|
||||
newLit t.len
|
||||
|
||||
macro lenTuple*(t: typedesc[tuple]): int {.since: (1, 1).} =
|
||||
## Return number of elements of `T`
|
||||
newLit t.len
|
||||
|
||||
when (NimMajor, NimMinor) >= (1, 1):
|
||||
template get*(T: typedesc[tuple], i: static int): untyped =
|
||||
## Return `i`th element of `T`
|
||||
# Note: `[]` currently gives: `Error: no generic parameters allowed for ...`
|
||||
type(default(T)[i])
|
||||
|
||||
macro genericParams*(T: typedesc): untyped {.since: (1, 1).} =
|
||||
## return tuple of generic params for generic `T`
|
||||
runnableExamples:
|
||||
type Foo[T1, T2]=object
|
||||
doAssert genericParams(Foo[float, string]) is (float, string)
|
||||
result = newNimNode(nnkTupleConstr)
|
||||
var impl = getTypeImpl(T)
|
||||
expectKind(impl, nnkBracketExpr)
|
||||
impl = impl[1]
|
||||
while true:
|
||||
case impl.kind
|
||||
of nnkSym:
|
||||
impl = impl.getImpl
|
||||
continue
|
||||
of nnkTypeDef:
|
||||
impl = impl[2]
|
||||
continue
|
||||
of nnkBracketExpr:
|
||||
for i in 1..<impl.len:
|
||||
result.add impl[i]
|
||||
break
|
||||
else:
|
||||
error "wrong kind: " & $impl.kind
|
||||
|
||||
when isMainModule:
|
||||
static:
|
||||
|
|
|
|||
|
|
@ -50,5 +50,7 @@ else:
|
|||
{.pragma: benign, gcsafe.}
|
||||
|
||||
template since(version, body: untyped) {.dirty.} =
|
||||
## limitation: can't be used to annotate a template (eg typetraits.get), would
|
||||
## error: cannot attach a custom pragma.
|
||||
when version <= (NimMajor, NimMinor):
|
||||
body
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue