Example #1
0
            private protected override int ImplTryReadUInt32VarintWithoutMoving(ref State state, Read32VarintMode mode, out uint value)
            {
                return(state.RemainingInCurrent >= 10
                    ? TryParseUInt32Varint(this, ref state, state.OffsetInCurrent,
                                           mode == Read32VarintMode.Signed, out value, state.Span)
                    : ViaStackAlloc(ref state, mode, out value));

                unsafe int ViaStackAlloc(ref State s, Read32VarintMode m, out uint val)
                {
                    byte *      stack         = stackalloc byte[10]; // because otherwise compiler is convinced we're screwing up
                    Span <byte> span          = new Span <byte>(stack, 10);
                    Span <byte> target        = span;
                    var         currentBuffer = Peek(ref s, Math.Min(target.Length, s.RemainingInCurrent));

                    currentBuffer.CopyTo(target);
                    int available = currentBuffer.Length;

                    target = target.Slice(available);

                    var iterCopy = _source;

                    while (!target.IsEmpty && iterCopy.MoveNext())
                    {
                        var nextBuffer = iterCopy.Current.Span;
                        var take       = Math.Min(nextBuffer.Length, target.Length);

                        nextBuffer.Slice(0, take).CopyTo(target);
                        target     = target.Slice(take);
                        available += take;
                    }
                    if (available != 10)
                    {
                        span = span.Slice(0, available);
                    }
                    return(TryParseUInt32Varint(this, ref s, 0, m == Read32VarintMode.Signed, out val, span));
                }
            }
Example #2
0
 private protected abstract int ImplTryReadUInt32VarintWithoutMoving(ref State state, Read32VarintMode mode, out uint value);