/// <summary>ルート要素の再設定。</summary> private void RelinkRoot() { if (this.root.Count <= 1) { var parts = this.root.FirstParts; if (parts is BBranch) { this.root = (BBranch)parts; } else { this.root = null; this.start = (BLeaf)parts; } } }
/// <summary>要素を追加する(内部処理)</summary> /// <param name="item">追加する要素。</param> /// <param name="manage">処理状態結果。</param> private void LocalAdd(T item, ref ManageResult manage) { if (this.root == null) { if (this.start.Add(item, this, ref manage)) { this.root = new BBranch(this.bracketSize, this.start, manage.newParts); } } else { if (this.root.Add(item, this, ref manage)) { this.root = new BBranch(this.bracketSize, this.root, manage.newParts); } } }
/// <summary>枝要素の分割を行う。</summary> /// <param name="element">追加する要素。</param> /// <param name="idx">追加位置。</param> /// <param name="parent">木構造。</param> /// <param name="manage">処理結果。</param> private void Split(IBParts element, int idx, BPlusTree <T> parent, ref ManageResult manage) { var tmpNext = new BBranch(parent.bracketSize); if (idx < parent.mSize + 1) { // 後半部分はコピー tmpNext.Count = parent.mSize + 1; Array.Copy(this.value, parent.mSize, tmpNext.value, 0, parent.mSize + 1); // 前半部は挿入 #if DEBUG Array.Clear(this.value, parent.mSize, this.value.Length - parent.mSize); #endif this.Count = parent.mSize + 1; if (parent.mSize + 1 > idx) { Array.Copy(this.value, idx, this.value, idx + 1, (parent.mSize + 1) - idx); } this.value[idx] = element; } else { // 後半部分に挿入 int ptr = idx - (parent.mSize + 1); tmpNext.Count = parent.mSize + 1; if (ptr > 0) { Array.Copy(this.value, parent.mSize + 1, tmpNext.value, 0, ptr); } Array.Copy(this.value, idx, tmpNext.value, ptr + 1, parent.bracketSize - idx); tmpNext.value[ptr] = element; // 前半部分は変更なし #if DEBUG Array.Clear(this.value, parent.mSize + 1, this.value.Length - (parent.mSize + 1)); #endif this.Count = parent.mSize + 1; } // 検索キー参照変更 tmpNext.headerLeaf = tmpNext.TraverseLeaf; // 新しく生成した要素を返す manage.newParts = tmpNext; }
/// <summary>リストから全ての項目を削除します。</summary> public void Clear() { this.root = null; this.start = new BLeaf(this.bracketSize); }