blob: da0f8bf7cb0778bd6dde5a1318621d27d721312c [file] [log] [blame]
Austin Schuhe89fa2d2019-08-14 20:24:23 -07001local m = {}
2local mt = {}
3
4local mt_name = "flatbuffers.view.mt"
5
6local N = require("flatbuffers.numTypes")
7local binaryarray = require("flatbuffers.binaryarray")
8
9function m.New(buf, pos)
10 N.UOffsetT:EnforceNumber(pos)
11
12 -- need to convert from a string buffer into
13 -- a binary array
14
15 local o = {
16 bytes = type(buf) == "string" and binaryarray.New(buf) or buf,
17 pos = pos
18 }
19 setmetatable(o, {__index = mt, __metatable = mt_name})
20 return o
21end
22
23function mt:Offset(vtableOffset)
24 local vtable = self.pos - self:Get(N.SOffsetT, self.pos)
25 local vtableEnd = self:Get(N.VOffsetT, vtable)
26 if vtableOffset < vtableEnd then
27 return self:Get(N.VOffsetT, vtable + vtableOffset)
28 end
29 return 0
30end
31
32function mt:Indirect(off)
33 N.UOffsetT:EnforceNumber(off)
34 return off + N.UOffsetT:Unpack(self.bytes, off)
35end
36
37function mt:String(off)
38 N.UOffsetT:EnforceNumber(off)
39 off = off + N.UOffsetT:Unpack(self.bytes, off)
40 local start = off + N.UOffsetT.bytewidth
41 local length = N.UOffsetT:Unpack(self.bytes, off)
42 return self.bytes:Slice(start, start+length)
43end
44
45function mt:VectorLen(off)
46 N.UOffsetT:EnforceNumber(off)
47 off = off + self.pos
48 off = off + N.UOffsetT:Unpack(self.bytes, off)
49 return N.UOffsetT:Unpack(self.bytes, off)
50end
51
52function mt:Vector(off)
53 N.UOffsetT:EnforceNumber(off)
54
55 off = off + self.pos
56 local x = off + self:Get(N.UOffsetT, off)
57 x = x + N.UOffsetT.bytewidth
58 return x
59end
60
61function mt:Union(t2, off)
62 assert(getmetatable(t2) == mt_name)
63 N.UOffsetT:EnforceNumber(off)
64
65 off = off + self.pos
66 t2.pos = off + self:Get(N.UOffsetT, off)
67 t2.bytes = self.bytes
68end
69
70function mt:Get(flags, off)
71 N.UOffsetT:EnforceNumber(off)
72 return flags:Unpack(self.bytes, off)
73end
74
75function mt:GetSlot(slot, d, validatorFlags)
76 N.VOffsetT:EnforceNumber(slot)
77 if validatorFlags then
78 validatorFlags:EnforceNumber(d)
79 end
80 local off = self:Offset(slot)
81 if off == 0 then
82 return d
83 end
84 return self:Get(validatorFlags, self.pos + off)
85end
86
87function mt:GetVOffsetTSlot(slot, d)
88 N.VOffsetT:EnforceNumber(slot)
89 N.VOffsetT:EnforceNumber(d)
90 local off = self:Offset(slot)
91 if off == 0 then
92 return d
93 end
94 return off
95end
96
97return m