@Override public Object generate( SourceOfRandomness random, GenerationStatus status) { return status.valueOf(KEY); } }
@Override public Node generate(SourceOfRandomness r, GenerationStatus s) { int depth = s.valueOf(TreeKeys.DEPTH).orElse(1); if (depth == 1) { Generator<Tree> leafOrEmpty = gen().oneOf(Leaf.class, Empty.class); return new Node( leafOrEmpty.generate(r, s), leafOrEmpty.generate(r, s) ); } Generator<Tree> subtree = gen().oneOf(Node.class, Leaf.class, Empty.class); s.setValue(TreeKeys.DEPTH, depth - 1); return new Node( subtree.generate(r, s), subtree.generate(r, s) ); }
int nestingLevel(GenerationStatus status) { return status.valueOf(NESTING_KEY).orElse(-1); }
int nesting(GenerationStatus status) { return status.valueOf(NESTING_KEY).orElse(0); }
void branchPop(GenerationStatus status) { String[] current = status.valueOf(BRANCH_KEY).orElse(new String[0]); String[] next = Arrays.copyOf(current, current.length - 1); status.setValue(BRANCH_KEY, next); }
void branchPush(GenerationStatus status, String value) { String[] current = status.valueOf(BRANCH_KEY).orElse(new String[0]); String[] next = ObjectArrays.concat(current, value); status.setValue(BRANCH_KEY, next); }
String branch(GenerationStatus status) { return Joiner.on("_").join(status.valueOf(BRANCH_KEY).orElse(new String[0])); }
@Override public RedBlackBSTNode<Integer,Integer> generate(SourceOfRandomness r, GenerationStatus status){ Optional<Integer> treesizeOpt = status.valueOf(SUBTREE_SIZE); if (!treesizeOpt.isPresent()) return null; Integer treesize = treesizeOpt.get(); if (treesize == 0 ){ return null; } treesize = treesize -1; int leftSize = r.nextInt(0, treesize); int rightSize = treesize - leftSize; //System.out.println("leftSize: " + leftSize + ", rightSize: " + rightSize); RedBlackBSTNode<Integer,Integer> retNode = new RedBlackBSTNode<>(r.nextInt(), r.nextInt(), r.nextBoolean(), treesize + 1); // System.out.println(retNode.key); retNode.left= generate(r, status.setValue(SUBTREE_SIZE, leftSize)); retNode.right = generate(r, status.setValue(SUBTREE_SIZE, rightSize)); return retNode; } }