コード例 #1
0
ファイル: BclHelpers.cs プロジェクト: zhangbo27/SimpleBinary
        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));
        }
コード例 #2
0
 internal void Advance(long count) => _reader.Advance(count);