1package flatbuffers
2
3// Table wraps a byte slice and provides read access to its data.
4//
5// The variable `Pos` indicates the root of the FlatBuffers object therein.
6type Table struct {
7	Bytes []byte
8	Pos   UOffsetT // Always < 1<<31.
9}
10
11// Offset provides access into the Table's vtable.
12//
13// Fields which are deprecated are ignored by checking against the vtable's length.
14func (t *Table) Offset(vtableOffset VOffsetT) VOffsetT {
15	vtable := UOffsetT(SOffsetT(t.Pos) - t.GetSOffsetT(t.Pos))
16	if vtableOffset < t.GetVOffsetT(vtable) {
17		return t.GetVOffsetT(vtable + UOffsetT(vtableOffset))
18	}
19	return 0
20}
21
22// Indirect retrieves the relative offset stored at `offset`.
23func (t *Table) Indirect(off UOffsetT) UOffsetT {
24	return off + GetUOffsetT(t.Bytes[off:])
25}
26
27// String gets a string from data stored inside the flatbuffer.
28func (t *Table) String(off UOffsetT) string {
29	b := t.ByteVector(off)
30	return byteSliceToString(b)
31}
32
33// ByteVector gets a byte slice from data stored inside the flatbuffer.
34func (t *Table) ByteVector(off UOffsetT) []byte {
35	off += GetUOffsetT(t.Bytes[off:])
36	start := off + UOffsetT(SizeUOffsetT)
37	length := GetUOffsetT(t.Bytes[off:])
38	return t.Bytes[start : start+length]
39}
40
41// VectorLen retrieves the length of the vector whose offset is stored at
42// "off" in this object.
43func (t *Table) VectorLen(off UOffsetT) int {
44	off += t.Pos
45	off += GetUOffsetT(t.Bytes[off:])
46	return int(GetUOffsetT(t.Bytes[off:]))
47}
48
49// Vector retrieves the start of data of the vector whose offset is stored
50// at "off" in this object.
51func (t *Table) Vector(off UOffsetT) UOffsetT {
52	off += t.Pos
53	x := off + GetUOffsetT(t.Bytes[off:])
54	// data starts after metadata containing the vector length
55	x += UOffsetT(SizeUOffsetT)
56	return x
57}
58
59// Union initializes any Table-derived type to point to the union at the given
60// offset.
61func (t *Table) Union(t2 *Table, off UOffsetT) {
62	off += t.Pos
63	t2.Pos = off + t.GetUOffsetT(off)
64	t2.Bytes = t.Bytes
65}
66
67// GetBool retrieves a bool at the given offset.
68func (t *Table) GetBool(off UOffsetT) bool {
69	return GetBool(t.Bytes[off:])
70}
71
72// GetByte retrieves a byte at the given offset.
73func (t *Table) GetByte(off UOffsetT) byte {
74	return GetByte(t.Bytes[off:])
75}
76
77// GetUint8 retrieves a uint8 at the given offset.
78func (t *Table) GetUint8(off UOffsetT) uint8 {
79	return GetUint8(t.Bytes[off:])
80}
81
82// GetUint16 retrieves a uint16 at the given offset.
83func (t *Table) GetUint16(off UOffsetT) uint16 {
84	return GetUint16(t.Bytes[off:])
85}
86
87// GetUint32 retrieves a uint32 at the given offset.
88func (t *Table) GetUint32(off UOffsetT) uint32 {
89	return GetUint32(t.Bytes[off:])
90}
91
92// GetUint64 retrieves a uint64 at the given offset.
93func (t *Table) GetUint64(off UOffsetT) uint64 {
94	return GetUint64(t.Bytes[off:])
95}
96
97// GetInt8 retrieves a int8 at the given offset.
98func (t *Table) GetInt8(off UOffsetT) int8 {
99	return GetInt8(t.Bytes[off:])
100}
101
102// GetInt16 retrieves a int16 at the given offset.
103func (t *Table) GetInt16(off UOffsetT) int16 {
104	return GetInt16(t.Bytes[off:])
105}
106
107// GetInt32 retrieves a int32 at the given offset.
108func (t *Table) GetInt32(off UOffsetT) int32 {
109	return GetInt32(t.Bytes[off:])
110}
111
112// GetInt64 retrieves a int64 at the given offset.
113func (t *Table) GetInt64(off UOffsetT) int64 {
114	return GetInt64(t.Bytes[off:])
115}
116
117// GetFloat32 retrieves a float32 at the given offset.
118func (t *Table) GetFloat32(off UOffsetT) float32 {
119	return GetFloat32(t.Bytes[off:])
120}
121
122// GetFloat64 retrieves a float64 at the given offset.
123func (t *Table) GetFloat64(off UOffsetT) float64 {
124	return GetFloat64(t.Bytes[off:])
125}
126
127// GetUOffsetT retrieves a UOffsetT at the given offset.
128func (t *Table) GetUOffsetT(off UOffsetT) UOffsetT {
129	return GetUOffsetT(t.Bytes[off:])
130}
131
132// GetVOffsetT retrieves a VOffsetT at the given offset.
133func (t *Table) GetVOffsetT(off UOffsetT) VOffsetT {
134	return GetVOffsetT(t.Bytes[off:])
135}
136
137// GetSOffsetT retrieves a SOffsetT at the given offset.
138func (t *Table) GetSOffsetT(off UOffsetT) SOffsetT {
139	return GetSOffsetT(t.Bytes[off:])
140}
141
142// GetBoolSlot retrieves the bool that the given vtable location
143// points to. If the vtable value is zero, the default value `d`
144// will be returned.
145func (t *Table) GetBoolSlot(slot VOffsetT, d bool) bool {
146	off := t.Offset(slot)
147	if off == 0 {
148		return d
149	}
150
151	return t.GetBool(t.Pos + UOffsetT(off))
152}
153
154// GetByteSlot retrieves the byte that the given vtable location
155// points to. If the vtable value is zero, the default value `d`
156// will be returned.
157func (t *Table) GetByteSlot(slot VOffsetT, d byte) byte {
158	off := t.Offset(slot)
159	if off == 0 {
160		return d
161	}
162
163	return t.GetByte(t.Pos + UOffsetT(off))
164}
165
166// GetInt8Slot retrieves the int8 that the given vtable location
167// points to. If the vtable value is zero, the default value `d`
168// will be returned.
169func (t *Table) GetInt8Slot(slot VOffsetT, d int8) int8 {
170	off := t.Offset(slot)
171	if off == 0 {
172		return d
173	}
174
175	return t.GetInt8(t.Pos + UOffsetT(off))
176}
177
178// GetUint8Slot retrieves the uint8 that the given vtable location
179// points to. If the vtable value is zero, the default value `d`
180// will be returned.
181func (t *Table) GetUint8Slot(slot VOffsetT, d uint8) uint8 {
182	off := t.Offset(slot)
183	if off == 0 {
184		return d
185	}
186
187	return t.GetUint8(t.Pos + UOffsetT(off))
188}
189
190// GetInt16Slot retrieves the int16 that the given vtable location
191// points to. If the vtable value is zero, the default value `d`
192// will be returned.
193func (t *Table) GetInt16Slot(slot VOffsetT, d int16) int16 {
194	off := t.Offset(slot)
195	if off == 0 {
196		return d
197	}
198
199	return t.GetInt16(t.Pos + UOffsetT(off))
200}
201
202// GetUint16Slot retrieves the uint16 that the given vtable location
203// points to. If the vtable value is zero, the default value `d`
204// will be returned.
205func (t *Table) GetUint16Slot(slot VOffsetT, d uint16) uint16 {
206	off := t.Offset(slot)
207	if off == 0 {
208		return d
209	}
210
211	return t.GetUint16(t.Pos + UOffsetT(off))
212}
213
214// GetInt32Slot retrieves the int32 that the given vtable location
215// points to. If the vtable value is zero, the default value `d`
216// will be returned.
217func (t *Table) GetInt32Slot(slot VOffsetT, d int32) int32 {
218	off := t.Offset(slot)
219	if off == 0 {
220		return d
221	}
222
223	return t.GetInt32(t.Pos + UOffsetT(off))
224}
225
226// GetUint32Slot retrieves the uint32 that the given vtable location
227// points to. If the vtable value is zero, the default value `d`
228// will be returned.
229func (t *Table) GetUint32Slot(slot VOffsetT, d uint32) uint32 {
230	off := t.Offset(slot)
231	if off == 0 {
232		return d
233	}
234
235	return t.GetUint32(t.Pos + UOffsetT(off))
236}
237
238// GetInt64Slot retrieves the int64 that the given vtable location
239// points to. If the vtable value is zero, the default value `d`
240// will be returned.
241func (t *Table) GetInt64Slot(slot VOffsetT, d int64) int64 {
242	off := t.Offset(slot)
243	if off == 0 {
244		return d
245	}
246
247	return t.GetInt64(t.Pos + UOffsetT(off))
248}
249
250// GetUint64Slot retrieves the uint64 that the given vtable location
251// points to. If the vtable value is zero, the default value `d`
252// will be returned.
253func (t *Table) GetUint64Slot(slot VOffsetT, d uint64) uint64 {
254	off := t.Offset(slot)
255	if off == 0 {
256		return d
257	}
258
259	return t.GetUint64(t.Pos + UOffsetT(off))
260}
261
262// GetFloat32Slot retrieves the float32 that the given vtable location
263// points to. If the vtable value is zero, the default value `d`
264// will be returned.
265func (t *Table) GetFloat32Slot(slot VOffsetT, d float32) float32 {
266	off := t.Offset(slot)
267	if off == 0 {
268		return d
269	}
270
271	return t.GetFloat32(t.Pos + UOffsetT(off))
272}
273
274// GetFloat64Slot retrieves the float64 that the given vtable location
275// points to. If the vtable value is zero, the default value `d`
276// will be returned.
277func (t *Table) GetFloat64Slot(slot VOffsetT, d float64) float64 {
278	off := t.Offset(slot)
279	if off == 0 {
280		return d
281	}
282
283	return t.GetFloat64(t.Pos + UOffsetT(off))
284}
285
286// GetVOffsetTSlot retrieves the VOffsetT that the given vtable location
287// points to. If the vtable value is zero, the default value `d`
288// will be returned.
289func (t *Table) GetVOffsetTSlot(slot VOffsetT, d VOffsetT) VOffsetT {
290	off := t.Offset(slot)
291	if off == 0 {
292		return d
293	}
294	return VOffsetT(off)
295}
296
297// MutateBool updates a bool at the given offset.
298func (t *Table) MutateBool(off UOffsetT, n bool) bool {
299	WriteBool(t.Bytes[off:], n)
300	return true
301}
302
303// MutateByte updates a Byte at the given offset.
304func (t *Table) MutateByte(off UOffsetT, n byte) bool {
305	WriteByte(t.Bytes[off:], n)
306	return true
307}
308
309// MutateUint8 updates a Uint8 at the given offset.
310func (t *Table) MutateUint8(off UOffsetT, n uint8) bool {
311	WriteUint8(t.Bytes[off:], n)
312	return true
313}
314
315// MutateUint16 updates a Uint16 at the given offset.
316func (t *Table) MutateUint16(off UOffsetT, n uint16) bool {
317	WriteUint16(t.Bytes[off:], n)
318	return true
319}
320
321// MutateUint32 updates a Uint32 at the given offset.
322func (t *Table) MutateUint32(off UOffsetT, n uint32) bool {
323	WriteUint32(t.Bytes[off:], n)
324	return true
325}
326
327// MutateUint64 updates a Uint64 at the given offset.
328func (t *Table) MutateUint64(off UOffsetT, n uint64) bool {
329	WriteUint64(t.Bytes[off:], n)
330	return true
331}
332
333// MutateInt8 updates a Int8 at the given offset.
334func (t *Table) MutateInt8(off UOffsetT, n int8) bool {
335	WriteInt8(t.Bytes[off:], n)
336	return true
337}
338
339// MutateInt16 updates a Int16 at the given offset.
340func (t *Table) MutateInt16(off UOffsetT, n int16) bool {
341	WriteInt16(t.Bytes[off:], n)
342	return true
343}
344
345// MutateInt32 updates a Int32 at the given offset.
346func (t *Table) MutateInt32(off UOffsetT, n int32) bool {
347	WriteInt32(t.Bytes[off:], n)
348	return true
349}
350
351// MutateInt64 updates a Int64 at the given offset.
352func (t *Table) MutateInt64(off UOffsetT, n int64) bool {
353	WriteInt64(t.Bytes[off:], n)
354	return true
355}
356
357// MutateFloat32 updates a Float32 at the given offset.
358func (t *Table) MutateFloat32(off UOffsetT, n float32) bool {
359	WriteFloat32(t.Bytes[off:], n)
360	return true
361}
362
363// MutateFloat64 updates a Float64 at the given offset.
364func (t *Table) MutateFloat64(off UOffsetT, n float64) bool {
365	WriteFloat64(t.Bytes[off:], n)
366	return true
367}
368
369// MutateUOffsetT updates a UOffsetT at the given offset.
370func (t *Table) MutateUOffsetT(off UOffsetT, n UOffsetT) bool {
371	WriteUOffsetT(t.Bytes[off:], n)
372	return true
373}
374
375// MutateVOffsetT updates a VOffsetT at the given offset.
376func (t *Table) MutateVOffsetT(off UOffsetT, n VOffsetT) bool {
377	WriteVOffsetT(t.Bytes[off:], n)
378	return true
379}
380
381// MutateSOffsetT updates a SOffsetT at the given offset.
382func (t *Table) MutateSOffsetT(off UOffsetT, n SOffsetT) bool {
383	WriteSOffsetT(t.Bytes[off:], n)
384	return true
385}
386
387// MutateBoolSlot updates the bool at given vtable location
388func (t *Table) MutateBoolSlot(slot VOffsetT, n bool) bool {
389	if off := t.Offset(slot); off != 0 {
390		t.MutateBool(t.Pos+UOffsetT(off), n)
391		return true
392	}
393
394	return false
395}
396
397// MutateByteSlot updates the byte at given vtable location
398func (t *Table) MutateByteSlot(slot VOffsetT, n byte) bool {
399	if off := t.Offset(slot); off != 0 {
400		t.MutateByte(t.Pos+UOffsetT(off), n)
401		return true
402	}
403
404	return false
405}
406
407// MutateInt8Slot updates the int8 at given vtable location
408func (t *Table) MutateInt8Slot(slot VOffsetT, n int8) bool {
409	if off := t.Offset(slot); off != 0 {
410		t.MutateInt8(t.Pos+UOffsetT(off), n)
411		return true
412	}
413
414	return false
415}
416
417// MutateUint8Slot updates the uint8 at given vtable location
418func (t *Table) MutateUint8Slot(slot VOffsetT, n uint8) bool {
419	if off := t.Offset(slot); off != 0 {
420		t.MutateUint8(t.Pos+UOffsetT(off), n)
421		return true
422	}
423
424	return false
425}
426
427// MutateInt16Slot updates the int16 at given vtable location
428func (t *Table) MutateInt16Slot(slot VOffsetT, n int16) bool {
429	if off := t.Offset(slot); off != 0 {
430		t.MutateInt16(t.Pos+UOffsetT(off), n)
431		return true
432	}
433
434	return false
435}
436
437// MutateUint16Slot updates the uint16 at given vtable location
438func (t *Table) MutateUint16Slot(slot VOffsetT, n uint16) bool {
439	if off := t.Offset(slot); off != 0 {
440		t.MutateUint16(t.Pos+UOffsetT(off), n)
441		return true
442	}
443
444	return false
445}
446
447// MutateInt32Slot updates the int32 at given vtable location
448func (t *Table) MutateInt32Slot(slot VOffsetT, n int32) bool {
449	if off := t.Offset(slot); off != 0 {
450		t.MutateInt32(t.Pos+UOffsetT(off), n)
451		return true
452	}
453
454	return false
455}
456
457// MutateUint32Slot updates the uint32 at given vtable location
458func (t *Table) MutateUint32Slot(slot VOffsetT, n uint32) bool {
459	if off := t.Offset(slot); off != 0 {
460		t.MutateUint32(t.Pos+UOffsetT(off), n)
461		return true
462	}
463
464	return false
465}
466
467// MutateInt64Slot updates the int64 at given vtable location
468func (t *Table) MutateInt64Slot(slot VOffsetT, n int64) bool {
469	if off := t.Offset(slot); off != 0 {
470		t.MutateInt64(t.Pos+UOffsetT(off), n)
471		return true
472	}
473
474	return false
475}
476
477// MutateUint64Slot updates the uint64 at given vtable location
478func (t *Table) MutateUint64Slot(slot VOffsetT, n uint64) bool {
479	if off := t.Offset(slot); off != 0 {
480		t.MutateUint64(t.Pos+UOffsetT(off), n)
481		return true
482	}
483
484	return false
485}
486
487// MutateFloat32Slot updates the float32 at given vtable location
488func (t *Table) MutateFloat32Slot(slot VOffsetT, n float32) bool {
489	if off := t.Offset(slot); off != 0 {
490		t.MutateFloat32(t.Pos+UOffsetT(off), n)
491		return true
492	}
493
494	return false
495}
496
497// MutateFloat64Slot updates the float64 at given vtable location
498func (t *Table) MutateFloat64Slot(slot VOffsetT, n float64) bool {
499	if off := t.Offset(slot); off != 0 {
500		t.MutateFloat64(t.Pos+UOffsetT(off), n)
501		return true
502	}
503
504	return false
505}
506