mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
94 lines
3.1 KiB
Nim
94 lines
3.1 KiB
Nim
block: # basic template generic parameter substitution
|
|
block: # issue #13527
|
|
template typeNameTempl[T](a: T): string = $T
|
|
proc typeNameProc[T](a: T): string = $T
|
|
doAssert typeNameTempl(1) == typeNameProc(1)
|
|
doAssert typeNameTempl(true) == typeNameProc(true)
|
|
doAssert typeNameTempl(1.0) == typeNameProc(1.0)
|
|
doAssert typeNameTempl(1u8) == typeNameProc(1u8)
|
|
|
|
template isDefault[T](a: T): bool = a == default(T)
|
|
doAssert isDefault(0.0)
|
|
|
|
block: # issue #17240
|
|
func to(c: int, t: typedesc[float]): t = discard
|
|
template converted[I, T](i: seq[I], t: typedesc[T]): seq[T] =
|
|
var result = newSeq[T](2)
|
|
result[0] = i[0].to(T)
|
|
result
|
|
doAssert newSeq[int](3).converted(float) == @[0.0, 0.0]
|
|
|
|
block: # issue #6340
|
|
type A[T] = object
|
|
v: T
|
|
proc foo(x: int): string = "int"
|
|
proc foo(x: typedesc[int]): string = "typedesc[int]"
|
|
template fooT(x: int): string = "int"
|
|
template fooT(x: typedesc[int]): string = "typedesc[int]"
|
|
proc foo[T](x: A[T]): (string, string) =
|
|
(foo(T), fooT(T))
|
|
template fooT[T](x: A[T]): (string, string) =
|
|
(foo(T), fooT(T))
|
|
var x: A[int]
|
|
doAssert foo(x) == fooT(x)
|
|
|
|
block: # issue #20033
|
|
template run[T](): T = default(T)
|
|
doAssert run[int]() == 0
|
|
|
|
import options, tables, typetraits
|
|
|
|
block: # complex cases of above with imports
|
|
block: # issue #19576, complex case
|
|
type RegistryKey = object
|
|
key, val: string
|
|
var regKey = @[RegistryKey(key: "abc", val: "def")]
|
|
template findFirst[T](s: seq[T], pred: proc(x: T): bool): Option[T] =
|
|
var res = none(T) # important line
|
|
for x in s:
|
|
if pred(x):
|
|
res = some(x)
|
|
break
|
|
res
|
|
proc getval(searchKey: string): Option[string] =
|
|
let found = regKey.findFirst(proc (rk: RegistryKey): bool = rk.key == searchKey)
|
|
if found.isNone: none(string)
|
|
else: some(found.get().val)
|
|
doAssert getval("strange") == none(string)
|
|
doAssert getval("abc") == some("def")
|
|
block: # issue #19076
|
|
block: # case 1
|
|
var tested: Table[string,int]
|
|
template `[]`[V](t:Table[string,V],key:string):untyped =
|
|
$V
|
|
doAssert tested["abc"] == "int"
|
|
template `{}`[V](t:Table[string,V],key:string):untyped =
|
|
($V, tables.`[]`(t, key))
|
|
doAssert (try: tested{"abc"} except KeyError: ("not there", 123)) == ("not there", 123)
|
|
tables.`[]=`(tested, "abc", 456)
|
|
doAssert tested["abc"] == "int"
|
|
doAssert tested{"abc"} == ("int", 456)
|
|
block: # case 2
|
|
type Foo[A,T] = object
|
|
t:T
|
|
proc init[A,T](f:type Foo,a:typedesc[A],t:T):Foo[A,T] = Foo[A,T](t:t)
|
|
template fromOption[A](o:Option[A]):auto =
|
|
when o.isSome:
|
|
Foo.init(A,35)
|
|
else:
|
|
Foo.init(A,"hi")
|
|
let op = fromOption(some(5))
|
|
block: # issue #7461
|
|
template p[T](): untyped = none(T)
|
|
doAssert p[int]() == none(int)
|
|
block: # issue #7995
|
|
var res: string
|
|
template copyRange[T](dest: seq[T], destOffset: int) =
|
|
when supportsCopyMem(T):
|
|
res = "A"
|
|
else:
|
|
res = "B"
|
|
var a = @[1, 2, 3]
|
|
copyRange(a, 0)
|
|
doAssert res == "A"
|