private unsafe bool TryParseTokenUnsafe()

in Microsoft.Shared.Dna.Json/JsonParser.cs [1539:1606]


        private unsafe bool TryParseTokenUnsafe(out ulong value)
        {
            value = default(ulong);
            ulong accumulator = 0UL;
            int first = this.TokenSegment.Offset;
            int last = first + this.TokenSegment.Count;
            byte digit = default(byte);
            bool isHex = false;
            fixed (char* payloadPointer = this.TokenSegment.String)
            {
                char* cp = payloadPointer + first;
                if (first + 2 < last && *cp == JsonConstants.Zero)
                {
                    first++;
                    cp = payloadPointer + first;
                    isHex = *cp == JsonConstants.HexLowercase || *cp == JsonConstants.HexUppercase;
                }

                if (isHex)
                {
                    first++;
                    for (int i = first; i < last; i++)
                    {
                        cp = payloadPointer + i;
                        if (JsonParser.TryConvertHex(*cp, out digit))
                        {
                            try
                            {
                                accumulator = checked((accumulator * JsonConstants.HexRadix) + digit);
                            }
                            catch (OverflowException)
                            {
                                return false;
                            }
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
                else
                {
                    for (int i = first; i < last; i++)
                    {
                        cp = payloadPointer + i;
                        if (JsonParser.TryConvertDecimal(*cp, out digit))
                        {
                            try
                            {
                                accumulator = checked((accumulator * JsonConstants.DecimalRadix) + digit);
                            }
                            catch (OverflowException)
                            {
                                return false;
                            }
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
            }

            value = accumulator;
            return true;
        }