File: InternalUtilities\LittleEndianReader.cs
Web Access
Project: src\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using Roslyn.Utilities;
using static System.Buffers.Binary.BinaryPrimitives;
 
namespace Microsoft.CodeAnalysis
{
    /// <summary>
    /// A Span-compatible version of <see cref="System.IO.BinaryReader"/>.
    /// </summary>
    internal ref struct LittleEndianReader
    {
        private ReadOnlySpan<byte> _span;
 
        public LittleEndianReader(ReadOnlySpan<byte> span)
        {
            _span = span;
        }
 
        internal uint ReadUInt32()
        {
            var result = ReadUInt32LittleEndian(_span);
            _span = _span.Slice(sizeof(uint));
            return result;
        }
 
        internal byte ReadByte()
        {
            var result = _span[0];
            _span = _span.Slice(sizeof(byte));
            return result;
        }
 
        internal ushort ReadUInt16()
        {
            var result = ReadUInt16LittleEndian(_span);
            _span = _span.Slice(sizeof(ushort));
            return result;
        }
 
        internal ReadOnlySpan<byte> ReadBytes(int byteCount)
        {
            var result = _span.Slice(0, byteCount);
            _span = _span.Slice(byteCount);
            return result;
        }
 
        internal int ReadInt32()
        {
            var result = ReadInt32LittleEndian(_span);
            _span = _span.Slice(sizeof(int));
            return result;
        }
 
        internal byte[] ReadReversed(int byteCount)
        {
            var result = ReadBytes(byteCount).ToArray();
            result.ReverseContents();
            return result;
        }
    }
}