internal void Put(Node newNode) { var dataSize = DataSize; Length++; if (Root == null) { Root = newNode; return; } var node = Root; var stack = new Node[HeightLimit]; var top = 0; int dir; // Find a spot and save the stack. for (; ;) { stack[top++] = node; dir = UnsafeMemory.Compare(node.Data, newNode.Data, dataSize) < 0 ? 1 : 0; var link = node.Link[dir]; if (link == null) { break; } node = link; } // Link and rebalance. node.Link[dir] = newNode; while (top > 0) { // Which child? node = stack[--top]; if (top != 0) { dir = stack[top - 1].Link[1] == node ? 1 : 0; } node = SkewNode(node); node = SplitNode(node); // Fix the parent. if (top != 0) { stack[top - 1].Link[dir] = node; } else { Root = node; } } }
internal Node Get(Pointer data) { var node = Root; var dataSize = DataSize; while (node != null) { var c = UnsafeMemory.Compare(node.Data, data, dataSize); if (c == 0) { return(node); } node = node.Link[c < 0 ? 1 : 0]; } return(null); }