protected void SetPointer() { long skip = currPos; if (skip < pos) { curr = first; offs = 0; pos = 0; } else { skip -= pos; } while (skip > 0) { if (offs == curr.body.Length) { if (curr.next == null) { curr.Modify(); curr = curr.next = new BlobImpl(curr.body.Length); } else { curr = curr.next; curr.Load(); } offs = 0; } int n = skip > curr.body.Length - offs ? curr.body.Length - offs : (int)skip; pos += n; skip -= n; offs += n; } }
public override void SetLength(long length) { BlobImpl blob = first; size = 0; if (length > 0) { while (length > blob.body.Length) { size += blob.body.Length; if (blob.next == null) { blob.Modify(); blob = blob.next = new BlobImpl(blob.body.Length); } else { blob = blob.next; blob.Load(); } } size += length; } if (pos > size) { pos = size; curr = blob; } if (blob.next != null) { BlobImpl.DeallocateAll(blob.next); blob.Modify(); blob.next = null; } first.Modify(); first.size = size; }