-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[cleanup] remove disabled (and obsolete) ttypetraits; rename ttypetra…
…its2 => ttypetraits (#13041) * remove disabled (and obsolete) ttypetraits; rename ttypetraits2 => ttypetraits * D20200105T085828 fix super strange bug that causes CI to fail: builds.sr.ht with: `Error: Settle timed out after 120 attempts`
- Loading branch information
1 parent
2cfa8d8
commit 72499a8
Showing
2 changed files
with
41 additions
and
102 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,60 +1,44 @@ | ||
discard """ | ||
nimout: "int\nstring\nTBar[int]" | ||
output: "int\nstring\nTBar[int]\nint\nrange 0..2(int)\nstring" | ||
disabled: true | ||
""" | ||
|
||
import typetraits | ||
|
||
# simple case of type trait usage inside/outside of static blocks | ||
proc foo(x) = | ||
static: | ||
var t = type(x) | ||
echo t.name | ||
|
||
echo x.type.name | ||
|
||
type | ||
TBar[U] = object | ||
x: U | ||
|
||
var bar: TBar[int] | ||
|
||
foo 10 | ||
foo "test" | ||
foo bar | ||
|
||
# generic params on user types work too | ||
proc foo2[T](x: TBar[T]) = | ||
echo T.name | ||
|
||
foo2 bar | ||
|
||
# less usual generic params on built-in types | ||
var arr: array[0..2, int] = [1, 2, 3] | ||
|
||
proc foo3[R, T](x: array[R, T]) = | ||
echo name(R) | ||
|
||
foo3 arr | ||
|
||
const TypeList = [int, string, seq[int]] | ||
|
||
macro selectType(inType: typedesc): typedesc = | ||
var typeSeq = @[float, TBar[int]] | ||
|
||
for t in TypeList: | ||
typeSeq.add(t) | ||
|
||
typeSeq.add(inType) | ||
typeSeq.add(type(10)) | ||
|
||
var typeSeq2: seq[typedesc] = @[] | ||
typeSeq2 = typeSeq | ||
|
||
result = typeSeq2[5] | ||
|
||
var xvar: selectType(string) | ||
xvar = "proba" | ||
echo xvar.type.name | ||
block: # isNamedTuple | ||
type Foo1 = (a:1,).type | ||
type Foo2 = (Field0:1,).type | ||
type Foo3 = ().type | ||
type Foo4 = object | ||
|
||
doAssert (a:1,).type.isNamedTuple | ||
doAssert Foo1.isNamedTuple | ||
doAssert Foo2.isNamedTuple | ||
doAssert not Foo3.isNamedTuple | ||
doAssert not Foo4.isNamedTuple | ||
doAssert not (1,).type.isNamedTuple | ||
|
||
proc typeToString*(t: typedesc, prefer = "preferTypeName"): string {.magic: "TypeTrait".} | ||
## Returns the name of the given type, with more flexibility than `name`, | ||
## and avoiding the potential clash with a variable named `name`. | ||
## prefer = "preferResolved" will resolve type aliases recursively. | ||
# Move to typetraits.nim once api stabilized. | ||
|
||
block: # typeToString | ||
type MyInt = int | ||
type | ||
C[T0, T1] = object | ||
type C2=C # alias => will resolve as C | ||
type C2b=C # alias => will resolve as C (recursively) | ||
type C3[U,V] = C[V,U] | ||
type C4[X] = C[X,X] | ||
template name2(T): string = typeToString(T, "preferResolved") | ||
doAssert MyInt.name2 == "int" | ||
doAssert C3[MyInt, C2b].name2 == "C3[int, C]" | ||
# C3 doesn't get resolved to C, not an alias (nor does C4) | ||
doAssert C2b[MyInt, C4[cstring]].name2 == "C[int, C4[cstring]]" | ||
doAssert C4[MyInt].name2 == "C4[int]" | ||
when BiggestFloat is float and cint is int: | ||
doAssert C2b[cint, BiggestFloat].name2 == "C3[int, C3[float, int32]]" | ||
|
||
template name3(T): string = typeToString(T, "preferMixed") | ||
doAssert MyInt.name3 == "MyInt{int}" | ||
doAssert (tuple[a: MyInt, b: float]).name3 == "tuple[a: MyInt{int}, b: float]" | ||
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]" | ||
|
This file was deleted.
Oops, something went wrong.