def write_string(self, value: str) -> None:
     self.__size = align_offset_to_type(self.__size, FieldTypes.TYPE_STRING)
     self.__writer.seek(self.__size)
     str_size = len(value)
     self.write_uint32(str_size)
     self.__writer.write(bytes(value, 'utf-8'))
     self.__size += str_size
 def write_bytes(self, value: bytes) -> None:
     self.__size = align_offset_to_type(self.__size, FieldTypes.TYPE_BYTES)
     self.__writer.seek(self.__size)
     bytes_size = len(value)
     self.write_uint32(bytes_size)
     self.__writer.write(value)
     self.__size += bytes_size
 def read_bytes(self) -> bytes:
     self.__cursor = align_offset_to_type(self.__cursor,
                                          FieldTypes.TYPE_BYTES)
     self.__reader.seek(self.__cursor)
     bytes_length = self.read_uint32()
     if self.__cursor + bytes_length > self.__size:
         raise RuntimeError(
             f'bytes object has an invalid length {self.__size - self.__cursor}, expected {bytes_length}'
         )
     bytes_value = self.__reader.read(bytes_length)
     self.__cursor += bytes_length
     return bytes_value
 def read_string(self) -> str:
     self.__cursor = align_offset_to_type(self.__cursor,
                                          FieldTypes.TYPE_STRING)
     self.__reader.seek(self.__cursor)
     str_length = self.read_uint32()
     if self.__cursor + str_length > self.__size:
         raise RuntimeError(
             f'str object has an invalid length {self.__size - self.__cursor}, expected {str_length}'
         )
     str_bytes = self.__reader.read(str_length)
     str_value = str(str_bytes, 'utf-8')
     self.__cursor += str_length
     return str_value
 def read_uint64(self) -> int:
     self.__cursor = align_offset_to_type(self.__cursor,
                                          FieldTypes.TYPE_UINT64)
     self.__reader.seek(self.__cursor)
     if self.__cursor + FIELD_SIZES[FieldTypes.TYPE_UINT64] > self.get_size(
     ):
         raise RuntimeError(
             f'cannot read uint64 type, expected {FIELD_SIZES[FieldTypes.TYPE_UINT64]} bytes'
         )
     uint64_bytes = self.__reader.read(FIELD_SIZES[FieldTypes.TYPE_UINT64])
     uint64_value = int.from_bytes(uint64_bytes,
                                   byteorder='little',
                                   signed=False)
     self.__cursor += FIELD_SIZES[FieldTypes.TYPE_UINT64]
     return uint64_value
 def write_uint64(self, value: int) -> None:
     self.__size = align_offset_to_type(self.__size, FieldTypes.TYPE_UINT64)
     self.__writer.seek(self.__size)
     formatted_uint64 = value.to_bytes(8, byteorder='little', signed=False)
     self.__writer.write(formatted_uint64)
     self.__size += FIELD_SIZES[FieldTypes.TYPE_UINT64]