distinctBase type trait for distinct types (#13031)
This commit is contained in:
parent
8bcc7e8b9e
commit
871d5e79b1
7 changed files with 91 additions and 70 deletions
|
|
@ -1,4 +1,5 @@
|
|||
import typetraits
|
||||
import macros
|
||||
|
||||
block: # isNamedTuple
|
||||
type Foo1 = (a:1,).type
|
||||
|
|
@ -9,6 +10,7 @@ block: # isNamedTuple
|
|||
doAssert (a:1,).type.isNamedTuple
|
||||
doAssert Foo1.isNamedTuple
|
||||
doAssert Foo2.isNamedTuple
|
||||
doAssert isNamedTuple(tuple[key: int])
|
||||
doAssert not Foo3.isNamedTuple
|
||||
doAssert not Foo4.isNamedTuple
|
||||
doAssert not (1,).type.isNamedTuple
|
||||
|
|
@ -42,3 +44,50 @@ block: # typeToString
|
|||
doAssert (tuple[a: C2b[MyInt, C4[cstring]], b: cint, c: float]).name3 ==
|
||||
"tuple[a: C2b{C}[MyInt{int}, C4[cstring]], b: cint{int32}, c: float]"
|
||||
|
||||
|
||||
#----------------------------------------------------
|
||||
|
||||
block distinctBase:
|
||||
block:
|
||||
type
|
||||
Foo[T] = distinct seq[T]
|
||||
var a: Foo[int]
|
||||
doAssert a.type.distinctBase is seq[int]
|
||||
|
||||
block:
|
||||
# simplified from https://github.com/nim-lang/Nim/pull/8531#issuecomment-410436458
|
||||
macro uintImpl(bits: static[int]): untyped =
|
||||
if bits >= 128:
|
||||
let inner = getAST(uintImpl(bits div 2))
|
||||
result = newTree(nnkBracketExpr, ident("UintImpl"), inner)
|
||||
else:
|
||||
result = ident("uint64")
|
||||
|
||||
type
|
||||
BaseUint = UintImpl or SomeUnsignedInt
|
||||
UintImpl[Baseuint] = object
|
||||
Uint[bits: static[int]] = distinct uintImpl(bits)
|
||||
|
||||
doAssert Uint[128].distinctBase is UintImpl[uint64]
|
||||
|
||||
block:
|
||||
type
|
||||
AA = distinct seq[int]
|
||||
BB = distinct string
|
||||
CC = distinct int
|
||||
AAA = AA
|
||||
|
||||
static:
|
||||
var a2: AAA
|
||||
var b2: BB
|
||||
var c2: CC
|
||||
|
||||
doAssert(a2 is distinct)
|
||||
doAssert(b2 is distinct)
|
||||
doAssert(c2 is distinct)
|
||||
|
||||
doAssert($distinctBase(typeof(a2)) == "seq[int]")
|
||||
doAssert($distinctBase(typeof(b2)) == "string")
|
||||
doAssert($distinctBase(typeof(c2)) == "int")
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue