-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdisplay.odin
108 lines (102 loc) · 2.52 KB
/
display.odin
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
105
106
107
108
package mdspan
import "core:fmt"
import "core:io"
Wrapped :: struct{
ravel: rawptr,
shape: []int,
elem_type: typeid,
elem_size: int,
}
wrap :: proc (span: $P/^Span($E,$R)) -> (result: Wrapped) {
return Wrapped {
ravel = span.ravel,
shape = span.shape[:],
elem_type = E,
elem_size = size_of(E),
}
}
@private
fmt_wrapped_span_nohash :: proc (using info: ^fmt.Info, w: Wrapped, verb: rune) {
for i := 0; ; {
trail := 1
j := len(w.shape) - 1
for ; j >= 0; j -= 1 {
trail *= w.shape[j]
if i % trail != 0 { break }
}
if j != -1 {
for _ in 0 ..< len(w.shape) - j - 1 {
io.write_rune(info.writer, ';', &info.n)
}
io.write_rune(info.writer, ' ', &info.n)
} else if i != 0 {
break
}
for {
data := uintptr(w.ravel) + uintptr(i * w.elem_size)
fmt.fmt_arg(info, any{rawptr(data), w.elem_type}, verb)
i += 1
if i % w.shape[len(w.shape) - 1] > 0 {
io.write_string(info.writer, ", ", &info.n)
} else {
break
}
}
}
}
@private
fmt_wrapped_span_hash :: proc (using info: ^fmt.Info, w: Wrapped, verb: rune) {
for i := 0; ; {
trail := 1
j := len(w.shape) - 1
for ; j >= 0; j -= 1 {
trail *= w.shape[j]
if i % trail != 0 { break }
}
if j != -1 {
for _ in 0 ..< len(w.shape) - j - 1 {
io.write_rune(info.writer, '\n', &info.n)
}
} else if i != 0 {
break
}
fmt.fmt_write_indent(info)
for {
data := uintptr(w.ravel) + uintptr(i * w.elem_size)
fmt.fmt_arg(info, any{rawptr(data), w.elem_type}, verb)
i += 1
io.write_string(info.writer, ", ", &info.n)
if i % w.shape[len(w.shape) - 1] == 0 {
break
}
}
}
}
fmt_wrapped_span :: proc (using info: ^fmt.Info, v: any, verb: rune) -> bool {
wrapped := v.(Wrapped) or_return
io.write_string(info.writer, "Span(", &info.n)
fmt.fmt_value(info, wrapped.elem_type, 'T')
io.write_rune(info.writer, ',', &info.n)
io.write_int(info.writer, len(wrapped.shape), 10, &info.n)
io.write_string(info.writer, ")[", &info.n)
rec_level := info.record_level
info.record_level += 1
defer {
info.record_level = rec_level
fmt.fmt_write_indent(info)
io.write_rune(info.writer, ']', &info.n)
}
// TODO(Andrea): precalculate the longest value on each column for alignment
// TODO(Andrea): introduce ellipsis for big arrays
if info.hash {
io.write_rune(info.writer, '\n', &info.n)
indent := info.indent
info.indent += 1
defer info.indent = indent
fmt_wrapped_span_hash(info, wrapped, verb)
io.write_rune(info.writer, '\n', &info.n)
} else {
fmt_wrapped_span_nohash(info, wrapped, verb)
}
return true
}