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