예제 #1
0
        public override bool Remove(V obj)
        {
            if (root == null)
            {
                return(false); // TODO: shouldn't that be an exception too?
            }
            TtreePage <K, V> newRoot = root;

            if (root.remove(comparator, obj, ref newRoot) == TtreePage <K, V> .NOT_FOUND)
            {
                throw new DatabaseException(DatabaseException.ErrorCode.KEY_NOT_FOUND);
            }
            Modify();
            root      = newRoot;
            nMembers -= 1;
            return(true);
        }
예제 #2
0
        internal int remove(PersistentComparator <K, V> comparator, V mbr, ref TtreePage <K, V> pgRef)
        {
            TtreePage <K, V> pg, next, prev;

            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);
        }