v2 / vlib / v / tests / generics / generic_operator_overload_test.v
80 lines · 67 sloc · 1.4 KB · eeaaff218bbe695c655a6380963e2f82deadcb94
Raw
1struct Matrix[T] {
2 row int
3 col int
4mut:
5 data [][]T
6}
7
8fn from_array[T](arr [][]T) Matrix[T] {
9 return Matrix[T]{
10 row: arr.len
11 col: arr[0].len
12 data: arr.clone()
13 }
14}
15
16fn (m1 Matrix[T]) + (m2 Matrix[T]) Matrix[T] {
17 if m1.row != m2.row || m1.col != m2.col {
18 panic('Addition can only be performed on matrix with same size')
19 }
20 mut res := Matrix[T]{
21 row: m1.row
22 col: m1.col
23 data: m1.data.clone()
24 }
25 for i in 0 .. m2.row {
26 for j in 0 .. m2.col {
27 res.data[i][j] += m2.data[i][j]
28 }
29 }
30 return res
31}
32
33fn (m1 Matrix[T]) == (m2 Matrix[T]) bool {
34 return m1.row == m2.row && m1.col == m2.col && m1.data == m2.data
35}
36
37fn (m1 Matrix[T]) < (m2 Matrix[T]) bool {
38 return m1.row < m2.row && m1.col < m2.col
39}
40
41fn test_generic_operator_overload() {
42 mut a1 := from_array([[1, 2, 3], [4, 5, 6]])
43 a2 := from_array([[7, 8, 9], [10, 11, 12]])
44
45 plus_ret := a1 + a2
46 println(plus_ret)
47 assert plus_ret.row == 2
48 assert plus_ret.col == 3
49 assert plus_ret.data == [[8, 10, 12], [14, 16, 18]]
50
51 a1 += a2
52 println(a1)
53 assert a1.row == 2
54 assert a1.col == 3
55 assert a1.data == [[8, 10, 12], [14, 16, 18]]
56
57 eq_ret := a1 == a2
58 println(eq_ret)
59 assert !eq_ret
60
61 ne_ret := a1 != a2
62 println(ne_ret)
63 assert ne_ret
64
65 lt_ret := a1 < a2
66 println(lt_ret)
67 assert !lt_ret
68
69 le_ret := a1 <= a2
70 println(le_ret)
71 assert le_ret
72
73 gt_ret := a1 > a2
74 println(gt_ret)
75 assert !gt_ret
76
77 ge_ret := a1 >= a2
78 println(ge_ret)
79 assert ge_ret
80}
81