diff options
author | rumpf_a@web.de <> | 2010-01-03 12:31:21 +0100 |
---|---|---|
committer | rumpf_a@web.de <> | 2010-01-03 12:31:21 +0100 |
commit | a58a2f3823c33104992dc0e4129fa53e66a18f44 (patch) | |
tree | af97f1c6634d7ef2d4468c70607c20731e6c1512 /tests/tmatrix.nim | |
parent | 2169fd63bdf9caf539ca7ca5b661ee703206500c (diff) | |
download | Nim-a58a2f3823c33104992dc0e4129fa53e66a18f44.tar.gz |
better subscript overloading
Diffstat (limited to 'tests/tmatrix.nim')
-rw-r--r-- | tests/tmatrix.nim | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/tmatrix.nim b/tests/tmatrix.nim new file mode 100644 index 000000000..a64ac0395 --- /dev/null +++ b/tests/tmatrix.nim @@ -0,0 +1,60 @@ +# Test overloading of [] with multiple indices + +type + TMatrix* = object + data: seq[float] + fWidth, fHeight: int + +template `|`(x, y: int): expr = y * m.fWidth + x + +proc createMatrix*(width, height: int): TMatrix = + result.fWidth = width + result.fHeight = height + newSeq(result.data, width*height) + +proc width*(m: TMatrix): int {.inline.} = return m.fWidth +proc height*(m: TMatrix): int {.inline.} = return m.fHeight + +proc `[,]`*(m: TMatrix, x, y: int): float {.inline.} = + result = m.data[x|y] + +proc `[,]=`*(m: var TMatrix, x, y: int, val: float) {.inline.} = + m.data[x|y] = val + +proc `[$..$, $..$]`*(m: TMatrix, a, b, c, d: int): TMatrix = + result = createMatrix(b-a+1, d-c+1) + for x in a..b: + for y in c..d: + result[x-a, y-c] = m[x, y] + +proc `[$..$, $..$]=`*(m: var TMatrix, a, b, c, d: int, val: float) = + for x in a..b: + for y in c..d: + m[x, y] = val + +proc `[$..$, $..$]=`*(m: var TMatrix, a, b, c, d: int, val: TMatrix) = + assert val.width == b-a+1 + assert val.height == d-c+1 + for x in a..b: + for y in c..d: + m[x, y] = val[x-a, y-c] + +proc `-|`*(m: TMatrix): TMatrix = + ## transposes a matrix + result = createMatrix(m.height, m.width) + for x in 0..m.width-1: + for y in 0..m.height-1: result[y,x] = m[x,y] + +#m.row(0, 2) # select row +#m.col(0, 89) # select column + +const + w = 3 + h = 20 + +var m = createMatrix(w, h) +for i in 0..w-1: + m[i, i] = 1.0 + +for i in 0..w-1: + stdout.write(m[i,i]) #OUT 1.01.01.0 |