📄 altbtree.cs
字号:
else
{
// merge page b to a
memcpy(a, bn, a, 0, an);
memcpy(a, 0, b, 0, bn);
if (height != 1)
{
memcpyData(a, bn - 1, this, r - 1, 1);
}
b.Deallocate();
items[r - 1] = a;
items[nItems] = null;
a.nItems += bn;
nItems -= 1;
return nItems < (items.Size() >> 1) ? OperationResult.Underflow : OperationResult.Done;
}
}
}
internal virtual OperationResult remove(BtreeKey rem, int height)
{
int i, n = nItems, l = 0, r = n;
while (l < r)
{
i = (l + r) >> 1;
if (compare(rem.key, i) > 0)
{
l = i + 1;
}
else
{
r = i;
}
}
if (--height == 0)
{
IPersistent node = rem.node;
while (r < n)
{
if (compare(rem.key, r) == 0)
{
if (node == null || items.ContainsElement(r, node))
{
rem.oldNode = items[r];
Modify();
memcpy(this, r, this, r + 1, n - r - 1);
nItems = --n;
memset(n, 1);
return n < (items.Size() >> 1) ? OperationResult.Underflow : OperationResult.Done;
}
}
else
{
break;
}
r += 1;
}
return OperationResult.NotFound;
}
do
{
switch (((BtreePage) items[r]).remove(rem, height))
{
case OperationResult.Underflow:
return handlePageUnderflow(r, rem, height);
case OperationResult.Done:
return OperationResult.Done;
}
}
while (++r <= n);
return OperationResult.NotFound;
}
internal virtual void purge(int height)
{
if (--height != 0)
{
int n = nItems;
do
{
((BtreePage) items[n]).purge(height);
}
while (--n >= 0);
}
Deallocate();
}
internal virtual int traverseForward(int height, IPersistent[] result, int pos)
{
int i, n = nItems;
if (--height != 0)
{
for (i = 0; i <= n; i++)
{
pos = ((BtreePage) items[i]).traverseForward(height, result, pos);
}
}
else
{
for (i = 0; i < n; i++)
{
result[pos++] = items[i];
}
}
return pos;
}
internal BtreePage(Storage s, int n) : base(s)
{
items = s.CreateLink(n);
items.Length = n;
}
internal BtreePage()
{
}
}
class BtreePageOfByte:BtreePage
{
override internal Array Data
{
get
{
return data;
}
}
protected byte[] data;
const int MAX_ITEMS = BTREE_PAGE_SIZE / (4 + 1);
internal override object getKeyValue(int i)
{
return data[i];
}
internal override Key getKey(int i)
{
return new Key(data[i]);
}
internal override BtreePage clonePage()
{
return new BtreePageOfByte(Storage);
}
internal override int compare(Key key, int i)
{
return (byte) key.ival - data[i];
}
internal override void insert(BtreeKey key, int i)
{
items[i] = key.node;
data[i] = (byte) key.key.ival;
}
internal BtreePageOfByte(Storage s):base(s, MAX_ITEMS)
{
data = new byte[MAX_ITEMS];
}
internal BtreePageOfByte()
{
}
}
class BtreePageOfSByte:BtreePage
{
override internal Array Data
{
get
{
return data;
}
}
sbyte[] data;
const int MAX_ITEMS = BTREE_PAGE_SIZE / (4 + 1);
internal override object getKeyValue(int i)
{
return data[i];
}
internal override Key getKey(int i)
{
return new Key(data[i]);
}
internal override BtreePage clonePage()
{
return new BtreePageOfSByte(Storage);
}
internal override int compare(Key key, int i)
{
return (sbyte) key.ival - data[i];
}
internal override void insert(BtreeKey key, int i)
{
items[i] = key.node;
data[i] = (sbyte) key.key.ival;
}
internal BtreePageOfSByte(Storage s):base(s, MAX_ITEMS)
{
data = new sbyte[MAX_ITEMS];
}
internal BtreePageOfSByte()
{
}
}
class BtreePageOfBoolean:BtreePageOfByte
{
internal override Key getKey(int i)
{
return new Key(data[i] != 0);
}
internal override object getKeyValue(int i)
{
return data[i] != 0;
}
internal override BtreePage clonePage()
{
return new BtreePageOfBoolean(Storage);
}
internal BtreePageOfBoolean()
{
}
internal BtreePageOfBoolean(Storage s):base(s)
{
}
}
class BtreePageOfShort:BtreePage
{
override internal Array Data
{
get
{
return data;
}
}
internal short[] data;
const int MAX_ITEMS = BTREE_PAGE_SIZE / (4 + 2);
internal override Key getKey(int i)
{
return new Key(data[i]);
}
internal override object getKeyValue(int i)
{
return data[i];
}
internal override BtreePage clonePage()
{
return new BtreePageOfShort(Storage);
}
internal override int compare(Key key, int i)
{
return (short) key.ival - data[i];
}
internal override void insert(BtreeKey key, int i)
{
items[i] = key.node;
data[i] = (short) key.key.ival;
}
internal BtreePageOfShort(Storage s):base(s, MAX_ITEMS)
{
data = new short[MAX_ITEMS];
}
internal BtreePageOfShort()
{
}
}
class BtreePageOfUShort:BtreePage
{
override internal Array Data
{
get
{
return data;
}
}
internal ushort[] data;
const int MAX_ITEMS = BTREE_PAGE_SIZE / (4 + 2);
internal override Key getKey(int i)
{
return new Key(data[i]);
}
internal override object getKeyValue(int i)
{
return data[i];
}
internal override BtreePage clonePage()
{
return new BtreePageOfUShort(Storage);
}
internal override int compare(Key key, int i)
{
return (ushort) key.ival - data[i];
}
internal override void insert(BtreeKey key, int i)
{
items[i] = key.node;
data[i] = (ushort) key.key.ival;
}
internal BtreePageOfUShort(Storage s):base(s, MAX_ITEMS)
{
data = new ushort[MAX_ITEMS];
}
internal BtreePageOfUShort()
{
}
}
class BtreePageOfInt:BtreePage
{
override internal Array Data
{
get
{
return data;
}
}
internal int[] data;
const int MAX_ITEMS = BTREE_PAGE_SIZE / (4 + 4);
internal override Key getKey(int i)
{
return new Key(data[i]);
}
internal override object getKeyValue(int i)
{
return data[i];
}
internal override BtreePage clonePage()
{
return new BtreePageOfInt(Storage);
}
internal override int compare(Key key, int i)
{
return key.ival - data[i];
}
internal override void insert(BtreeKey key, int i)
{
items[i] = key.node;
data[i] = key.key.ival;
}
internal BtreePageOfInt(Storage s):base(s, MAX_ITEMS)
{
data = new int[MAX_ITEMS];
}
internal BtreePageOfInt()
{
}
}
class BtreePageOfUInt:BtreePage
{
override internal Array Data
{
get
{
return data;
}
}
internal uint[] data;
const int MAX_ITEMS = BTREE_PAGE_SIZE / (4 + 4);
internal override Key getKey(int i)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -