-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathtype_float.go
76 lines (66 loc) · 2.07 KB
/
type_float.go
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
package golang
import (
"text/template"
"github.com/andyleap/gencode/schema"
)
var (
FloatTemps *template.Template
)
func init() {
FloatTemps = template.New("FloatTemps").Funcs(template.FuncMap{
"Bytes": func(bits int) int {
return bits / 8
},
"BitRange": func(bits int) []int {
return []int{0, 8, 16, 24, 32, 40, 48, 56, 64}[0:(bits / 8)]
},
})
template.Must(FloatTemps.New("marshal").Parse(`
{
{{if .W.Unsafe}}
*(*float{{.Bits}})(unsafe.Pointer(&buf[{{if .W.IAdjusted}}i + {{end}}{{.W.Offset}}])) = {{.Target}}
{{else}}
v := *(*uint{{.Bits}})(unsafe.Pointer(&({{.Target}})))
{{range BitRange .Bits}}
buf[{{if $.W.IAdjusted}}i + {{end}}{{Bytes .}} + {{$.W.Offset}}] = byte(v >> {{.}})
{{end}}
{{end}}
}`))
template.Must(FloatTemps.New("unmarshal").Parse(`
{
{{if .W.Unsafe}}
{{.Target}} = *(*float{{.Bits}})(unsafe.Pointer(&buf[{{if .W.IAdjusted}}i + {{end}}{{.W.Offset}}]))
{{else}}
v := 0{{range BitRange .Bits}} | (uint{{$.Bits}}(buf[{{if $.W.IAdjusted}}i + {{end}}{{Bytes .}} + {{$.W.Offset}}]) << {{.}}){{end}}
{{.Target}} = *(*float{{.Bits}})(unsafe.Pointer(&v))
{{end}}
}`))
template.Must(FloatTemps.New("field").Parse(`float{{.Bits}}`))
}
type FloatTemp struct {
*schema.FloatType
W *Walker
Target string
}
func (w *Walker) WalkFloatDef(ft *schema.FloatType) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(FloatTemps, "field", ft)
return
}
func (w *Walker) WalkFloatSize(ft *schema.FloatType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
w.Offset += ft.Bits / 8
return
}
func (w *Walker) WalkFloatMarshal(ft *schema.FloatType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(FloatTemps, "marshal", FloatTemp{ft, w, target})
w.Offset += ft.Bits / 8
return
}
func (w *Walker) WalkFloatUnmarshal(ft *schema.FloatType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(FloatTemps, "unmarshal", FloatTemp{ft, w, target})
w.Offset += ft.Bits / 8
return
}