private void CheckAndResizeBuffer(int sizeHint) { if (sizeHint < 0) { throw new ArgumentOutOfRangeException(nameof(sizeHint)); } if (sizeHint == 0) { sizeHint = defaultSizeHint; } var freeCapacity = this.Capacity - this.WrittenCount; if (sizeHint > freeCapacity) { var growBy = Math.Max(sizeHint, this.Capacity); var newSize = checked (this.Capacity + growBy); var newOwer = ArrayPool.Rent <T>(newSize); this.GetWrittenSpan().CopyTo(newOwer.Array); this.byteArrayOwner.Dispose(); this.byteArrayOwner = newOwer; } }
private void CheckAndResizeBuffer(int sizeHint) { if (sizeHint < 0) { throw new ArgumentOutOfRangeException(nameof(sizeHint)); } if (sizeHint == 0) { sizeHint = defaultSizeHint; } if (sizeHint > this.FreeCapacity) { int currentLength = this.buffer.Array.Length; var growBy = Math.Max(sizeHint, currentLength); var newSize = checked (currentLength + growBy); var newBuffer = ArrayPool.Rent <T>(newSize); Array.Copy(this.buffer.Array, newBuffer.Array, this.index); this.buffer.Dispose(); this.buffer = newBuffer; } }
/// <summary> /// 字节缓冲区写入对象 /// </summary> /// <param name="initialCapacity">初始容量</param> /// <exception cref="ArgumentOutOfRangeException"></exception> public BufferWriter(int initialCapacity = 1024) { if (initialCapacity <= 0) { throw new ArgumentOutOfRangeException(nameof(initialCapacity)); } this.byteArrayOwner = ArrayPool.Rent <T>(initialCapacity); }
/// <summary> /// 可回收的自动扩容BufferWriter /// </summary> /// <param name="initialCapacity">初始容量</param> /// <exception cref="ArgumentOutOfRangeException"></exception> public RecyclableBufferWriter(int initialCapacity) { if (initialCapacity <= 0) { throw new ArgumentOutOfRangeException(nameof(initialCapacity)); } this.buffer = ArrayPool.Rent <T>(initialCapacity); }
/// <summary> /// 检测和扩容 /// </summary> /// <param name="sizeHint"></param> /// <exception cref="ArgumentOutOfRangeException"></exception> private void CheckAndResizeBuffer(int sizeHint) { if (sizeHint <= 0) { throw new ArgumentOutOfRangeException(nameof(sizeHint)); } if (sizeHint == 0) { sizeHint = MinimumBufferSize; } if (sizeHint > this.FreeCapacity) { var growBy = Math.Max(sizeHint, this.Capacity); var newSize = checked (this.Capacity + growBy); var oldByteArrayOwner = this.byteArrayOwner; this.byteArrayOwner = ArrayPool.Rent <T>(newSize); oldByteArrayOwner.Array.AsSpan(0, this.WrittenCount).CopyTo(this.byteArrayOwner.Array); oldByteArrayOwner.Dispose(); } }
/// <summary> /// 调试视图 /// </summary> /// <param name="owner"></param> public ArrayOwnerDebugView(IArrayOwner <T> owner) { this.Items = owner.Array.AsSpan(0, owner.Count).ToArray(); }