def write(self, io: ByteIo, value: int) -> None: if value is None: io.write(NoneCodec.NONE_VALUE) return b: bytes = struct.pack(">i", value) buffer_len: int = len(b) found: bool = False for i in range(0, len(b)): if not found and b[i] == 0: buffer_len = buffer_len - 1 else: found = True if buffer_len == 4: io.write(self.size_4) io.write4(value) elif buffer_len == 3: io.write(self.size_3) io.write3(value) elif buffer_len == 2: io.write(self.size_2) io.write2(value) elif buffer_len <= 1: io.write(self.size_1) io.write1(value) else: raise TypeError(f"Could not serialize int {value}")
def write(self, io: ByteIo, array: List[T]) -> None: if array is None: io.write(NoneCodec.NONE_VALUE) return io.write_size(len(array), self.reserved_byte) for item in array: self.codec.write(io, item)
def write(self, io: ByteIo, array: List[bytes]) -> None: if array is None: io.write(NoneCodec.NONE_VALUE) return io.write_size(len(array), self.reserved_byte) for b in array: io.write(b)
def write(self, io: ByteIo, array: List[str]) -> None: if array is None: io.write(NoneCodec.NONE_VALUE) return encoded: bytes = "".join(array).encode("UTF-8") io.write_size(len(encoded), self.reserved_byte) io.write(encoded)
def write(self, io: ByteIo, array: List[int]) -> None: if array is None: io.write(NoneCodec.NONE_VALUE) return io.write_size(len(array), self.reserved_byte) for element in array: io.write1(element >> 8) io.write1(element)
def write(self, io: ByteIo, collection: Set[T]) -> None: if collection is None: io.write(NoneCodec.NONE_VALUE) return io.write_size(len(collection), self.reserved_byte) for value in collection: codec: Codec = self.value_codec if codec is None: codec = self.codec_cache.codec_for(value) codec.write(io, value)
def write(self, io: ByteIo, value: str) -> None: if value is None: io.write(NoneCodec.NONE_VALUE) return ordinal: int = ord(value) if ordinal >= 32768: io.write(self.size_3) io.write3(ordinal) return if ordinal >= 128: io.write(self.size_2) io.write2(ordinal) return io.write(self.size_1) io.write((ordinal & 0xFF).to_bytes(1, byteorder="big"))
def write(self, io: ByteIo, dictionary: Dict[T, U]) -> None: if dictionary is None: io.write(NoneCodec.NONE_VALUE) return io.write_size(len(dictionary), self.reserved_byte) for key, value in dictionary.items(): k_codec: Codec[T] = self.key_codec if k_codec is None: k_codec = self.codec_cache.codec_for(key) v_codec: Codec[U] = self.value_codec if v_codec is None: v_codec = self.codec_cache.codec_for(value) k_codec.write(io, key) v_codec.write(io, value)
def write(self, io: ByteIo, array: List[bool]) -> None: if array is None: io.write(NoneCodec.NONE_VALUE) return io.write_size(len(array), self.reserved_byte) current_count: int = 0 value: int = 0 for element in array: bool_int: int = 0 if element: bool_int = 1 value = value << 1 | bool_int if current_count == 7: current_count = 0 io.write1(value) else: current_count = current_count + 1 if current_count > 0: io.write1(value << (8 - current_count))
def write(self, io: ByteIo, value: bytes) -> None: if value is None: io.write(NoneCodec.NONE_VALUE) return io.write(self.byte_bytes) io.write(value)
def write(self, io: ByteIo, value: bool) -> None: if value is None: io.write(NoneCodec.NONE_VALUE) return if value: io.write(self.true_bytes) else: io.write(self.false_bytes)
def write(self, io: ByteIo, collection: Deque[T]) -> None: if collection is None: io.write(NoneCodec.NONE_VALUE) return io.write(self.start) for value in collection: codec: Codec = self.value_codec if codec is None: codec = self.codec_cache.codec_for(value) codec.write(io, value) io.write(self.end)
def write(self, io: ByteIo, collection: str) -> None: if collection is None: io.write(NoneCodec.NONE_VALUE) return data: bytes = collection.encode("UTF-8") length: int = len(data) if length < self.size_1 - self.optimized_from: io.write(to_byte((self.optimized_from + length) & 0xFF)) else: io.write_size(length, to_byte(self.size_1)) if length != 0: io.write(data)
def write(self, io: ByteIo, value: float) -> None: if value is None: io.write(NoneCodec.NONE_VALUE) return packed: bytes = struct.pack(">d", value) long: int = int_from_byte(packed) if long < -2147483648: if long < -549755813888: if long < -140737488355328: if long < -36028797018963968: io.write(self.size_8) io.write8(long) else: io.write(self.size_7) io.write7(long) else: io.write(self.size_6) io.write6(long) else: io.write(self.size_5) io.write5(long) elif long < 128: if long < -128: if long < -32768: if long < -8388608: io.write(self.size_4) io.write4(long) else: io.write(self.size_3) io.write3(long) else: io.write(self.size_2) io.write2(long) else: io.write(self.size_1) io.write1(long) elif long < 2147483648: if long < 8388608: if long < 32768: io.write(self.size_2) io.write2(long) else: io.write(self.size_3) io.write3(long) else: io.write(self.size_4) io.write4(long) elif long < 140737488355328: if long < 549755813888: io.write(self.size_5) io.write5(long) else: io.write(self.size_6) io.write6(long) elif long < 36028797018963968: io.write(self.size_7) io.write7(long) else: io.write(self.size_8) io.write8(long)
def write(self, io: ByteIo, value: float) -> None: if value is None: io.write(NoneCodec.NONE_VALUE) return packed: bytes = struct.pack(">f", value) long: int = int_from_byte(packed) if long < -128: if long < -32768: if long < -8388608: io.write(self.size_4) io.write4(long) else: io.write(self.size_3) io.write3(long) else: io.write(self.size_2) io.write2(long) elif long < 32768: if long < 128: io.write(self.size_1) io.write1(long) else: io.write(self.size_2) io.write2(long) elif long < 8388608: io.write(self.size_3) io.write3(long) else: io.write(self.size_4) io.write4(long)
def write(self, io: ByteIo, value: None) -> None: io.write(NoneCodec.NONE_VALUE)