# automatically generated by the FlatBuffers compiler, do not modify

# namespace: tflite

import flatbuffers

class QuantizeOptions(object):
    __slots__ = ['_tab']

    @classmethod
    def GetRootAsQuantizeOptions(cls, buf, offset):
        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
        x = QuantizeOptions()
        x.Init(buf, n + offset)
        return x

    # QuantizeOptions
    def Init(self, buf, pos):
        self._tab = flatbuffers.table.Table(buf, pos)

def QuantizeOptionsStart(builder): builder.StartObject(0)
def QuantizeOptionsEnd(builder): return builder.EndObject()
