File: tgenericdefaultparam.nim

package info (click to toggle)
nim 2.2.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,951,164 kB
  • sloc: sh: 24,599; ansic: 1,771; python: 1,493; makefile: 1,013; sql: 298; asm: 141; xml: 13
file content (135 lines) | stat: -rw-r--r-- 4,133 bytes parent folder | download
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
block: # issue #16700
  type MyObject[T] = object
    x: T
  proc initMyObject[T](value = T.default): MyObject[T] =
    MyObject[T](x: value)
  var obj = initMyObject[int]()

block: # issue #20916
  type
    SomeX = object
      v: int
  var val = 0
  proc f(_: type int, x: SomeX, v = x.v) =
    doAssert v == 42
    val = v
  proc a(): proc() =
    let v = SomeX(v: 42)
    var tmp = proc() =
      int.f(v)
    tmp
  a()()
  doAssert val == 42

import std/typetraits

block: # issue #24099, original example
  type
    ColorRGBU = distinct array[3, uint8] ## RGB range 0..255
    ColorRGBAU = distinct array[4, uint8] ## RGB range 0..255
    ColorRGBUAny = ColorRGBU | ColorRGBAU
  template componentType(t: typedesc[ColorRGBUAny]): typedesc =
    ## Returns component type of a given color type.
    arrayType distinctBase t
  func `~=`[T: ColorRGBUAny](a, b: T, e = componentType(T)(1.0e-11)): bool =
    ## Compares colors with given accuracy.
    abs(a[0] - b[0]) < e and abs(a[1] - b[1]) < e and abs(a[2] - b[2]) < e

block: # issue #24099, modified to actually work
  type
    ColorRGBU = distinct array[3, uint8] ## RGB range 0..255
    ColorRGBAU = distinct array[4, uint8] ## RGB range 0..255
    ColorRGBUAny = ColorRGBU | ColorRGBAU
  template arrayType[I, T](t: typedesc[array[I, T]]): typedesc =
    T
  template `[]`(a: ColorRGBUAny, i: untyped): untyped = distinctBase(a)[i]
  proc abs(a: uint8): uint8 = a
  template componentType(t: typedesc[ColorRGBUAny]): typedesc =
    ## Returns component type of a given color type.
    arrayType distinctBase t
  func `~=`[T: ColorRGBUAny](a, b: T, e = componentType(T)(1.0e-11)): bool =
    ## Compares colors with given accuracy.
    abs(a[0] - b[0]) <= e and abs(a[1] - b[1]) <= e and abs(a[2] - b[2]) <= e
  doAssert ColorRGBU([1.uint8, 1, 1]) ~= ColorRGBU([1.uint8, 1, 1])

block: # issue #24099, modified to work but using float32
  type
    ColorRGBU = distinct array[3, float32] ## RGB range 0..255
    ColorRGBAU = distinct array[4, float32] ## RGB range 0..255
    ColorRGBUAny = ColorRGBU | ColorRGBAU
  template arrayType[I, T](t: typedesc[array[I, T]]): typedesc =
    T
  template `[]`(a: ColorRGBUAny, i: untyped): untyped = distinctBase(a)[i]
  template componentType(t: typedesc[ColorRGBUAny]): typedesc =
    ## Returns component type of a given color type.
    arrayType distinctBase t
  func `~=`[T: ColorRGBUAny](a, b: T, e = componentType(T)(1.0e-11)): bool =
    ## Compares colors with given accuracy.
    abs(a[0] - b[0]) < e and abs(a[1] - b[1]) < e and abs(a[2] - b[2]) < e
  doAssert ColorRGBU([1.float32, 1, 1]) ~= ColorRGBU([1.float32, 1, 1])

block: # issue #13270
  type
    A = object
    B = object
  proc f(a: A) = discard
  proc g[T](value: T, cb: (proc(a: T)) = f) =
    cb value
  g A()
  # This should fail because there is no f(a: B) overload available
  doAssert not compiles(g B())

block: # issue #24121
  type
    Foo = distinct int
    Bar = distinct int
    FooBar = Foo | Bar

  proc foo[T: distinct](x: T): string = "a"
  proc foo(x: Foo): string = "b"
  proc foo(x: Bar): string = "c"

  proc bar(x: FooBar, y = foo(x)): string = y
  doAssert bar(Foo(123)) == "b"
  doAssert bar(Bar(123)) == "c"

  proc baz[T: FooBar](x: T, y = foo(x)): string = y
  doAssert baz(Foo(123)) == "b"
  doAssert baz(Bar(123)) == "c"

block: # issue #24484
  type E = enum A
  proc foo[T](t: set[T] = {T.A}) =
    discard
  foo[E]()

  proc bar[T](t: set[T] = {T(0), 5}) =
    doAssert t == {0, 5}
  bar[uint8]()
  doAssert not compiles(bar[string]())

block: # issue #24484, array version
  type E = enum A
  proc foo[T](t: openArray[T] = [T.A]) =
    discard
  foo[E]()

  proc bar[T](t: openArray[T] = [T(0), 5]) =
    doAssert t == [T(0), 5]
  bar[uint8]()

block: # issue #24484, tuple version
  type E = enum A
  proc foo[T](t = (T.A,)) =
    discard
  foo[E]()

  proc bar[T](t: (T, int) = (T(0), 5)) =
    doAssert t == (T(0), 5)
  bar[uint8]()

block: # issue #24672
  func initArray[T](arg: array[1, T] = [T.high]): array[1, T] =
    return arg

  discard initArray[float]()  # this would compile and print [inf] in previous versions.