def _write_node(self, node, block_pos): """Writes the sequence of bytes representing a ``node`` to :attr:`block` at ``block_pos``""" STARTS_CHAIN = 0 if node.starts_chain: STARTS_CHAIN = 1 MATCHES = 0 if node.pointer is not None: MATCHES = 1 label = pack_metadata(STARTS_CHAIN, MATCHES, node.num_items) self.block[block_pos] = label block_pos += 1 if node != self.root: in_edge = node.in_edge or 0 self.block[block_pos] = in_edge block_pos += 1 if node.pointer is not None: for byte in unpack_bytes(node.pointer, self.pointer_size): self.block[block_pos] = byte block_pos += 1 if node.starts_chain: for char in node.chain: self.block[block_pos] = char block_pos += 1 if node.continuation is not None: return block_pos, [node.continuation] + sorted(node.children.values(), key=lambda n: -n.in_edge) else: return block_pos, sorted(node.children.values(), key=lambda n: -n.in_edge)
def make_matching_nodes(batch): next_id = 1 for c in batch: yield bs(0,1,0) yield ord(c) for item in unpack_bytes(next_id, dps): yield item next_id += 1
def test_unpack_bytes(): assert util.unpack_bytes(257, 2) == [1, 1]