distinctBase type trait for distinct types (#13031)

This commit is contained in:
cooldome 2020-01-07 23:36:57 +00:00 • committed by Andreas Rumpf
commit 871d5e79b1
7 changed files with 91 additions and 70 deletions

View file

@ -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")