/// <summary> /// Creates a buffer of the specified length. Depending on the length, either a SingleChunkBuffer or a MultiChunkBuffer will be created. /// </summary> /// <param name="chunkSource">The chunk pool.</param> /// <param name="minimumCapacity">The minimum capacity.</param> /// <returns>A buffer with at least the minimum capacity.</returns> public static IByteBuffer Create(IBsonChunkSource chunkSource, int minimumCapacity) { if (chunkSource == null) { throw new ArgumentNullException("chunkSource"); } if (minimumCapacity <= 0) { throw new ArgumentOutOfRangeException("minimumCapacity"); } var capacity = 0; var chunks = new List <IBsonChunk>(); while (capacity < minimumCapacity) { var chunk = chunkSource.GetChunk(minimumCapacity - capacity); chunks.Add(chunk); capacity += chunk.Bytes.Count; } if (chunks.Count == 1) { return(new SingleChunkBuffer(chunks[0], 0, isReadOnly: false)); } else { return(new MultiChunkBuffer(chunks, 0, isReadOnly: false)); } }
public void constructor_with_chunkSource_should_throw_when_chunkSource_is_null() { IBsonChunkSource chunkSource = null; Action action = () => new MultiChunkBuffer(chunkSource); action.ShouldThrow <ArgumentNullException>().And.ParamName.Should().Be("chunkSource"); }
// constructors /// <summary> /// Initializes a new instance of the <see cref="MultiChunkBuffer"/> class. /// </summary> /// <param name="chunkSource">The chunk pool.</param> /// <exception cref="System.ArgumentNullException">chunkPool</exception> public MultiChunkBuffer(IBsonChunkSource chunkSource) { if (chunkSource == null) { throw new ArgumentNullException("chunkSource"); } _chunks = new List<IBsonChunk>(); _chunkSource = chunkSource; _length = 0; _positions = new List<int> { 0 }; }
// constructors /// <summary> /// Initializes a new instance of the <see cref="MultiChunkBuffer"/> class. /// </summary> /// <param name="chunkSource">The chunk pool.</param> /// <exception cref="System.ArgumentNullException">chunkPool</exception> public MultiChunkBuffer(IBsonChunkSource chunkSource) { if (chunkSource == null) { throw new ArgumentNullException("chunkSource"); } _chunks = new List <IBsonChunk>(); _chunkSource = chunkSource; _length = 0; _positions = new List <int> { 0 }; }
/// <summary> /// Creates a buffer of the specified length. Depending on the length, either a SingleChunkBuffer or a MultiChunkBuffer will be created. /// </summary> /// <param name="chunkSource">The chunk pool.</param> /// <param name="minimumCapacity">The minimum capacity.</param> /// <returns>A buffer with at least the minimum capacity.</returns> public static IByteBuffer Create(IBsonChunkSource chunkSource, int minimumCapacity) { if (chunkSource == null) { throw new ArgumentNullException("chunkSource"); } if (minimumCapacity <= 0) { throw new ArgumentOutOfRangeException("minimumCapacity"); } var capacity = 0; var chunks = new List<IBsonChunk>(); while (capacity < minimumCapacity) { var chunk = chunkSource.GetChunk(minimumCapacity - capacity); chunks.Add(chunk); capacity += chunk.Bytes.Count; } if (chunks.Count == 1) { var chunk = chunks[0]; ByteArrayChunk byteArrayChunk; if ((byteArrayChunk = chunk as ByteArrayChunk) != null) { var segment = byteArrayChunk.Bytes; if (segment.Offset == 0) { return new ByteArrayBuffer(segment.Array, segment.Count, isReadOnly: false); } } return new SingleChunkBuffer(chunk, 0, isReadOnly: false); } else { return new MultiChunkBuffer(chunks, 0, isReadOnly: false); } }
// constructors /// <summary> /// Initializes a new instance of the <see cref="OutputBufferChunkSource"/> class. /// </summary> /// <param name="baseSource">The chunk source.</param> /// <param name="initialUnpooledChunkSize">The size of the initial unpooled chunk.</param> /// <param name="minChunkSize">The minimum size of a chunk.</param> /// <param name="maxChunkSize">The maximum size of a chunk.</param> public OutputBufferChunkSource( IBsonChunkSource baseSource, int initialUnpooledChunkSize = DefaultInitialUnpooledChunkSize, int minChunkSize = DefaultMinChunkSize, int maxChunkSize = DefaultMaxChunkSize) { if (baseSource == null) { throw new ArgumentNullException("baseSource"); } if (initialUnpooledChunkSize < 0) { throw new ArgumentOutOfRangeException("initialUnpooledChunkSize"); } if (minChunkSize <= 0) { throw new ArgumentOutOfRangeException("minChunkSize"); } if (maxChunkSize <= 0) { throw new ArgumentOutOfRangeException("maxChunkSize"); } if (!PowerOf2.IsPowerOf2(minChunkSize)) { throw new ArgumentException("minChunkSize is not a power of 2.", "minChunkSize"); } if (!PowerOf2.IsPowerOf2(maxChunkSize)) { throw new ArgumentException("maxChunkSize is not a power of 2.", "maxChunkSize"); } if (maxChunkSize < minChunkSize) { throw new ArgumentException("maxChunkSize is less than minChunkSize", "maxChunkSize"); } _baseSource = baseSource; _initialUnpooledChunkSize = initialUnpooledChunkSize; _minChunkSize = minChunkSize; _maxChunkSize = maxChunkSize; }
// constructors /// <summary> /// Initializes a new instance of the <see cref="InputBufferChunkSource"/> class. /// </summary> /// <param name="baseSource">The chunk source.</param> /// <param name="maxUnpooledChunkSize">The maximum size of an unpooled chunk.</param> /// <param name="minChunkSize">The minimum size of a chunk.</param> /// <param name="maxChunkSize">The maximum size of a chunk.</param> public InputBufferChunkSource( IBsonChunkSource baseSource, int maxUnpooledChunkSize = DefaultMaxUnpooledChunkSize, int minChunkSize = DefaultMinChunkSize, int maxChunkSize = DefaultMaxChunkSize) { if (baseSource == null) { throw new ArgumentNullException("baseSource"); } if (maxUnpooledChunkSize < 0) { throw new ArgumentOutOfRangeException("maxUnpooledChunkSize"); } if (minChunkSize <= 0) { throw new ArgumentOutOfRangeException("minChunkSize"); } if (maxChunkSize <= 0) { throw new ArgumentOutOfRangeException("maxChunkSize"); } if (!PowerOf2.IsPowerOf2(minChunkSize)) { throw new ArgumentException("minChunkSize is not a power of 2.", "minChunkSize"); } if (!PowerOf2.IsPowerOf2(maxChunkSize)) { throw new ArgumentException("maxChunkSize is not a power of 2.", "maxChunkSize"); } if (maxChunkSize < minChunkSize) { throw new ArgumentException("maxChunkSize is less than minChunkSize", "maxChunkSize"); } _baseSource = baseSource; _maxUnpooledChunkSize = maxUnpooledChunkSize; _minChunkSize = minChunkSize; _maxChunkSize = maxChunkSize; }