/// <exception cref="System.IO.IOException"></exception> internal override int EstimateSize(AnyObjectId noteOn, ObjectReader or) { // If most of this fan-out is full, estimate it should still be split. if (LeafBucket.MAX_SIZE * 3 / 4 <= cnt) { return(1 + LeafBucket.MAX_SIZE); } // Due to the uniform distribution of ObjectIds, having less nodes full // indicates a good chance the total number of children below here // is less than the MAX_SIZE split point. Get a more accurate count. MutableObjectId id = new MutableObjectId(); id.FromObjectId(noteOn); int sz = 0; for (int cell = 0; cell < 256; cell++) { NoteBucket b = table[cell]; if (b == null) { continue; } id.SetByte(prefixLen >> 1, cell); sz += b.EstimateSize(id, or); if (LeafBucket.MAX_SIZE < sz) { break; } } return(sz); }
public override bool HasNext() { if (this.itr != null && this.itr.HasNext()) { return(true); } for (; this.cell < this._enclosing.table.Length; this.cell++) { NoteBucket b = this._enclosing.table[this.cell]; if (b == null) { continue; } try { id.SetByte(this._enclosing.prefixLen >> 1, this.cell); this.itr = b.Iterator(id, reader); } catch (IOException err) { throw new RuntimeException(err); } if (this.itr.HasNext()) { this.cell++; return(true); } } return(false); }
private static bool Equals(NoteBucket a, NoteBucket b) { if (a == null && b == null) { return(true); } return(a != null && b != null && a.GetTreeId().Equals(b.GetTreeId())); }
/// <exception cref="System.IO.IOException"></exception> internal static InMemoryNoteBucket LoadIfLazy(NoteBucket b, AnyObjectId prefix, ObjectReader or) { if (b == null) { return(null); } if (b is InMemoryNoteBucket) { return((InMemoryNoteBucket)b); } return(((FanoutBucket.LazyNoteBucket)b).Load(prefix, or)); }
/// <exception cref="System.IO.IOException"></exception> private void AddIfNotNull(FanoutBucket b, int cell, NoteBucket child) { if (child == null) { return; } if (child is InMemoryNoteBucket) { b.SetBucket(cell, ((InMemoryNoteBucket)child).WriteTree(inserter)); } else { b.SetBucket(cell, child.GetTreeId()); } }
/// <exception cref="System.IO.IOException"></exception> private InMemoryNoteBucket MergeFanoutBucket(int treeDepth, FanoutBucket @base, FanoutBucket ours, FanoutBucket theirs) { FanoutBucket result = new FanoutBucket(treeDepth * 2); // walking through entries of base, ours, theirs for (int i = 0; i < 256; i++) { NoteBucket b = @base.GetBucket(i); NoteBucket o = ours.GetBucket(i); NoteBucket t = theirs.GetBucket(i); if (Equals(o, t)) { AddIfNotNull(result, i, o); } else { if (Equals(b, o)) { AddIfNotNull(result, i, t); } else { if (Equals(b, t)) { AddIfNotNull(result, i, o); } else { objectIdPrefix.SetByte(treeDepth, i); InMemoryNoteBucket mergedBucket = Merge(treeDepth + 1, FanoutBucket.LoadIfLazy(b, objectIdPrefix, reader), FanoutBucket.LoadIfLazy(o, objectIdPrefix, reader), FanoutBucket .LoadIfLazy(t, objectIdPrefix, reader)); result.SetBucket(i, mergedBucket); } } } } return(result.ContractIfTooSmall(objectIdPrefix, reader)); }
/// <exception cref="System.IO.IOException"></exception> internal override InMemoryNoteBucket Set(AnyObjectId noteOn, AnyObjectId noteData , ObjectReader or) { int cell = Cell(noteOn); NoteBucket b = table[cell]; if (b == null) { if (noteData == null) { return(this); } LeafBucket n = new LeafBucket(prefixLen + 2); table[cell] = n.Set(noteOn, noteData, or); cnt++; return(this); } else { NoteBucket n = b.Set(noteOn, noteData, or); if (n == null) { table[cell] = null; cnt--; if (cnt == 0) { return(null); } return(ContractIfTooSmall(noteOn, or)); } else { if (n != b) { table[cell] = n; } } return(this); } }
/// <exception cref="System.IO.IOException"></exception> private TreeFormatter Build(bool insert, ObjectInserter inserter) { byte[] nameBuf = new byte[2]; TreeFormatter fmt = new TreeFormatter(TreeSize()); NonNoteEntry e = nonNotes; for (int cell = 0; cell < 256; cell++) { NoteBucket b = table[cell]; if (b == null) { continue; } nameBuf[0] = hexchar[(int)(((uint)cell) >> 4)]; nameBuf[1] = hexchar[cell & unchecked ((int)(0x0f))]; while (e != null && e.PathCompare(nameBuf, 0, 2, FileMode.TREE) < 0) { e.Format(fmt); e = e.next; } ObjectId id; if (insert) { id = b.WriteTree(inserter); } else { id = b.GetTreeId(); } fmt.Append(nameBuf, 0, 2, FileMode.TREE, id); } for (; e != null; e = e.next) { e.Format(fmt); } return(fmt); }
private static bool Equals(NoteBucket a, NoteBucket b) { if (a == null && b == null) { return true; } return a != null && b != null && a.GetTreeId().Equals(b.GetTreeId()); }
/// <exception cref="System.IO.IOException"></exception> internal override Note GetNote(AnyObjectId objId, ObjectReader or) { NoteBucket b = table[Cell(objId)]; return(b != null?b.GetNote(objId, or) : null); }