xref: /aosp_15_r20/external/flatbuffers/go/encode.go (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Workerpackage flatbuffers
2*890232f2SAndroid Build Coastguard Worker
3*890232f2SAndroid Build Coastguard Workerimport (
4*890232f2SAndroid Build Coastguard Worker	"math"
5*890232f2SAndroid Build Coastguard Worker)
6*890232f2SAndroid Build Coastguard Worker
7*890232f2SAndroid Build Coastguard Workertype (
8*890232f2SAndroid Build Coastguard Worker	// A SOffsetT stores a signed offset into arbitrary data.
9*890232f2SAndroid Build Coastguard Worker	SOffsetT int32
10*890232f2SAndroid Build Coastguard Worker	// A UOffsetT stores an unsigned offset into vector data.
11*890232f2SAndroid Build Coastguard Worker	UOffsetT uint32
12*890232f2SAndroid Build Coastguard Worker	// A VOffsetT stores an unsigned offset in a vtable.
13*890232f2SAndroid Build Coastguard Worker	VOffsetT uint16
14*890232f2SAndroid Build Coastguard Worker)
15*890232f2SAndroid Build Coastguard Worker
16*890232f2SAndroid Build Coastguard Workerconst (
17*890232f2SAndroid Build Coastguard Worker	// VtableMetadataFields is the count of metadata fields in each vtable.
18*890232f2SAndroid Build Coastguard Worker	VtableMetadataFields = 2
19*890232f2SAndroid Build Coastguard Worker)
20*890232f2SAndroid Build Coastguard Worker
21*890232f2SAndroid Build Coastguard Worker// GetByte decodes a little-endian byte from a byte slice.
22*890232f2SAndroid Build Coastguard Workerfunc GetByte(buf []byte) byte {
23*890232f2SAndroid Build Coastguard Worker	return byte(GetUint8(buf))
24*890232f2SAndroid Build Coastguard Worker}
25*890232f2SAndroid Build Coastguard Worker
26*890232f2SAndroid Build Coastguard Worker// GetBool decodes a little-endian bool from a byte slice.
27*890232f2SAndroid Build Coastguard Workerfunc GetBool(buf []byte) bool {
28*890232f2SAndroid Build Coastguard Worker	return buf[0] == 1
29*890232f2SAndroid Build Coastguard Worker}
30*890232f2SAndroid Build Coastguard Worker
31*890232f2SAndroid Build Coastguard Worker// GetUint8 decodes a little-endian uint8 from a byte slice.
32*890232f2SAndroid Build Coastguard Workerfunc GetUint8(buf []byte) (n uint8) {
33*890232f2SAndroid Build Coastguard Worker	n = uint8(buf[0])
34*890232f2SAndroid Build Coastguard Worker	return
35*890232f2SAndroid Build Coastguard Worker}
36*890232f2SAndroid Build Coastguard Worker
37*890232f2SAndroid Build Coastguard Worker// GetUint16 decodes a little-endian uint16 from a byte slice.
38*890232f2SAndroid Build Coastguard Workerfunc GetUint16(buf []byte) (n uint16) {
39*890232f2SAndroid Build Coastguard Worker	_ = buf[1] // Force one bounds check. See: golang.org/issue/14808
40*890232f2SAndroid Build Coastguard Worker	n |= uint16(buf[0])
41*890232f2SAndroid Build Coastguard Worker	n |= uint16(buf[1]) << 8
42*890232f2SAndroid Build Coastguard Worker	return
43*890232f2SAndroid Build Coastguard Worker}
44*890232f2SAndroid Build Coastguard Worker
45*890232f2SAndroid Build Coastguard Worker// GetUint32 decodes a little-endian uint32 from a byte slice.
46*890232f2SAndroid Build Coastguard Workerfunc GetUint32(buf []byte) (n uint32) {
47*890232f2SAndroid Build Coastguard Worker	_ = buf[3] // Force one bounds check. See: golang.org/issue/14808
48*890232f2SAndroid Build Coastguard Worker	n |= uint32(buf[0])
49*890232f2SAndroid Build Coastguard Worker	n |= uint32(buf[1]) << 8
50*890232f2SAndroid Build Coastguard Worker	n |= uint32(buf[2]) << 16
51*890232f2SAndroid Build Coastguard Worker	n |= uint32(buf[3]) << 24
52*890232f2SAndroid Build Coastguard Worker	return
53*890232f2SAndroid Build Coastguard Worker}
54*890232f2SAndroid Build Coastguard Worker
55*890232f2SAndroid Build Coastguard Worker// GetUint64 decodes a little-endian uint64 from a byte slice.
56*890232f2SAndroid Build Coastguard Workerfunc GetUint64(buf []byte) (n uint64) {
57*890232f2SAndroid Build Coastguard Worker	_ = buf[7] // Force one bounds check. See: golang.org/issue/14808
58*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[0])
59*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[1]) << 8
60*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[2]) << 16
61*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[3]) << 24
62*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[4]) << 32
63*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[5]) << 40
64*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[6]) << 48
65*890232f2SAndroid Build Coastguard Worker	n |= uint64(buf[7]) << 56
66*890232f2SAndroid Build Coastguard Worker	return
67*890232f2SAndroid Build Coastguard Worker}
68*890232f2SAndroid Build Coastguard Worker
69*890232f2SAndroid Build Coastguard Worker// GetInt8 decodes a little-endian int8 from a byte slice.
70*890232f2SAndroid Build Coastguard Workerfunc GetInt8(buf []byte) (n int8) {
71*890232f2SAndroid Build Coastguard Worker	n = int8(buf[0])
72*890232f2SAndroid Build Coastguard Worker	return
73*890232f2SAndroid Build Coastguard Worker}
74*890232f2SAndroid Build Coastguard Worker
75*890232f2SAndroid Build Coastguard Worker// GetInt16 decodes a little-endian int16 from a byte slice.
76*890232f2SAndroid Build Coastguard Workerfunc GetInt16(buf []byte) (n int16) {
77*890232f2SAndroid Build Coastguard Worker	_ = buf[1] // Force one bounds check. See: golang.org/issue/14808
78*890232f2SAndroid Build Coastguard Worker	n |= int16(buf[0])
79*890232f2SAndroid Build Coastguard Worker	n |= int16(buf[1]) << 8
80*890232f2SAndroid Build Coastguard Worker	return
81*890232f2SAndroid Build Coastguard Worker}
82*890232f2SAndroid Build Coastguard Worker
83*890232f2SAndroid Build Coastguard Worker// GetInt32 decodes a little-endian int32 from a byte slice.
84*890232f2SAndroid Build Coastguard Workerfunc GetInt32(buf []byte) (n int32) {
85*890232f2SAndroid Build Coastguard Worker	_ = buf[3] // Force one bounds check. See: golang.org/issue/14808
86*890232f2SAndroid Build Coastguard Worker	n |= int32(buf[0])
87*890232f2SAndroid Build Coastguard Worker	n |= int32(buf[1]) << 8
88*890232f2SAndroid Build Coastguard Worker	n |= int32(buf[2]) << 16
89*890232f2SAndroid Build Coastguard Worker	n |= int32(buf[3]) << 24
90*890232f2SAndroid Build Coastguard Worker	return
91*890232f2SAndroid Build Coastguard Worker}
92*890232f2SAndroid Build Coastguard Worker
93*890232f2SAndroid Build Coastguard Worker// GetInt64 decodes a little-endian int64 from a byte slice.
94*890232f2SAndroid Build Coastguard Workerfunc GetInt64(buf []byte) (n int64) {
95*890232f2SAndroid Build Coastguard Worker	_ = buf[7] // Force one bounds check. See: golang.org/issue/14808
96*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[0])
97*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[1]) << 8
98*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[2]) << 16
99*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[3]) << 24
100*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[4]) << 32
101*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[5]) << 40
102*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[6]) << 48
103*890232f2SAndroid Build Coastguard Worker	n |= int64(buf[7]) << 56
104*890232f2SAndroid Build Coastguard Worker	return
105*890232f2SAndroid Build Coastguard Worker}
106*890232f2SAndroid Build Coastguard Worker
107*890232f2SAndroid Build Coastguard Worker// GetFloat32 decodes a little-endian float32 from a byte slice.
108*890232f2SAndroid Build Coastguard Workerfunc GetFloat32(buf []byte) float32 {
109*890232f2SAndroid Build Coastguard Worker	x := GetUint32(buf)
110*890232f2SAndroid Build Coastguard Worker	return math.Float32frombits(x)
111*890232f2SAndroid Build Coastguard Worker}
112*890232f2SAndroid Build Coastguard Worker
113*890232f2SAndroid Build Coastguard Worker// GetFloat64 decodes a little-endian float64 from a byte slice.
114*890232f2SAndroid Build Coastguard Workerfunc GetFloat64(buf []byte) float64 {
115*890232f2SAndroid Build Coastguard Worker	x := GetUint64(buf)
116*890232f2SAndroid Build Coastguard Worker	return math.Float64frombits(x)
117*890232f2SAndroid Build Coastguard Worker}
118*890232f2SAndroid Build Coastguard Worker
119*890232f2SAndroid Build Coastguard Worker// GetUOffsetT decodes a little-endian UOffsetT from a byte slice.
120*890232f2SAndroid Build Coastguard Workerfunc GetUOffsetT(buf []byte) UOffsetT {
121*890232f2SAndroid Build Coastguard Worker	return UOffsetT(GetUint32(buf))
122*890232f2SAndroid Build Coastguard Worker}
123*890232f2SAndroid Build Coastguard Worker
124*890232f2SAndroid Build Coastguard Worker// GetSOffsetT decodes a little-endian SOffsetT from a byte slice.
125*890232f2SAndroid Build Coastguard Workerfunc GetSOffsetT(buf []byte) SOffsetT {
126*890232f2SAndroid Build Coastguard Worker	return SOffsetT(GetInt32(buf))
127*890232f2SAndroid Build Coastguard Worker}
128*890232f2SAndroid Build Coastguard Worker
129*890232f2SAndroid Build Coastguard Worker// GetVOffsetT decodes a little-endian VOffsetT from a byte slice.
130*890232f2SAndroid Build Coastguard Workerfunc GetVOffsetT(buf []byte) VOffsetT {
131*890232f2SAndroid Build Coastguard Worker	return VOffsetT(GetUint16(buf))
132*890232f2SAndroid Build Coastguard Worker}
133*890232f2SAndroid Build Coastguard Worker
134*890232f2SAndroid Build Coastguard Worker// WriteByte encodes a little-endian uint8 into a byte slice.
135*890232f2SAndroid Build Coastguard Workerfunc WriteByte(buf []byte, n byte) {
136*890232f2SAndroid Build Coastguard Worker	WriteUint8(buf, uint8(n))
137*890232f2SAndroid Build Coastguard Worker}
138*890232f2SAndroid Build Coastguard Worker
139*890232f2SAndroid Build Coastguard Worker// WriteBool encodes a little-endian bool into a byte slice.
140*890232f2SAndroid Build Coastguard Workerfunc WriteBool(buf []byte, b bool) {
141*890232f2SAndroid Build Coastguard Worker	buf[0] = 0
142*890232f2SAndroid Build Coastguard Worker	if b {
143*890232f2SAndroid Build Coastguard Worker		buf[0] = 1
144*890232f2SAndroid Build Coastguard Worker	}
145*890232f2SAndroid Build Coastguard Worker}
146*890232f2SAndroid Build Coastguard Worker
147*890232f2SAndroid Build Coastguard Worker// WriteUint8 encodes a little-endian uint8 into a byte slice.
148*890232f2SAndroid Build Coastguard Workerfunc WriteUint8(buf []byte, n uint8) {
149*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
150*890232f2SAndroid Build Coastguard Worker}
151*890232f2SAndroid Build Coastguard Worker
152*890232f2SAndroid Build Coastguard Worker// WriteUint16 encodes a little-endian uint16 into a byte slice.
153*890232f2SAndroid Build Coastguard Workerfunc WriteUint16(buf []byte, n uint16) {
154*890232f2SAndroid Build Coastguard Worker	_ = buf[1] // Force one bounds check. See: golang.org/issue/14808
155*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
156*890232f2SAndroid Build Coastguard Worker	buf[1] = byte(n >> 8)
157*890232f2SAndroid Build Coastguard Worker}
158*890232f2SAndroid Build Coastguard Worker
159*890232f2SAndroid Build Coastguard Worker// WriteUint32 encodes a little-endian uint32 into a byte slice.
160*890232f2SAndroid Build Coastguard Workerfunc WriteUint32(buf []byte, n uint32) {
161*890232f2SAndroid Build Coastguard Worker	_ = buf[3] // Force one bounds check. See: golang.org/issue/14808
162*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
163*890232f2SAndroid Build Coastguard Worker	buf[1] = byte(n >> 8)
164*890232f2SAndroid Build Coastguard Worker	buf[2] = byte(n >> 16)
165*890232f2SAndroid Build Coastguard Worker	buf[3] = byte(n >> 24)
166*890232f2SAndroid Build Coastguard Worker}
167*890232f2SAndroid Build Coastguard Worker
168*890232f2SAndroid Build Coastguard Worker// WriteUint64 encodes a little-endian uint64 into a byte slice.
169*890232f2SAndroid Build Coastguard Workerfunc WriteUint64(buf []byte, n uint64) {
170*890232f2SAndroid Build Coastguard Worker	_ = buf[7] // Force one bounds check. See: golang.org/issue/14808
171*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
172*890232f2SAndroid Build Coastguard Worker	buf[1] = byte(n >> 8)
173*890232f2SAndroid Build Coastguard Worker	buf[2] = byte(n >> 16)
174*890232f2SAndroid Build Coastguard Worker	buf[3] = byte(n >> 24)
175*890232f2SAndroid Build Coastguard Worker	buf[4] = byte(n >> 32)
176*890232f2SAndroid Build Coastguard Worker	buf[5] = byte(n >> 40)
177*890232f2SAndroid Build Coastguard Worker	buf[6] = byte(n >> 48)
178*890232f2SAndroid Build Coastguard Worker	buf[7] = byte(n >> 56)
179*890232f2SAndroid Build Coastguard Worker}
180*890232f2SAndroid Build Coastguard Worker
181*890232f2SAndroid Build Coastguard Worker// WriteInt8 encodes a little-endian int8 into a byte slice.
182*890232f2SAndroid Build Coastguard Workerfunc WriteInt8(buf []byte, n int8) {
183*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
184*890232f2SAndroid Build Coastguard Worker}
185*890232f2SAndroid Build Coastguard Worker
186*890232f2SAndroid Build Coastguard Worker// WriteInt16 encodes a little-endian int16 into a byte slice.
187*890232f2SAndroid Build Coastguard Workerfunc WriteInt16(buf []byte, n int16) {
188*890232f2SAndroid Build Coastguard Worker	_ = buf[1] // Force one bounds check. See: golang.org/issue/14808
189*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
190*890232f2SAndroid Build Coastguard Worker	buf[1] = byte(n >> 8)
191*890232f2SAndroid Build Coastguard Worker}
192*890232f2SAndroid Build Coastguard Worker
193*890232f2SAndroid Build Coastguard Worker// WriteInt32 encodes a little-endian int32 into a byte slice.
194*890232f2SAndroid Build Coastguard Workerfunc WriteInt32(buf []byte, n int32) {
195*890232f2SAndroid Build Coastguard Worker	_ = buf[3] // Force one bounds check. See: golang.org/issue/14808
196*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
197*890232f2SAndroid Build Coastguard Worker	buf[1] = byte(n >> 8)
198*890232f2SAndroid Build Coastguard Worker	buf[2] = byte(n >> 16)
199*890232f2SAndroid Build Coastguard Worker	buf[3] = byte(n >> 24)
200*890232f2SAndroid Build Coastguard Worker}
201*890232f2SAndroid Build Coastguard Worker
202*890232f2SAndroid Build Coastguard Worker// WriteInt64 encodes a little-endian int64 into a byte slice.
203*890232f2SAndroid Build Coastguard Workerfunc WriteInt64(buf []byte, n int64) {
204*890232f2SAndroid Build Coastguard Worker	_ = buf[7] // Force one bounds check. See: golang.org/issue/14808
205*890232f2SAndroid Build Coastguard Worker	buf[0] = byte(n)
206*890232f2SAndroid Build Coastguard Worker	buf[1] = byte(n >> 8)
207*890232f2SAndroid Build Coastguard Worker	buf[2] = byte(n >> 16)
208*890232f2SAndroid Build Coastguard Worker	buf[3] = byte(n >> 24)
209*890232f2SAndroid Build Coastguard Worker	buf[4] = byte(n >> 32)
210*890232f2SAndroid Build Coastguard Worker	buf[5] = byte(n >> 40)
211*890232f2SAndroid Build Coastguard Worker	buf[6] = byte(n >> 48)
212*890232f2SAndroid Build Coastguard Worker	buf[7] = byte(n >> 56)
213*890232f2SAndroid Build Coastguard Worker}
214*890232f2SAndroid Build Coastguard Worker
215*890232f2SAndroid Build Coastguard Worker// WriteFloat32 encodes a little-endian float32 into a byte slice.
216*890232f2SAndroid Build Coastguard Workerfunc WriteFloat32(buf []byte, n float32) {
217*890232f2SAndroid Build Coastguard Worker	WriteUint32(buf, math.Float32bits(n))
218*890232f2SAndroid Build Coastguard Worker}
219*890232f2SAndroid Build Coastguard Worker
220*890232f2SAndroid Build Coastguard Worker// WriteFloat64 encodes a little-endian float64 into a byte slice.
221*890232f2SAndroid Build Coastguard Workerfunc WriteFloat64(buf []byte, n float64) {
222*890232f2SAndroid Build Coastguard Worker	WriteUint64(buf, math.Float64bits(n))
223*890232f2SAndroid Build Coastguard Worker}
224*890232f2SAndroid Build Coastguard Worker
225*890232f2SAndroid Build Coastguard Worker// WriteVOffsetT encodes a little-endian VOffsetT into a byte slice.
226*890232f2SAndroid Build Coastguard Workerfunc WriteVOffsetT(buf []byte, n VOffsetT) {
227*890232f2SAndroid Build Coastguard Worker	WriteUint16(buf, uint16(n))
228*890232f2SAndroid Build Coastguard Worker}
229*890232f2SAndroid Build Coastguard Worker
230*890232f2SAndroid Build Coastguard Worker// WriteSOffsetT encodes a little-endian SOffsetT into a byte slice.
231*890232f2SAndroid Build Coastguard Workerfunc WriteSOffsetT(buf []byte, n SOffsetT) {
232*890232f2SAndroid Build Coastguard Worker	WriteInt32(buf, int32(n))
233*890232f2SAndroid Build Coastguard Worker}
234*890232f2SAndroid Build Coastguard Worker
235*890232f2SAndroid Build Coastguard Worker// WriteUOffsetT encodes a little-endian UOffsetT into a byte slice.
236*890232f2SAndroid Build Coastguard Workerfunc WriteUOffsetT(buf []byte, n UOffsetT) {
237*890232f2SAndroid Build Coastguard Worker	WriteUint32(buf, uint32(n))
238*890232f2SAndroid Build Coastguard Worker}
239