private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
private static <V> Object[] merge(final Object[] left, final Object[] right, final V nodeKey) { assert BTree.getKeyEnd(left) == BTree.MINIMAL_NODE_SIZE; assert BTree.getKeyEnd(right) == BTree.MINIMAL_NODE_SIZE; final boolean leaves = BTree.isLeaf(left); final Object[] result; if (leaves) result = new Object[BTree.MINIMAL_NODE_SIZE * 2 + 1]; else result = new Object[left.length + right.length]; int offset = 0; offset = copyKeys(left, result, offset); result[offset++] = nodeKey; offset = copyKeys(right, result, offset); if (!leaves) { offset = copyChildren(left, result, offset); offset = copyChildren(right, result, offset); final int[] leftSizeMap = BTree.getSizeMap(left); final int[] rightSizeMap = BTree.getSizeMap(right); final int[] newSizeMap = new int[leftSizeMap.length + rightSizeMap.length]; offset = 0; offset = copySizeMap(leftSizeMap, newSizeMap, offset, 0); offset = copySizeMap(rightSizeMap, newSizeMap, offset, leftSizeMap[leftSizeMap.length - 1] + 1); result[result.length - 1] = newSizeMap; } return result; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }
private static Object[] copyWithKeyAndChildRemoved(final Object[] node, final int keyIndex, final int childIndex, final boolean substractSize) { final boolean leaf = BTree.isLeaf(node); final Object[] newNode; if (leaf) { final int keyEnd = BTree.getKeyEnd(node); newNode = new Object[keyEnd - ((keyEnd & 1) == 1 ? 0 : 1)]; } else { newNode = new Object[node.length - 2]; } int offset = copyKeys(node, newNode, 0, keyIndex); if (!leaf) { offset = copyChildren(node, newNode, offset, childIndex); final int[] nodeSizeMap = BTree.getSizeMap(node); final int[] newNodeSizeMap = new int[nodeSizeMap.length - 1]; int pos = 0; final int sizeToRemove = BTree.size((Object[])node[BTree.getChildStart(node) + childIndex]) + 1; for (int i = 0; i < nodeSizeMap.length; ++i) if (i != childIndex) newNodeSizeMap[pos++] = nodeSizeMap[i] - ((substractSize && i > childIndex) ? sizeToRemove : 0); newNode[offset] = newNodeSizeMap; } return newNode; }