in Microsoft.Azure.Cosmos/src/Json/JsonBinaryEncoding.ValueLengths.cs [185:278]
public static long GetValueLength(ReadOnlySpan<byte> buffer)
{
long length = ValueLengths.Lookup[buffer[0]];
if (length < 0)
{
// Length was negative meaning we need to look into the buffer to find the length
switch (length)
{
case L1:
length = TypeMarkerLength + OneByteLength + buffer[1];
break;
case L2:
length = TypeMarkerLength + TwoByteLength + MemoryMarshal.Read<ushort>(buffer.Slice(1));
break;
case L4:
length = TypeMarkerLength + FourByteLength + MemoryMarshal.Read<uint>(buffer.Slice(1));
break;
case LC1:
length = TypeMarkerLength + OneByteLength + OneByteCount + buffer[1];
break;
case LC2:
length = TypeMarkerLength + TwoByteLength + TwoByteCount + MemoryMarshal.Read<ushort>(buffer.Slice(1));
break;
case LC4:
length = TypeMarkerLength + FourByteLength + FourByteCount + MemoryMarshal.Read<uint>(buffer.Slice(1));
break;
case Arr1:
long arrayOneItemLength = ValueLengths.GetValueLength(buffer.Slice(1));
length = arrayOneItemLength == 0 ? 0 : 1 + arrayOneItemLength;
break;
case Obj1:
long nameLength = ValueLengths.GetValueLength(buffer.Slice(1));
if (nameLength == 0)
{
length = 0;
}
else
{
long valueLength = ValueLengths.GetValueLength(buffer.Slice(1 + (int)nameLength));
length = TypeMarkerLength + nameLength + valueLength;
}
break;
case CS4L1:
length = TypeMarkerLength + OneByteLength + GetCompressedStringLength(buffer[1], numberOfBits: 4);
break;
case CS7L1:
length = TypeMarkerLength + OneByteLength + GetCompressedStringLength(buffer[1], numberOfBits: 7);
break;
case CS7L2:
length = TypeMarkerLength + TwoByteLength + GetCompressedStringLength(GetFixedSizedValue<ushort>(buffer.Slice(start: 1)), numberOfBits: 7);
break;
case CS4BL1:
length = TypeMarkerLength + OneByteLength + OneByteBaseChar + GetCompressedStringLength(buffer[1], numberOfBits: 4);
break;
case CS5BL1:
length = TypeMarkerLength + OneByteLength + OneByteBaseChar + GetCompressedStringLength(buffer[1], numberOfBits: 5);
break;
case CS6BL1:
length = TypeMarkerLength + OneByteLength + OneByteBaseChar + GetCompressedStringLength(buffer[1], numberOfBits: 6);
break;
case NC1:
return 1 + 1 + 1 + (GetUniformNumberArrayItemSize(buffer[1]) * GetFixedSizedValue<byte>(buffer.Slice(2)));
case NC2:
return 1 + 1 + 2 + (GetUniformNumberArrayItemSize(buffer[1]) * GetFixedSizedValue<ushort>(buffer.Slice(2)));
case ANC1:
{
long nItemSize = GetUniformNumberArrayItemSize(buffer[2]) * GetFixedSizedValue<byte>(buffer.Slice(3));
long nItemCount = GetFixedSizedValue<byte>(buffer.Slice(4));
return 1 + 3 + 1 + (nItemSize * nItemCount);
}
case ANC2:
{
long nItemSize = GetUniformNumberArrayItemSize(buffer[2]) * GetFixedSizedValue<ushort>(buffer.Slice(3));
long nItemCount = GetFixedSizedValue<ushort>(buffer.Slice(5));
return 1 + 4 + 2 + (nItemSize * nItemCount);
}
default:
throw new ArgumentException($"Invalid variable length type marker length: {length}");
}
}
return length;
}