# cython: language_level=3 from libc.stdint cimport uint32_t, uint16_t, int32_t import io import struct from .byte_array cimport ByteArray cimport cython cdef class IndexTable: def __init__(self, input_stream: io.BytesIO, cython.longlong indices_count): b = ByteArray(indices_count * 6) input_stream.readinto(b.bytes) self._size = indices_count self.ti_input_symbols = array.array('H', []) array.resize(self.ti_input_symbols, self._size) self.ti_targets = array.array('I', []) array.resize(self.ti_targets, self._size) for i in range(indices_count): self.ti_input_symbols[i] = b.get_ushort() self.ti_targets[i] = b.get_uint() cpdef uint16_t get_input(self, int i): i = i % self._size return self.ti_input_symbols[i] cpdef uint32_t get_target(self, int i): i = i % self._size return self.ti_targets[i] cpdef bint is_final(self, int i): i = i % self._size return (self.ti_input_symbols[i] == NO_SYMBOL_NUMBER and self.ti_targets[i] != NO_TABLE_INDEX) cpdef float get_final_weight(self, int i): i = i % self._size return struct.unpack('