private Object getLeafGeneral(int index) { index += offset; Object leaf = obj().getAt(array, firstDigit(index, depthShift)); for (int shift = depthShift - BRANCHING_BASE; shift > 0; shift -= BRANCHING_BASE) { leaf = obj().getAt(leaf, digit(index, shift)); } return leaf; }
private static <T> BitMappedTrie<T> collapsed(ArrayType<T> type, Object array, int offset, int length, int shift) { for (; shift > 0; shift -= BRANCHING_BASE) { final int skippedElements = obj().lengthOf(array) - 1; if (skippedElements != digit(offset, shift)) { break; } array = obj().getAt(array, skippedElements); offset -= treeSize(skippedElements, shift); } return new BitMappedTrie<>(type, array, offset, length, shift); }
private Object modifyNonLeaf(Object root, int depthShift, int index, NodeModifier node, NodeModifier leaf) { int previousIndex = firstDigit(index, depthShift); root = node.apply(root, previousIndex); Object array = root; for (int shift = depthShift - BRANCHING_BASE; shift >= BRANCHING_BASE; shift -= BRANCHING_BASE) { final int prev = previousIndex; previousIndex = digit(index, shift); array = setNewNode(node, prev, array, previousIndex); } final Object newLeaf = leaf.apply(obj().getAt(array, previousIndex), lastDigit(index)); obj().setAt(array, previousIndex, newLeaf); return root; } private Object setNewNode(NodeModifier node, int previousIndex, Object array, int offset) {
private Object getLeafGeneral(int index) { index += offset; Object leaf = obj().getAt(array, firstDigit(index, depthShift)); for (int shift = depthShift - BRANCHING_BASE; shift > 0; shift -= BRANCHING_BASE) { leaf = obj().getAt(leaf, digit(index, shift)); } return leaf; }
private static <T> BitMappedTrie<T> collapsed(ArrayType<T> type, Object array, int offset, int length, int shift) { for (; shift > 0; shift -= BRANCHING_BASE) { final int skippedElements = obj().lengthOf(array) - 1; if (skippedElements != digit(offset, shift)) { break; } array = obj().getAt(array, skippedElements); offset -= treeSize(skippedElements, shift); } return new BitMappedTrie<>(type, array, offset, length, shift); }
private Object modifyNonLeaf(Object root, int depthShift, int index, NodeModifier node, NodeModifier leaf) { int previousIndex = firstDigit(index, depthShift); root = node.apply(root, previousIndex); Object array = root; for (int shift = depthShift - BRANCHING_BASE; shift >= BRANCHING_BASE; shift -= BRANCHING_BASE) { final int prev = previousIndex; previousIndex = digit(index, shift); array = setNewNode(node, prev, array, previousIndex); } final Object newLeaf = leaf.apply(obj().getAt(array, previousIndex), lastDigit(index)); obj().setAt(array, previousIndex, newLeaf); return root; } private Object setNewNode(NodeModifier node, int previousIndex, Object array, int offset) {