public void Remove(IPersistent obj) { if (root == null) { throw new StorageError(StorageError.ErrorCode.KEY_NOT_FOUND); } TtreePage newRoot = root; if (root.remove(comparator, obj, ref newRoot) == TtreePage.NOT_FOUND) { throw new StorageError(StorageError.ErrorCode.KEY_NOT_FOUND); } Modify(); root = newRoot; nMembers -= 1; }
internal int remove(PersistentComparator comparator, object mbr, ref TtreePage pgRef) { TtreePage pg, next, prev; #endif Load(); int n = nItems; int diff = comparator.CompareMembers(mbr, loadItem(0)); if (diff <= 0) { if (left != null) { Modify(); pg = pgRef; pgRef = left; int h = left.remove(comparator, mbr, ref pgRef); left = pgRef; pgRef = pg; if (h == UNDERFLOW) { return(balanceLeftBranch(ref pgRef)); } else if (h == OK) { return(OK); } } } diff = comparator.CompareMembers(mbr, loadItem(n - 1)); if (diff <= 0) { for (int i = 0; i < n; i++) { if (item[i] == mbr) { if (n == 1) { if (right == null) { Deallocate(); pgRef = left; return(UNDERFLOW); } else if (left == null) { Deallocate(); pgRef = right; return(UNDERFLOW); } } Modify(); if (n <= minItems) { if (left != null && balance <= 0) { prev = left; prev.Load(); while (prev.right != null) { prev = prev.right; prev.Load(); } Array.Copy(item, 0, item, 1, i); //while (--i >= 0) //{ // item[i+1] = item[i]; //} item[0] = prev.item[prev.nItems - 1]; pg = pgRef; pgRef = left; int h = left.remove(comparator, loadItem(0), ref pgRef); left = pgRef; pgRef = pg; if (h == UNDERFLOW) { h = balanceLeftBranch(ref pgRef); } return(h); } else if (right != null) { next = right; next.Load(); while (next.left != null) { next = next.left; next.Load(); } Array.Copy(item, i + 1, item, i, n - i - 1); //while (++i < n) //{ // item[i-1] = item[i]; //} item[n - 1] = next.item[0]; pg = pgRef; pgRef = right; int h = right.remove(comparator, loadItem(n - 1), ref pgRef); right = pgRef; pgRef = pg; if (h == UNDERFLOW) { h = balanceRightBranch(ref pgRef); } return(h); } } Array.Copy(item, i + 1, item, i, n - i - 1); //while (++i < n) //{ // item[i-1] = item[i]; //} item[n - 1] = null; nItems -= 1; return(OK); } } } if (right != null) { Modify(); pg = pgRef; pgRef = right; int h = right.remove(comparator, mbr, ref pgRef); right = pgRef; pgRef = pg; if (h == UNDERFLOW) { return(balanceRightBranch(ref pgRef)); } else { return(h); } } return(NOT_FOUND); }