-
Notifications
You must be signed in to change notification settings - Fork 4
/
array.go
42 lines (38 loc) · 993 Bytes
/
array.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
package surge
import (
"reflect"
)
func sizeHintReflectedArray(v reflect.Value) int {
sizeHint := 0
for i := 0; i < v.Len(); i++ {
sizeHint += sizeHintReflected(v.Index(i))
}
return sizeHint
}
func marshalReflectedArray(v reflect.Value, buf []byte, rem int) ([]byte, int, error) {
arrayLen := v.Len()
if len(buf) < arrayLen || rem < arrayLen {
return buf, rem, ErrUnexpectedEndOfBuffer
}
var err error
for i := 0; i < arrayLen; i++ {
if buf, rem, err = marshalReflected(v.Index(i), buf, rem); err != nil {
return buf, rem, err
}
}
return buf, rem, nil
}
func unmarshalReflectedArray(v reflect.Value, buf []byte, rem int) ([]byte, int, error) {
elem := v.Elem()
arrayLen := elem.Len()
if len(buf) < arrayLen || rem < arrayLen {
return buf, rem, ErrUnexpectedEndOfBuffer
}
var err error
for i := 0; i < arrayLen; i++ {
if buf, rem, err = unmarshalReflected(elem.Index(i).Addr(), buf, rem); err != nil {
return buf, rem, err
}
}
return buf, rem, nil
}