protected internal override ReadOnlySequence <byte> _GetSequence(int index, int count)
        {
            if (0u >= (uint)count)
            {
                return(ReadOnlySequence <byte> .Empty);
            }

            var c = FindComponent(index);

            if (c == FindComponent(index + count - 1))
            {
                return(c.GetSequence(index - c.Offset, count));
            }
            var array = ThreadLocalList <ReadOnlyMemory <byte> > .NewInstance(_nioBufferCount);

            try
            {
                int i          = c.Index;
                int adjustment = c.Offset;
                var s          = c.Buf;
                for (; ;)
                {
                    int localLength = Math.Min(count, s.ReadableBytes - (index - adjustment));
                    switch (s.IoBufferCount)
                    {
                    case 0:
                        ThrowHelper.ThrowNotSupportedException();
                        break;

                    case 1:
                        array.Add(s.GetReadableMemory(index - adjustment, localLength));
                        break;

                    default:
                        var sequence = s.GetSequence(index - adjustment, localLength);
                        foreach (var memory in sequence)
                        {
                            array.Add(memory);
                        }
                        break;
                    }

                    index      += localLength;
                    count      -= localLength;
                    adjustment += s.ReadableBytes;
                    if ((uint)(count - 1) > SharedConstants.TooBigOrNegative) // count <= 0
                    {
                        break;
                    }
                    s = Buffer(++i);
                }

                return(ReadOnlyBufferSegment.Create(array));
            }
            finally
            {
                array.Return();
            }
        }
        protected internal override ReadOnlySequence <byte> _GetSequence(int index, int count)
        {
            if (0u >= (uint)count)
            {
                return(ReadOnlySequence <byte> .Empty);
            }

            var buffers = ThreadLocalList <ReadOnlyMemory <byte> > .NewInstance(_componentCount);

            try
            {
                int i = ToComponentIndex0(index);
                while (count > 0)
                {
                    ComponentEntry c           = _components[i];
                    IByteBuffer    s           = c.Buffer;
                    int            localLength = Math.Min(count, c.EndOffset - index);
                    switch (s.IoBufferCount)
                    {
                    case 0:
                        ThrowHelper.ThrowNotSupportedException();
                        break;

                    case 1:
                        if (s.IsSingleIoBuffer)
                        {
                            buffers.Add(s.GetReadableMemory(c.Idx(index), localLength));
                        }
                        else
                        {
                            var sequence0 = s.GetSequence(c.Idx(index), localLength);
                            foreach (var memory in sequence0)
                            {
                                buffers.Add(memory);
                            }
                        }
                        break;

                    default:
                        var sequence = s.GetSequence(c.Idx(index), localLength);
                        foreach (var memory in sequence)
                        {
                            buffers.Add(memory);
                        }
                        break;
                    }

                    index += localLength;
                    count -= localLength;
                    i++;
                }

                return(ReadOnlyBufferSegment.Create(buffers));
            }
            finally
            {
                buffers.Return();
            }
        }
示例#3
0
        private static ReadOnlySequence <byte> CreateReadOnlySequence(params byte[][] buffers)
        {
            if (buffers.Length == 1)
            {
                return(new ReadOnlySequence <byte>(buffers[0]));
            }
            var list = new List <Memory <byte> >();

            foreach (var buffer in buffers)
            {
                list.Add(buffer);
            }
            return(ReadOnlyBufferSegment.Create(list.ToArray()));
        }
 public static ReadOnlySequence <byte> ToReadOnlySequence(this IEnumerable <Memory <byte> > buffers) => ReadOnlyBufferSegment.Create(buffers);
示例#5
0
 public static ReadOnlySequence <byte> Create(IEnumerable <Memory <byte> > buffers)
 {
     return(ReadOnlyBufferSegment.Create(buffers));
 }