public static long GetValueLength()

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;
            }