final SkipListNode nextNode = head.getSkipNode(level); if (nextNode != null) { ChildrenDiff combined = combineDiff(newNode, nextNode, level); newNode.setSkipTo(nodePath[level].getSkipNode(level), level); nodePath[level].setSkipTo(newNode, level);
ChildrenDiff childrenDiff = null; for (int level = current.level(); level >= 0; level--) { next = current.getSkipNode(level); if (next != null && next.getDiff().compareTo(toSnapshotId) <= 0) { childrenDiff = current.getChildrenDiff(level);
final SkipListNode next = node.getSkipNode(level); if (level == 0) { if (next != null) { final ChildrenDiff combined; if (previous == nodePath[level - 1] && next == node.getSkipNode(level - 1)) { combined = nodePath[level - 1].getChildrenDiff(level - 1); previous.setSkipDiff4Target(next, level + 1, combined); } else if (next == previous.getSkipNode(level + 1)) { combined = previous.getChildrenDiff(level + 1); } else {
private static ChildrenDiff combineDiff(SkipListNode from, SkipListNode to, int level) { ChildrenDiff combined = null; ChildrenDiff first = null; SkipListNode cur = from; for (int i = level - 1; i >= 0; i--) { while (cur != to) { final SkipListNode next = cur.getSkipNode(i); if (next == null) { break; } if (first == null) { first = cur.getChildrenDiff(i); } else { if (combined == null) { combined = new ChildrenDiff(); combined.combinePosterior(first, null); } combined.combinePosterior(cur.getChildrenDiff(i), null); } cur = next; } } return combined != null? combined: first; }
private SkipListNode[] findPreviousNodes(SkipListNode node, int nodeLevel) { final SkipListNode[] nodePath = new SkipListNode[nodeLevel + 1]; SkipListNode cur = head; final int headLevel = head.level(); for (int level = headLevel < nodeLevel ? headLevel : nodeLevel; level >= 0; level--) { while (cur.getSkipNode(level) != node) { cur = cur.getSkipNode(level); } nodePath[level] = cur; } for (int level = headLevel + 1; level <= nodeLevel; level++) { nodePath[level] = head; } return nodePath; }
void setSkipDiff4Target( SkipListNode target, int startLevel, ChildrenDiff childrenDiff) { for(int i = startLevel; i <= level(); i++) { if (getSkipNode(i) != target) { return; } setSkipDiff(childrenDiff, i); } }