summary refs log tree commit diff stats
path: root/tests/macros/tmacrogenerics.nim
blob: c31b5564c2349062bd3716f85fcd8a80b659906c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
discard """
  nimout: '''
instantiation 1 with typeDesc[int] and typeDesc[float]
instantiation 2 with typeDesc[float] and typeDesc[string]
instantiation 3 with typeDesc[string] and typeDesc[string]
counter: 3
'''
  output: "int\nfloat\nint\nstring"
"""

import typetraits, macros

var counter {.compileTime.} = 0

macro makeBar(A, B: typedesc): typedesc =
  inc counter
  echo "instantiation ", counter, " with ", A.getTypeInst.repr, " and ", B.getTypeInst.repr
  result = A

type
  Bar[T, U] = makeBar(T, U)

var bb1: Bar[int, float]
var bb2: Bar[float, string]
var bb3: Bar[int, float]
var bb4: Bar[string, string]

proc match(a: int)    = echo "int"
proc match(a: string) = echo "string"
proc match(a: float)  = echo "float"

match(bb1)
match(bb2)
match(bb3)
match(bb4)

static:
  echo "counter: ", counter
>(): int = result = 0 for key, val in pairs(gSymbols): if val == "true": inc(result) proc initDefines*() = gSymbols = newStringTable(modeStyleInsensitive) defineSymbol("nimrod") # 'nimrod' is always defined # for bootstrapping purposes and old code: defineSymbol("nimhygiene") defineSymbol("niminheritable") defineSymbol("nimmixin") defineSymbol("nimeffects") defineSymbol("nimbabel") defineSymbol("nimcomputedgoto") # add platform specific symbols: case targetCPU of cpuI386: defineSymbol("x86") of cpuIa64: defineSymbol("itanium") of cpuAmd64: defineSymbol("x8664") else: discard case targetOS of osDos: defineSymbol("msdos") of osWindows: defineSymbol("mswindows") defineSymbol("win32") of osLinux, osMorphos, osSkyos, osIrix, osPalmos, osQnx, osAtari, osAix, osHaiku: # these are all 'unix-like' defineSymbol("unix") defineSymbol("posix") of osSolaris: defineSymbol("sunos") defineSymbol("unix") defineSymbol("posix") of osNetbsd, osFreebsd, osOpenbsd: defineSymbol("unix") defineSymbol("bsd") defineSymbol("posix") of osMacos: defineSymbol("macintosh") of osMacosx: defineSymbol("macintosh") defineSymbol("unix") defineSymbol("posix") else: discard defineSymbol("cpu" & $CPU[targetCPU].bit) defineSymbol(normalize(EndianToStr[CPU[targetCPU].endian])) defineSymbol(CPU[targetCPU].name) defineSymbol(platform.OS[targetOS].name) if platform.OS[targetOS].props.contains(ospLacksThreadVars): defineSymbol("emulatedthreadvars")