-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.go
More file actions
104 lines (94 loc) · 1.98 KB
/
array.go
File metadata and controls
104 lines (94 loc) · 1.98 KB
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
99
100
101
102
103
104
package deb
import (
_ "fmt"
)
type Array [][][]int64
func NewArray(x, y, z int) (result Array) {
result = make(Array, x)
values := make([]int64, x*y*z)
for i := range result {
result[i] = make([][]int64, y)
for j := range result[i] {
result[i][j], values = values[:z], values[z:]
}
}
return
}
func (arr Array) Copy() (result Array) {
if arr.Empty() {
return Array{{{}}}
}
x, y, z := arr.Dimensions()
result = NewArray(x, y, z)
for i := range result {
for j := range result[i] {
copy(result[i][j], arr[i][j])
}
}
return
}
func (arr Array) Transposed() (result Array) {
if arr.Empty() {
return Array{{{}}}
}
x, y, z := arr.Dimensions()
result = NewArray(z, y, x)
for i := range result {
for j := range result[i] {
for k := range result[i][j] {
result[i][j][k] = arr[k][j][i]
}
}
}
return
}
func (arr *Array) Append(other_arr *Array, y, z uint64) error {
x1, y1, z1 := arr.Dimensions()
x2, y2, z2 := other_arr.Dimensions()
mx, my, mz := max(x1, x2), maxUint64(uint64(y1), uint64(y2)+y),
maxUint64(uint64(z1), uint64(z2)+z)
if arr.Empty() && other_arr.Empty() {
return nil
}
result := make(Array, mx)
values := make([]int64, uint64(mx)*my*mz)
for i := range result {
result[i] = make([][]int64, my)
for j := range result[i] {
result[i][j], values = values[:mz], values[mz:]
for k := range result[i][j] {
if i < x1 && j < y1 && k < z1 {
result[i][j][k] = (*arr)[i][j][k]
}
if i < x2 && j < y2 && k < z2 {
result[i][j][uint64(k)+z] = (*other_arr)[i][j][k]
}
}
}
}
*arr = result
return nil
}
func (arr Array) Dimensions() (int, int, int) {
if len(arr) == 0 || len(arr[0]) == 0 || len(arr[0][0]) == 0 {
return 0, 0, 0
} else {
return len(arr), len(arr[0]), len(arr[0][0])
}
}
func (arr Array) Empty() bool {
x, y, z := arr.Dimensions()
return x == 0 || y == 0 || z == 0
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func maxUint64(a, b uint64) uint64 {
if a > b {
return a
}
return b
}