def encode_buf(self, buf, offset=0): for k, v in self._mfields_.items(): name, typehandler, is_array = v if not hasattr(self, name): continue val = getattr(self, name) if is_array: if len(val) == 0: # no need to encode empty arrays continue if isinstance(typehandler, MInteger): # use packed encoding buf[offset] = serialize.WTYPE_LEN_DELIM | k << 3 offset = self._encode_buf_val_len_delim(val, serialize.write_packed_varint, buf, offset+1) elif isinstance(typehandler, MBasicFixed): # use packed encoding offset = typehandler.encode_field_arr(val, k, buf, offset) else: # non-packed encoding for item in val: buf[offset] = serialize.WTYPE_LEN_DELIM | k << 3 offset = self._encode_buf_val_len_delim(item, typehandler.encode_buf, buf, offset+1) else: if isinstance(typehandler, MInteger): buf[offset] = serialize.WTYPE_VARINT | k << 3 offset = serialize.write_varint(val, buf, offset+1) elif isinstance(typehandler, MBasicFixed): offset = typehandler.encode_field_val(val, k, buf, offset) else: buf[offset] = serialize.WTYPE_LEN_DELIM | k << 3 offset = self._encode_buf_val_len_delim(val, typehandler.encode_buf, buf, offset+1) return offset
def _encode_buf_val_len_delim(self, val, writer, buf, offset): start = offset + 10 after = writer(val, buf, start) length = after - start offset = serialize.write_varint(length, buf, offset) buf[offset:offset+length] = buf[start:after] return offset + length
def _encode_buf_val_len_delim(self, val, writer, buf, offset): start = offset + 10 after = writer(val, buf, start) length = after - start offset = serialize.write_varint(length, buf, offset) buf[offset:offset + length] = buf[start:after] return offset + length
def encode_buf(self, buf, offset=0): for k, v in self._mfields_.items(): name, typehandler, is_array = v if not hasattr(self, name): continue val = getattr(self, name) if is_array: if len(val) == 0: # no need to encode empty arrays continue if isinstance(typehandler, MInteger): # use packed encoding buf[offset] = serialize.WTYPE_LEN_DELIM | k << 3 offset = self._encode_buf_val_len_delim( val, serialize.write_packed_varint, buf, offset + 1) elif isinstance(typehandler, MBasicFixed): # use packed encoding offset = typehandler.encode_field_arr(val, k, buf, offset) else: # non-packed encoding for item in val: buf[offset] = serialize.WTYPE_LEN_DELIM | k << 3 offset = self._encode_buf_val_len_delim( item, typehandler.encode_buf, buf, offset + 1) else: if isinstance(typehandler, MInteger): buf[offset] = serialize.WTYPE_VARINT | k << 3 offset = serialize.write_varint(val, buf, offset + 1) elif isinstance(typehandler, MBasicFixed): offset = typehandler.encode_field_val(val, k, buf, offset) else: buf[offset] = serialize.WTYPE_LEN_DELIM | k << 3 offset = self._encode_buf_val_len_delim( val, typehandler.encode_buf, buf, offset + 1) return offset
def encode_buf(self, val, buf, offset=0): return serialize.write_varint(val, buf, offset)
def encode_field_arr(self, arr, field_number, buf, offset=0): buf[offset] = serialize.WTYPE_LEN_DELIM | field_number << 3 size = len(arr) * self._n_bytes offset = serialize.write_varint(size, buf, offset + 1) struct.pack_into('<' + str(len(arr)) + self._s, buf, offset, *arr) return offset + size