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