Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
 def encode_buf(self, val, buf, offset=0):
     return serialize.write_varint(val, buf, offset)
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
 def encode_buf(self, val, buf, offset=0):
     return serialize.write_varint(val, buf, offset)