local m = {} local mt = {} local mt_name = "flatbuffers.view.mt" local N = require("flatbuffers.numTypes") local binaryarray = require("flatbuffers.binaryarray") function m.New(buf, pos) N.UOffsetT:EnforceNumber(pos) -- need to convert from a string buffer into -- a binary array local o = { bytes = type(buf) == "string" and binaryarray.New(buf) or buf, pos = pos } setmetatable(o, {__index = mt, __metatable = mt_name}) return o end function mt:Offset(vtableOffset) local vtable = self.pos - self:Get(N.SOffsetT, self.pos) local vtableEnd = self:Get(N.VOffsetT, vtable) if vtableOffset < vtableEnd then return self:Get(N.VOffsetT, vtable + vtableOffset) end return 0 end function mt:Indirect(off) N.UOffsetT:EnforceNumber(off) return off + N.UOffsetT:Unpack(self.bytes, off) end function mt:String(off) N.UOffsetT:EnforceNumber(off) off = off + N.UOffsetT:Unpack(self.bytes, off) local start = off + N.UOffsetT.bytewidth local length = N.UOffsetT:Unpack(self.bytes, off) return self.bytes:Slice(start, start+length) end function mt:VectorLen(off) N.UOffsetT:EnforceNumber(off) off = off + self.pos off = off + N.UOffsetT:Unpack(self.bytes, off) return N.UOffsetT:Unpack(self.bytes, off) end function mt:Vector(off) N.UOffsetT:EnforceNumber(off) off = off + self.pos local x = off + self:Get(N.UOffsetT, off) x = x + N.UOffsetT.bytewidth return x end function mt:Union(t2, off) assert(getmetatable(t2) == mt_name) N.UOffsetT:EnforceNumber(off) off = off + self.pos t2.pos = off + self:Get(N.UOffsetT, off) t2.bytes = self.bytes end function mt:Get(flags, off) N.UOffsetT:EnforceNumber(off) return flags:Unpack(self.bytes, off) end function mt:GetSlot(slot, d, validatorFlags) N.VOffsetT:EnforceNumber(slot) if validatorFlags then validatorFlags:EnforceNumber(d) end local off = self:Offset(slot) if off == 0 then return d end return self:Get(validatorFlags, self.pos + off) end function mt:GetVOffsetTSlot(slot, d) N.VOffsetT:EnforceNumber(slot) N.VOffsetT:EnforceNumber(d) local off = self:Offset(slot) if off == 0 then return d end return off end return m