148dfc69ee613a176f13b04c2310adb7a08fe6737rw# Copyright 2014 Google Inc. All rights reserved. 248dfc69ee613a176f13b04c2310adb7a08fe6737rw# 348dfc69ee613a176f13b04c2310adb7a08fe6737rw# Licensed under the Apache License, Version 2.0 (the "License"); 448dfc69ee613a176f13b04c2310adb7a08fe6737rw# you may not use this file except in compliance with the License. 548dfc69ee613a176f13b04c2310adb7a08fe6737rw# You may obtain a copy of the License at 648dfc69ee613a176f13b04c2310adb7a08fe6737rw# 748dfc69ee613a176f13b04c2310adb7a08fe6737rw# http://www.apache.org/licenses/LICENSE-2.0 848dfc69ee613a176f13b04c2310adb7a08fe6737rw# 948dfc69ee613a176f13b04c2310adb7a08fe6737rw# Unless required by applicable law or agreed to in writing, software 1048dfc69ee613a176f13b04c2310adb7a08fe6737rw# distributed under the License is distributed on an "AS IS" BASIS, 1148dfc69ee613a176f13b04c2310adb7a08fe6737rw# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1248dfc69ee613a176f13b04c2310adb7a08fe6737rw# See the License for the specific language governing permissions and 1348dfc69ee613a176f13b04c2310adb7a08fe6737rw# limitations under the License. 1448dfc69ee613a176f13b04c2310adb7a08fe6737rw 1548dfc69ee613a176f13b04c2310adb7a08fe6737rwfrom . import encode 1648dfc69ee613a176f13b04c2310adb7a08fe6737rwfrom . import number_types as N 1748dfc69ee613a176f13b04c2310adb7a08fe6737rw 1848dfc69ee613a176f13b04c2310adb7a08fe6737rw 1948dfc69ee613a176f13b04c2310adb7a08fe6737rwclass Table(object): 2048dfc69ee613a176f13b04c2310adb7a08fe6737rw """Table wraps a byte slice and provides read access to its data. 2148dfc69ee613a176f13b04c2310adb7a08fe6737rw 2248dfc69ee613a176f13b04c2310adb7a08fe6737rw The variable `Pos` indicates the root of the FlatBuffers object therein.""" 2348dfc69ee613a176f13b04c2310adb7a08fe6737rw 2448dfc69ee613a176f13b04c2310adb7a08fe6737rw __slots__ = ("Bytes", "Pos") 2548dfc69ee613a176f13b04c2310adb7a08fe6737rw 2648dfc69ee613a176f13b04c2310adb7a08fe6737rw def __init__(self, buf, pos): 2748dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(pos, N.UOffsetTFlags) 2848dfc69ee613a176f13b04c2310adb7a08fe6737rw 2948dfc69ee613a176f13b04c2310adb7a08fe6737rw self.Bytes = buf 3048dfc69ee613a176f13b04c2310adb7a08fe6737rw self.Pos = pos 3148dfc69ee613a176f13b04c2310adb7a08fe6737rw 3248dfc69ee613a176f13b04c2310adb7a08fe6737rw def Offset(self, vtableOffset): 3348dfc69ee613a176f13b04c2310adb7a08fe6737rw """Offset provides access into the Table's vtable. 3448dfc69ee613a176f13b04c2310adb7a08fe6737rw 3548dfc69ee613a176f13b04c2310adb7a08fe6737rw Deprecated fields are ignored by checking the vtable's length.""" 3648dfc69ee613a176f13b04c2310adb7a08fe6737rw 3748dfc69ee613a176f13b04c2310adb7a08fe6737rw vtable = self.Pos - self.Get(N.SOffsetTFlags, self.Pos) 3848dfc69ee613a176f13b04c2310adb7a08fe6737rw vtableEnd = self.Get(N.VOffsetTFlags, vtable) 3948dfc69ee613a176f13b04c2310adb7a08fe6737rw if vtableOffset < vtableEnd: 4048dfc69ee613a176f13b04c2310adb7a08fe6737rw return self.Get(N.VOffsetTFlags, vtable + vtableOffset) 4148dfc69ee613a176f13b04c2310adb7a08fe6737rw return 0 4248dfc69ee613a176f13b04c2310adb7a08fe6737rw 4348dfc69ee613a176f13b04c2310adb7a08fe6737rw def Indirect(self, off): 4448dfc69ee613a176f13b04c2310adb7a08fe6737rw """Indirect retrieves the relative offset stored at `offset`.""" 4548dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(off, N.UOffsetTFlags) 4648dfc69ee613a176f13b04c2310adb7a08fe6737rw return off + encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off) 4748dfc69ee613a176f13b04c2310adb7a08fe6737rw 4848dfc69ee613a176f13b04c2310adb7a08fe6737rw def String(self, off): 4948dfc69ee613a176f13b04c2310adb7a08fe6737rw """String gets a string from data stored inside the flatbuffer.""" 5048dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(off, N.UOffsetTFlags) 5148dfc69ee613a176f13b04c2310adb7a08fe6737rw off += encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off) 5248dfc69ee613a176f13b04c2310adb7a08fe6737rw start = off + N.UOffsetTFlags.bytewidth 5348dfc69ee613a176f13b04c2310adb7a08fe6737rw length = encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off) 5448dfc69ee613a176f13b04c2310adb7a08fe6737rw return bytes(self.Bytes[start:start+length]) 5548dfc69ee613a176f13b04c2310adb7a08fe6737rw 5648dfc69ee613a176f13b04c2310adb7a08fe6737rw def VectorLen(self, off): 5748dfc69ee613a176f13b04c2310adb7a08fe6737rw """VectorLen retrieves the length of the vector whose offset is stored 5848dfc69ee613a176f13b04c2310adb7a08fe6737rw at "off" in this object.""" 5948dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(off, N.UOffsetTFlags) 6048dfc69ee613a176f13b04c2310adb7a08fe6737rw 6148dfc69ee613a176f13b04c2310adb7a08fe6737rw off += self.Pos 6248dfc69ee613a176f13b04c2310adb7a08fe6737rw off += encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off) 6348dfc69ee613a176f13b04c2310adb7a08fe6737rw ret = encode.Get(N.UOffsetTFlags.packer_type, self.Bytes, off) 6448dfc69ee613a176f13b04c2310adb7a08fe6737rw return ret 6548dfc69ee613a176f13b04c2310adb7a08fe6737rw 6648dfc69ee613a176f13b04c2310adb7a08fe6737rw def Vector(self, off): 6748dfc69ee613a176f13b04c2310adb7a08fe6737rw """Vector retrieves the start of data of the vector whose offset is 6848dfc69ee613a176f13b04c2310adb7a08fe6737rw stored at "off" in this object.""" 6948dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(off, N.UOffsetTFlags) 7048dfc69ee613a176f13b04c2310adb7a08fe6737rw 7148dfc69ee613a176f13b04c2310adb7a08fe6737rw off += self.Pos 7248dfc69ee613a176f13b04c2310adb7a08fe6737rw x = off + self.Get(N.UOffsetTFlags, off) 7348dfc69ee613a176f13b04c2310adb7a08fe6737rw # data starts after metadata containing the vector length 7448dfc69ee613a176f13b04c2310adb7a08fe6737rw x += N.UOffsetTFlags.bytewidth 7548dfc69ee613a176f13b04c2310adb7a08fe6737rw return x 7648dfc69ee613a176f13b04c2310adb7a08fe6737rw 7748dfc69ee613a176f13b04c2310adb7a08fe6737rw def Union(self, t2, off): 7848dfc69ee613a176f13b04c2310adb7a08fe6737rw """Union initializes any Table-derived type to point to the union at 7948dfc69ee613a176f13b04c2310adb7a08fe6737rw the given offset.""" 8048dfc69ee613a176f13b04c2310adb7a08fe6737rw assert type(t2) is Table 8148dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(off, N.UOffsetTFlags) 8248dfc69ee613a176f13b04c2310adb7a08fe6737rw 8348dfc69ee613a176f13b04c2310adb7a08fe6737rw off += self.Pos 8448dfc69ee613a176f13b04c2310adb7a08fe6737rw t2.Pos = off + self.Get(N.UOffsetTFlags, off) 8548dfc69ee613a176f13b04c2310adb7a08fe6737rw t2.Bytes = self.Bytes 8648dfc69ee613a176f13b04c2310adb7a08fe6737rw 8748dfc69ee613a176f13b04c2310adb7a08fe6737rw def Get(self, flags, off): 8848dfc69ee613a176f13b04c2310adb7a08fe6737rw """ 8948dfc69ee613a176f13b04c2310adb7a08fe6737rw Get retrieves a value of the type specified by `flags` at the 9048dfc69ee613a176f13b04c2310adb7a08fe6737rw given offset. 9148dfc69ee613a176f13b04c2310adb7a08fe6737rw """ 9248dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(off, N.UOffsetTFlags) 9348dfc69ee613a176f13b04c2310adb7a08fe6737rw return flags.py_type(encode.Get(flags.packer_type, self.Bytes, off)) 9448dfc69ee613a176f13b04c2310adb7a08fe6737rw 9548dfc69ee613a176f13b04c2310adb7a08fe6737rw def GetSlot(self, slot, d, validator_flags): 9648dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(slot, N.VOffsetTFlags) 9748dfc69ee613a176f13b04c2310adb7a08fe6737rw if validator_flags is not None: 9848dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(d, validator_flags) 9948dfc69ee613a176f13b04c2310adb7a08fe6737rw off = self.Offset(slot) 10048dfc69ee613a176f13b04c2310adb7a08fe6737rw if off == 0: 10148dfc69ee613a176f13b04c2310adb7a08fe6737rw return d 10248dfc69ee613a176f13b04c2310adb7a08fe6737rw return self.Get(validator_flags, self.Pos + off) 10348dfc69ee613a176f13b04c2310adb7a08fe6737rw 10448dfc69ee613a176f13b04c2310adb7a08fe6737rw def GetVOffsetTSlot(self, slot, d): 10548dfc69ee613a176f13b04c2310adb7a08fe6737rw """ 10648dfc69ee613a176f13b04c2310adb7a08fe6737rw GetVOffsetTSlot retrieves the VOffsetT that the given vtable location 10748dfc69ee613a176f13b04c2310adb7a08fe6737rw points to. If the vtable value is zero, the default value `d` 10848dfc69ee613a176f13b04c2310adb7a08fe6737rw will be returned. 10948dfc69ee613a176f13b04c2310adb7a08fe6737rw """ 11048dfc69ee613a176f13b04c2310adb7a08fe6737rw 11148dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(slot, N.VOffsetTFlags) 11248dfc69ee613a176f13b04c2310adb7a08fe6737rw N.enforce_number(d, N.VOffsetTFlags) 11348dfc69ee613a176f13b04c2310adb7a08fe6737rw 11448dfc69ee613a176f13b04c2310adb7a08fe6737rw off = self.Offset(slot) 11548dfc69ee613a176f13b04c2310adb7a08fe6737rw if off == 0: 11648dfc69ee613a176f13b04c2310adb7a08fe6737rw return d 11748dfc69ee613a176f13b04c2310adb7a08fe6737rw return off 118