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