-
Notifications
You must be signed in to change notification settings - Fork 0
/
schema_list.go
114 lines (101 loc) · 2.49 KB
/
schema_list.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
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
109
110
111
112
113
114
package schema
import (
"io"
"unsafe"
"github.com/hsfzxjy/imbed/core/pos"
"github.com/hsfzxjy/imbed/util/fastbuf"
)
type _List struct {
// def func() []E
elemSchema genericSchema
proto listProto
defaulter
}
func (s *_List) decodeMsg(r *fastbuf.R, target unsafe.Pointer) *schemaError {
size, err := r.ReadInt64()
if err != nil {
return newError(err)
}
s.proto.ListInit(target, int(size))
for i := 0; i < int(size); i++ {
err := s.elemSchema.decodeMsg(r, s.proto.ListElem(target, i))
if err != nil {
return err.AppendIndex(i)
}
}
return nil
}
func (s *_List) scanFrom(r Scanner, target unsafe.Pointer) (pos.P, *schemaError) {
size, listPos, err := r.ListSize()
if err != nil {
return listPos, newError(err)
}
s.proto.ListInit(target, int(size))
var elemPos pos.P
err = r.IterElem(func(i int, r Scanner) error {
p, err := s.elemSchema.scanFrom(r, s.proto.ListElem(target, i))
if err != nil {
err.AppendIndex(i)
}
elemPos = p
listPos = listPos.Add(p)
return err.AsError()
})
if err != nil {
return elemPos, newError(err)
}
return listPos, nil
}
func (s *_List) encodeMsg(w *fastbuf.W, source unsafe.Pointer) {
length := s.proto.ListLen(source)
w.WriteInt64(int64(length))
for i := 0; i < length; i++ {
s.elemSchema.encodeMsg(w, s.proto.ListElem(source, i))
}
}
func (s *_List) visit(v Visitor, source unsafe.Pointer) *schemaError {
length := s.proto.ListLen(source)
lv, ev, err := v.VisitList(length)
if err != nil {
return newError(err)
}
if err := lv.VisitListBegin(length); err != nil {
return newError(err)
}
for i := 0; i < length; i++ {
if err := lv.VisitListItemBegin(i); err != nil {
return newError(err).AppendIndex(i)
}
if err := s.elemSchema.visit(ev, s.proto.ListElem(source, i)); err != nil {
return err.AppendIndex(i)
}
if err := lv.VisitListItemEnd(i); err != nil {
return newError(err).AppendIndex(i)
}
}
if err := lv.VisitListEnd(length); err != nil {
return newError(err)
}
return nil
}
// func (s *_List[E]) setDefault(target unsafe.Pointer) *schemaError {
// if s.def == nil {
// return newError(ErrRequired)
// }
// *(*[]E)(target) = s.def()
// return nil
// }
// func (s *_List[E]) hasDefault() bool {
// return s.def != nil
// }
// func (s *_List[E]) equal(a, b []E) bool {
// return false
// }
func (s *_List) writeTypeInfo(w io.Writer) error {
_, err := w.Write([]byte("list"))
if err != nil {
return err
}
return s.elemSchema.writeTypeInfo(w)
}
func _() { var _ genericSchema = &_List{} }