private static Node readNode(TrieReader reader, int depth, int maxDepth) throws IOException { if (depth > maxDepth) { skipNode(reader); return null; } long count = reader.readCount(); int depthPlus1 = depth + 1; long sym1 = reader.readSymbol(); // 0+ daughters if (sym1 == -1L) return NodeFactory.createNode(count); // 1+ daughters Node node1 = readNode(reader, depthPlus1, maxDepth); long sym2 = reader.readSymbol(); if (sym2 == -1L) return NodeFactory.createNodeFold((char) sym1, node1, count); Node node2 = readNode(reader, depthPlus1, maxDepth); long sym3 = reader.readSymbol(); if (sym3 == -1L) return NodeFactory.createNode((char) sym1, node1, (char) sym2, node2, count); Node node3 = readNode(reader, depthPlus1, maxDepth); long sym4 = reader.readSymbol(); if (sym4 == -1L) return NodeFactory.createNode( (char) sym1, node1, (char) sym2, node2, (char) sym3, node3, count); Node node4 = readNode(reader, depthPlus1, maxDepth); // 4+ daughters StringBuilder cBuf = new StringBuilder(); cBuf.append((char) sym1); cBuf.append((char) sym2); cBuf.append((char) sym3); cBuf.append((char) sym4); List<Node> nodeList = new ArrayList<Node>(); nodeList.add(node1); nodeList.add(node2); nodeList.add(node3); nodeList.add(node4); long sym; while ((sym = reader.readSymbol()) != -1L) { cBuf.append((char) sym); nodeList.add(readNode(reader, depthPlus1, maxDepth)); } Node[] nodes = nodeList.toArray(EMPTY_NODE_ARRAY); char[] cs = Strings.toCharArray(cBuf); return NodeFactory.createNode(cs, nodes, count); // > 3 daughters }
private static void skipNode(TrieReader reader) throws IOException { reader.readCount(); while (reader.readSymbol() != -1) skipNode(reader); }