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)); } }
private protected abstract int ImplTryReadUInt32VarintWithoutMoving(ref State state, Read32VarintMode mode, out uint value);