using System; using System.Diagnostics; using System.Runtime.InteropServices; using MessagePack; namespace Microsoft.AspNetCore.SignalR.Redis.Internal { internal static class MsgPackUtil { public static int ReadArrayHeader(ref ReadOnlyMemory data) { var arr = GetArray(data); var val = MessagePackBinary.ReadArrayHeader(arr.Array, arr.Offset, out var readSize); data = data.Slice(readSize); return val; } public static int ReadMapHeader(ref ReadOnlyMemory data) { var arr = GetArray(data); var val = MessagePackBinary.ReadMapHeader(arr.Array, arr.Offset, out var readSize); data = data.Slice(readSize); return val; } public static string ReadString(ref ReadOnlyMemory data) { var arr = GetArray(data); var val = MessagePackBinary.ReadString(arr.Array, arr.Offset, out var readSize); data = data.Slice(readSize); return val; } public static byte[] ReadBytes(ref ReadOnlyMemory data) { var arr = GetArray(data); var val = MessagePackBinary.ReadBytes(arr.Array, arr.Offset, out var readSize); data = data.Slice(readSize); return val; } public static int ReadInt32(ref ReadOnlyMemory data) { var arr = GetArray(data); var val = MessagePackBinary.ReadInt32(arr.Array, arr.Offset, out var readSize); data = data.Slice(readSize); return val; } public static byte ReadByte(ref ReadOnlyMemory data) { var arr = GetArray(data); var val = MessagePackBinary.ReadByte(arr.Array, arr.Offset, out var readSize); data = data.Slice(readSize); return val; } private static ArraySegment GetArray(ReadOnlyMemory data) { var isArray = MemoryMarshal.TryGetArray(data, out var array); Debug.Assert(isArray); return array; } } }