summary refs log tree commit diff stats
path: root/tests/tmatrix.nim
diff options
context:
space:
mode:
authorrumpf_a@web.de <>2010-01-03 12:31:21 +0100
committerrumpf_a@web.de <>2010-01-03 12:31:21 +0100
commita58a2f3823c33104992dc0e4129fa53e66a18f44 (patch)
treeaf97f1c6634d7ef2d4468c70607c20731e6c1512 /tests/tmatrix.nim
parent2169fd63bdf9caf539ca7ca5b661ee703206500c (diff)
downloadNim-a58a2f3823c33104992dc0e4129fa53e66a18f44.tar.gz
better subscript overloading
Diffstat (limited to 'tests/tmatrix.nim')
-rw-r--r--tests/tmatrix.nim60
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