コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
 /// <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);
 }
コード例 #4
0
 /// <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);
 }
コード例 #5
0
ファイル: BufferWriter.cs プロジェクト: hongelv/WebApiClient
        /// <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();
            }
        }
コード例 #6
0
ファイル: ArrayPool.cs プロジェクト: hongelv/WebApiClient
 /// <summary>
 /// 调试视图
 /// </summary>
 /// <param name="owner"></param>
 public ArrayOwnerDebugView(IArrayOwner <T> owner)
 {
     this.Items = owner.Array.AsSpan(0, owner.Count).ToArray();
 }