private static TimeSpan?TryReadDurationFast(ProtoReader source, ref ProtoReader.State state) { int offset = state.OffsetInCurrent; var span = state.Span; int prefixLength = ProtoReader.State.ParseVarintUInt32(span, offset, out var len); offset += prefixLength; if (len == 0) { return(TimeSpan.Zero); } if ((prefixLength + len) > state.RemainingInCurrent) { return(null); // don't have entire submessage } if (span[offset] != (1 << 3)) { return(null); // expected field 1 } var msgOffset = 1 + ProtoReader.State.TryParseUInt64Varint(span, 1 + offset, out var seconds); ulong nanos = 0; if (msgOffset < len) { if (span[msgOffset++ + offset] != (2 << 3)) { return(null); // expected field 2 } msgOffset += ProtoReader.State.TryParseUInt64Varint(span, msgOffset + offset, out nanos); } if (msgOffset != len) { return(null); // expected no more fields } state.Skip(prefixLength + (int)len); source.Advance(prefixLength + len); return(FromDurationSeconds((long)seconds, (int)(long)nanos)); }
internal void Advance(long count) => _reader.Advance(count);