コード例 #1
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)
            {
                return(new SingleChunkBuffer(chunks[0], 0, isReadOnly: false));
            }
            else
            {
                return(new MultiChunkBuffer(chunks, 0, isReadOnly: false));
            }
        }
コード例 #2
0
        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");
        }
コード例 #3
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 };
        }
コード例 #4
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
            };
        }
コード例 #5
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);
            }
        }
コード例 #6
0
        // 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;
        }
コード例 #7
0
        // 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;
        }