protected override long GetWritePositionLocked(OperationHint hint, int length) { var contentHint = hint as OptimizedOperation ?? throw new ArgumentException(nameof(hint)); var retv = -1L; lock (_blocksLockObject) { if (!TryGetAvailableBlock(length, out var block)) { retv = CurrentPosition; } else { contentHint.IsExistingBlockUsed = true; retv = block.Position; if (block.Length <= length) { return(retv); } var generatedBlock = new DriveBlock { Length = block.Length - length, Position = block.Position + length }; AddAvailableBlock(generatedBlock); contentHint.GeneratedAvailableBlock = generatedBlock; } } return(retv); }
protected override void SetCurrentPositionLocked(OperationHint hint, int writtenBytesCount) { var contentHint = hint as OptimizedOperation ?? throw new ArgumentException(nameof(hint)); if (contentHint.IsExistingBlockUsed) { return; } CurrentPosition += writtenBytesCount; }
protected override WriteOperation MakeOperation(OperationHint hint, byte[] bytes, long position) { return(new FileTableOperation(drive => drive.Write(position, bytes), position)); }
protected abstract WriteOperation MakeOperation(OperationHint hint, byte[] bytes, long position);
protected virtual void SetCurrentPositionLocked(OperationHint hint, int writtenBytesCount) { CurrentPosition += writtenBytesCount; }
protected virtual long GetWritePositionLocked(OperationHint hint, int length) { return(CurrentPosition); }