68 lines
991 B
Nim
68 lines
991 B
Nim
discard """
|
|
output: '''Sortable
|
|
Sortable
|
|
Container
|
|
true
|
|
true
|
|
false
|
|
false
|
|
false
|
|
'''
|
|
"""
|
|
|
|
import typetraits
|
|
|
|
type
|
|
TObj = object
|
|
x: int
|
|
|
|
Sortable = concept x, y
|
|
(x < y) is bool
|
|
|
|
ObjectContainer = concept C
|
|
C.len is Ordinal
|
|
for v in items(C):
|
|
v.type is tuple|object
|
|
|
|
proc foo(c: ObjectContainer) =
|
|
echo "Container"
|
|
|
|
proc foo(x: Sortable) =
|
|
echo "Sortable"
|
|
|
|
foo 10
|
|
foo "test"
|
|
foo(@[TObj(x: 10), TObj(x: 20)])
|
|
|
|
proc intval(x: int): int = 10
|
|
|
|
# check real and virtual fields
|
|
type
|
|
TFoo = concept T
|
|
T.x
|
|
y(T)
|
|
intval T.y
|
|
let z = intval(T.y)
|
|
|
|
proc y(x: TObj): int = 10
|
|
|
|
proc testFoo(x: TFoo) = discard
|
|
testFoo(TObj(x: 10))
|
|
|
|
type
|
|
Matrix[Rows, Cols: static[int]; T] = concept M
|
|
M.M == Rows
|
|
M.N == Cols
|
|
M.T is T
|
|
|
|
MyMatrix[M, N: static[int]; T] = object
|
|
data: array[M*N, T]
|
|
|
|
var x: MyMatrix[3, 3, int]
|
|
|
|
echo x is Matrix
|
|
echo x is Matrix[3, 3, int]
|
|
echo x is Matrix[3, 3, float]
|
|
echo x is Matrix[4, 3, int]
|
|
echo x is Matrix[3, 4, int]
|
|
|