xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf/ParseContext.cs (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker #region Copyright notice and license
2*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
3*1b3f573fSAndroid Build Coastguard Worker // Copyright 2008 Google Inc.  All rights reserved.
4*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
5*1b3f573fSAndroid Build Coastguard Worker //
6*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
7*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
8*1b3f573fSAndroid Build Coastguard Worker // met:
9*1b3f573fSAndroid Build Coastguard Worker //
10*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
11*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
13*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
14*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
15*1b3f573fSAndroid Build Coastguard Worker // distribution.
16*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
17*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
18*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
19*1b3f573fSAndroid Build Coastguard Worker //
20*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*1b3f573fSAndroid Build Coastguard Worker #endregion
32*1b3f573fSAndroid Build Coastguard Worker 
33*1b3f573fSAndroid Build Coastguard Worker using System;
34*1b3f573fSAndroid Build Coastguard Worker using System.Buffers;
35*1b3f573fSAndroid Build Coastguard Worker using System.Buffers.Binary;
36*1b3f573fSAndroid Build Coastguard Worker using System.Collections.Generic;
37*1b3f573fSAndroid Build Coastguard Worker using System.IO;
38*1b3f573fSAndroid Build Coastguard Worker using System.Runtime.CompilerServices;
39*1b3f573fSAndroid Build Coastguard Worker using System.Runtime.InteropServices;
40*1b3f573fSAndroid Build Coastguard Worker using System.Security;
41*1b3f573fSAndroid Build Coastguard Worker using System.Text;
42*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.Collections;
43*1b3f573fSAndroid Build Coastguard Worker 
44*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf
45*1b3f573fSAndroid Build Coastguard Worker {
46*1b3f573fSAndroid Build Coastguard Worker     /// <summary>
47*1b3f573fSAndroid Build Coastguard Worker     /// An opaque struct that represents the current parsing state and is passed along
48*1b3f573fSAndroid Build Coastguard Worker     /// as the parsing proceeds.
49*1b3f573fSAndroid Build Coastguard Worker     /// All the public methods are intended to be invoked only by the generated code,
50*1b3f573fSAndroid Build Coastguard Worker     /// users should never invoke them directly.
51*1b3f573fSAndroid Build Coastguard Worker     /// </summary>
52*1b3f573fSAndroid Build Coastguard Worker     [SecuritySafeCritical]
53*1b3f573fSAndroid Build Coastguard Worker     public ref struct ParseContext
54*1b3f573fSAndroid Build Coastguard Worker     {
55*1b3f573fSAndroid Build Coastguard Worker         internal const int DefaultRecursionLimit = 100;
56*1b3f573fSAndroid Build Coastguard Worker         internal const int DefaultSizeLimit = Int32.MaxValue;
57*1b3f573fSAndroid Build Coastguard Worker 
58*1b3f573fSAndroid Build Coastguard Worker         internal ReadOnlySpan<byte> buffer;
59*1b3f573fSAndroid Build Coastguard Worker         internal ParserInternalState state;
60*1b3f573fSAndroid Build Coastguard Worker 
61*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
62*1b3f573fSAndroid Build Coastguard Worker         /// Initialize a <see cref="ParseContext"/>, building all <see cref="ParserInternalState"/> from defaults and
63*1b3f573fSAndroid Build Coastguard Worker         /// the given <paramref name="buffer"/>.
64*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
65*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
InitializeGoogle.Protobuf.ParseContext66*1b3f573fSAndroid Build Coastguard Worker         internal static void Initialize(ReadOnlySpan<byte> buffer, out ParseContext ctx)
67*1b3f573fSAndroid Build Coastguard Worker         {
68*1b3f573fSAndroid Build Coastguard Worker             ParserInternalState state = default;
69*1b3f573fSAndroid Build Coastguard Worker             state.sizeLimit = DefaultSizeLimit;
70*1b3f573fSAndroid Build Coastguard Worker             state.recursionLimit = DefaultRecursionLimit;
71*1b3f573fSAndroid Build Coastguard Worker             state.currentLimit = int.MaxValue;
72*1b3f573fSAndroid Build Coastguard Worker             state.bufferSize = buffer.Length;
73*1b3f573fSAndroid Build Coastguard Worker 
74*1b3f573fSAndroid Build Coastguard Worker             Initialize(buffer, ref state, out ctx);
75*1b3f573fSAndroid Build Coastguard Worker         }
76*1b3f573fSAndroid Build Coastguard Worker 
77*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
78*1b3f573fSAndroid Build Coastguard Worker         /// Initialize a <see cref="ParseContext"/> using existing <see cref="ParserInternalState"/>, e.g. from <see cref="CodedInputStream"/>.
79*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
80*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
InitializeGoogle.Protobuf.ParseContext81*1b3f573fSAndroid Build Coastguard Worker         internal static void Initialize(ReadOnlySpan<byte> buffer, ref ParserInternalState state, out ParseContext ctx)
82*1b3f573fSAndroid Build Coastguard Worker         {
83*1b3f573fSAndroid Build Coastguard Worker             ctx.buffer = buffer;
84*1b3f573fSAndroid Build Coastguard Worker             ctx.state = state;
85*1b3f573fSAndroid Build Coastguard Worker         }
86*1b3f573fSAndroid Build Coastguard Worker 
87*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
88*1b3f573fSAndroid Build Coastguard Worker         /// Creates a ParseContext instance from CodedInputStream.
89*1b3f573fSAndroid Build Coastguard Worker         /// WARNING: internally this copies the CodedInputStream's state, so after done with the ParseContext,
90*1b3f573fSAndroid Build Coastguard Worker         /// the CodedInputStream's state needs to be updated.
91*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
92*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
InitializeGoogle.Protobuf.ParseContext93*1b3f573fSAndroid Build Coastguard Worker         internal static void Initialize(CodedInputStream input, out ParseContext ctx)
94*1b3f573fSAndroid Build Coastguard Worker         {
95*1b3f573fSAndroid Build Coastguard Worker             ctx.buffer = new ReadOnlySpan<byte>(input.InternalBuffer);
96*1b3f573fSAndroid Build Coastguard Worker             // ideally we would use a reference to the original state, but that doesn't seem possible
97*1b3f573fSAndroid Build Coastguard Worker             // so we just copy the struct that holds the state. We will need to later store the state back
98*1b3f573fSAndroid Build Coastguard Worker             // into CodedInputStream if we want to keep it usable.
99*1b3f573fSAndroid Build Coastguard Worker             ctx.state = input.InternalState;
100*1b3f573fSAndroid Build Coastguard Worker         }
101*1b3f573fSAndroid Build Coastguard Worker 
102*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
InitializeGoogle.Protobuf.ParseContext103*1b3f573fSAndroid Build Coastguard Worker         internal static void Initialize(ReadOnlySequence<byte> input, out ParseContext ctx)
104*1b3f573fSAndroid Build Coastguard Worker         {
105*1b3f573fSAndroid Build Coastguard Worker             Initialize(input, DefaultRecursionLimit, out ctx);
106*1b3f573fSAndroid Build Coastguard Worker         }
107*1b3f573fSAndroid Build Coastguard Worker 
108*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
InitializeGoogle.Protobuf.ParseContext109*1b3f573fSAndroid Build Coastguard Worker         internal static void Initialize(ReadOnlySequence<byte> input, int recursionLimit, out ParseContext ctx)
110*1b3f573fSAndroid Build Coastguard Worker         {
111*1b3f573fSAndroid Build Coastguard Worker             ctx.buffer = default;
112*1b3f573fSAndroid Build Coastguard Worker             ctx.state = default;
113*1b3f573fSAndroid Build Coastguard Worker             ctx.state.lastTag = 0;
114*1b3f573fSAndroid Build Coastguard Worker             ctx.state.recursionDepth = 0;
115*1b3f573fSAndroid Build Coastguard Worker             ctx.state.sizeLimit = DefaultSizeLimit;
116*1b3f573fSAndroid Build Coastguard Worker             ctx.state.recursionLimit = recursionLimit;
117*1b3f573fSAndroid Build Coastguard Worker             ctx.state.currentLimit = int.MaxValue;
118*1b3f573fSAndroid Build Coastguard Worker             SegmentedBufferHelper.Initialize(input, out ctx.state.segmentedBufferHelper, out ctx.buffer);
119*1b3f573fSAndroid Build Coastguard Worker             ctx.state.bufferPos = 0;
120*1b3f573fSAndroid Build Coastguard Worker             ctx.state.bufferSize = ctx.buffer.Length;
121*1b3f573fSAndroid Build Coastguard Worker 
122*1b3f573fSAndroid Build Coastguard Worker             ctx.state.DiscardUnknownFields = false;
123*1b3f573fSAndroid Build Coastguard Worker             ctx.state.ExtensionRegistry = null;
124*1b3f573fSAndroid Build Coastguard Worker         }
125*1b3f573fSAndroid Build Coastguard Worker 
126*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
127*1b3f573fSAndroid Build Coastguard Worker         /// Returns the last tag read, or 0 if no tags have been read or we've read beyond
128*1b3f573fSAndroid Build Coastguard Worker         /// the end of the input.
129*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
130*1b3f573fSAndroid Build Coastguard Worker         internal uint LastTag { get { return state.lastTag; } }
131*1b3f573fSAndroid Build Coastguard Worker 
132*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
133*1b3f573fSAndroid Build Coastguard Worker         /// Internal-only property; when set to true, unknown fields will be discarded while parsing.
134*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
135*1b3f573fSAndroid Build Coastguard Worker         internal bool DiscardUnknownFields {
136*1b3f573fSAndroid Build Coastguard Worker             get { return state.DiscardUnknownFields; }
137*1b3f573fSAndroid Build Coastguard Worker             set { state.DiscardUnknownFields = value; }
138*1b3f573fSAndroid Build Coastguard Worker         }
139*1b3f573fSAndroid Build Coastguard Worker 
140*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
141*1b3f573fSAndroid Build Coastguard Worker         /// Internal-only property; provides extension identifiers to compatible messages while parsing.
142*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
143*1b3f573fSAndroid Build Coastguard Worker         internal ExtensionRegistry ExtensionRegistry
144*1b3f573fSAndroid Build Coastguard Worker         {
145*1b3f573fSAndroid Build Coastguard Worker             get { return state.ExtensionRegistry; }
146*1b3f573fSAndroid Build Coastguard Worker             set { state.ExtensionRegistry = value; }
147*1b3f573fSAndroid Build Coastguard Worker         }
148*1b3f573fSAndroid Build Coastguard Worker 
149*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
150*1b3f573fSAndroid Build Coastguard Worker         /// Reads a field tag, returning the tag of 0 for "end of input".
151*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
152*1b3f573fSAndroid Build Coastguard Worker         /// <remarks>
153*1b3f573fSAndroid Build Coastguard Worker         /// If this method returns 0, it doesn't necessarily mean the end of all
154*1b3f573fSAndroid Build Coastguard Worker         /// the data in this CodedInputReader; it may be the end of the logical input
155*1b3f573fSAndroid Build Coastguard Worker         /// for an embedded message, for example.
156*1b3f573fSAndroid Build Coastguard Worker         /// </remarks>
157*1b3f573fSAndroid Build Coastguard Worker         /// <returns>The next field tag, or 0 for end of input. (0 is never a valid tag.)</returns>
158*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadTagGoogle.Protobuf.ParseContext159*1b3f573fSAndroid Build Coastguard Worker         public uint ReadTag()
160*1b3f573fSAndroid Build Coastguard Worker         {
161*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseTag(ref buffer, ref state);
162*1b3f573fSAndroid Build Coastguard Worker         }
163*1b3f573fSAndroid Build Coastguard Worker 
164*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
165*1b3f573fSAndroid Build Coastguard Worker         /// Reads a double field from the input.
166*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
167*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadDoubleGoogle.Protobuf.ParseContext168*1b3f573fSAndroid Build Coastguard Worker         public double ReadDouble()
169*1b3f573fSAndroid Build Coastguard Worker         {
170*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseDouble(ref buffer, ref state);
171*1b3f573fSAndroid Build Coastguard Worker         }
172*1b3f573fSAndroid Build Coastguard Worker 
173*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
174*1b3f573fSAndroid Build Coastguard Worker         /// Reads a float field from the input.
175*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
176*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadFloatGoogle.Protobuf.ParseContext177*1b3f573fSAndroid Build Coastguard Worker         public float ReadFloat()
178*1b3f573fSAndroid Build Coastguard Worker         {
179*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseFloat(ref buffer, ref state);
180*1b3f573fSAndroid Build Coastguard Worker         }
181*1b3f573fSAndroid Build Coastguard Worker 
182*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
183*1b3f573fSAndroid Build Coastguard Worker         /// Reads a uint64 field from the input.
184*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
185*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadUInt64Google.Protobuf.ParseContext186*1b3f573fSAndroid Build Coastguard Worker         public ulong ReadUInt64()
187*1b3f573fSAndroid Build Coastguard Worker         {
188*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseRawVarint64(ref buffer, ref state);
189*1b3f573fSAndroid Build Coastguard Worker         }
190*1b3f573fSAndroid Build Coastguard Worker 
191*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
192*1b3f573fSAndroid Build Coastguard Worker         /// Reads an int64 field from the input.
193*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
194*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadInt64Google.Protobuf.ParseContext195*1b3f573fSAndroid Build Coastguard Worker         public long ReadInt64()
196*1b3f573fSAndroid Build Coastguard Worker         {
197*1b3f573fSAndroid Build Coastguard Worker             return (long)ParsingPrimitives.ParseRawVarint64(ref buffer, ref state);
198*1b3f573fSAndroid Build Coastguard Worker         }
199*1b3f573fSAndroid Build Coastguard Worker 
200*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
201*1b3f573fSAndroid Build Coastguard Worker         /// Reads an int32 field from the input.
202*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
203*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadInt32Google.Protobuf.ParseContext204*1b3f573fSAndroid Build Coastguard Worker         public int ReadInt32()
205*1b3f573fSAndroid Build Coastguard Worker         {
206*1b3f573fSAndroid Build Coastguard Worker             return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
207*1b3f573fSAndroid Build Coastguard Worker         }
208*1b3f573fSAndroid Build Coastguard Worker 
209*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
210*1b3f573fSAndroid Build Coastguard Worker         /// Reads a fixed64 field from the input.
211*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
212*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadFixed64Google.Protobuf.ParseContext213*1b3f573fSAndroid Build Coastguard Worker         public ulong ReadFixed64()
214*1b3f573fSAndroid Build Coastguard Worker         {
215*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state);
216*1b3f573fSAndroid Build Coastguard Worker         }
217*1b3f573fSAndroid Build Coastguard Worker 
218*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
219*1b3f573fSAndroid Build Coastguard Worker         /// Reads a fixed32 field from the input.
220*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
221*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadFixed32Google.Protobuf.ParseContext222*1b3f573fSAndroid Build Coastguard Worker         public uint ReadFixed32()
223*1b3f573fSAndroid Build Coastguard Worker         {
224*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state);
225*1b3f573fSAndroid Build Coastguard Worker         }
226*1b3f573fSAndroid Build Coastguard Worker 
227*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
228*1b3f573fSAndroid Build Coastguard Worker         /// Reads a bool field from the input.
229*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
230*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadBoolGoogle.Protobuf.ParseContext231*1b3f573fSAndroid Build Coastguard Worker         public bool ReadBool()
232*1b3f573fSAndroid Build Coastguard Worker         {
233*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseRawVarint64(ref buffer, ref state) != 0;
234*1b3f573fSAndroid Build Coastguard Worker         }
235*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
236*1b3f573fSAndroid Build Coastguard Worker         /// Reads a string field from the input.
237*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
238*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadStringGoogle.Protobuf.ParseContext239*1b3f573fSAndroid Build Coastguard Worker         public string ReadString()
240*1b3f573fSAndroid Build Coastguard Worker         {
241*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ReadString(ref buffer, ref state);
242*1b3f573fSAndroid Build Coastguard Worker         }
243*1b3f573fSAndroid Build Coastguard Worker 
244*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
245*1b3f573fSAndroid Build Coastguard Worker         /// Reads an embedded message field value from the input.
246*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
247*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadMessageGoogle.Protobuf.ParseContext248*1b3f573fSAndroid Build Coastguard Worker         public void ReadMessage(IMessage message)
249*1b3f573fSAndroid Build Coastguard Worker         {
250*1b3f573fSAndroid Build Coastguard Worker             ParsingPrimitivesMessages.ReadMessage(ref this, message);
251*1b3f573fSAndroid Build Coastguard Worker         }
252*1b3f573fSAndroid Build Coastguard Worker 
253*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
254*1b3f573fSAndroid Build Coastguard Worker         /// Reads an embedded group field from the input.
255*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
256*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadGroupGoogle.Protobuf.ParseContext257*1b3f573fSAndroid Build Coastguard Worker         public void ReadGroup(IMessage message)
258*1b3f573fSAndroid Build Coastguard Worker         {
259*1b3f573fSAndroid Build Coastguard Worker             ParsingPrimitivesMessages.ReadGroup(ref this, message);
260*1b3f573fSAndroid Build Coastguard Worker         }
261*1b3f573fSAndroid Build Coastguard Worker 
262*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
263*1b3f573fSAndroid Build Coastguard Worker         /// Reads a bytes field value from the input.
264*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
265*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadBytesGoogle.Protobuf.ParseContext266*1b3f573fSAndroid Build Coastguard Worker         public ByteString ReadBytes()
267*1b3f573fSAndroid Build Coastguard Worker         {
268*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ReadBytes(ref buffer, ref state);
269*1b3f573fSAndroid Build Coastguard Worker         }
270*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
271*1b3f573fSAndroid Build Coastguard Worker         /// Reads a uint32 field value from the input.
272*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
273*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadUInt32Google.Protobuf.ParseContext274*1b3f573fSAndroid Build Coastguard Worker         public uint ReadUInt32()
275*1b3f573fSAndroid Build Coastguard Worker         {
276*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
277*1b3f573fSAndroid Build Coastguard Worker         }
278*1b3f573fSAndroid Build Coastguard Worker 
279*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
280*1b3f573fSAndroid Build Coastguard Worker         /// Reads an enum field value from the input.
281*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
282*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadEnumGoogle.Protobuf.ParseContext283*1b3f573fSAndroid Build Coastguard Worker         public int ReadEnum()
284*1b3f573fSAndroid Build Coastguard Worker         {
285*1b3f573fSAndroid Build Coastguard Worker             // Currently just a pass-through, but it's nice to separate it logically from WriteInt32.
286*1b3f573fSAndroid Build Coastguard Worker             return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
287*1b3f573fSAndroid Build Coastguard Worker         }
288*1b3f573fSAndroid Build Coastguard Worker 
289*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
290*1b3f573fSAndroid Build Coastguard Worker         /// Reads an sfixed32 field value from the input.
291*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
292*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadSFixed32Google.Protobuf.ParseContext293*1b3f573fSAndroid Build Coastguard Worker         public int ReadSFixed32()
294*1b3f573fSAndroid Build Coastguard Worker         {
295*1b3f573fSAndroid Build Coastguard Worker             return (int)ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state);
296*1b3f573fSAndroid Build Coastguard Worker         }
297*1b3f573fSAndroid Build Coastguard Worker 
298*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
299*1b3f573fSAndroid Build Coastguard Worker         /// Reads an sfixed64 field value from the input.
300*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
301*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadSFixed64Google.Protobuf.ParseContext302*1b3f573fSAndroid Build Coastguard Worker         public long ReadSFixed64()
303*1b3f573fSAndroid Build Coastguard Worker         {
304*1b3f573fSAndroid Build Coastguard Worker             return (long)ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state);
305*1b3f573fSAndroid Build Coastguard Worker         }
306*1b3f573fSAndroid Build Coastguard Worker 
307*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
308*1b3f573fSAndroid Build Coastguard Worker         /// Reads an sint32 field value from the input.
309*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
310*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadSInt32Google.Protobuf.ParseContext311*1b3f573fSAndroid Build Coastguard Worker         public int ReadSInt32()
312*1b3f573fSAndroid Build Coastguard Worker         {
313*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.DecodeZigZag32(ParsingPrimitives.ParseRawVarint32(ref buffer, ref state));
314*1b3f573fSAndroid Build Coastguard Worker         }
315*1b3f573fSAndroid Build Coastguard Worker 
316*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
317*1b3f573fSAndroid Build Coastguard Worker         /// Reads an sint64 field value from the input.
318*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
319*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadSInt64Google.Protobuf.ParseContext320*1b3f573fSAndroid Build Coastguard Worker         public long ReadSInt64()
321*1b3f573fSAndroid Build Coastguard Worker         {
322*1b3f573fSAndroid Build Coastguard Worker             return ParsingPrimitives.DecodeZigZag64(ParsingPrimitives.ParseRawVarint64(ref buffer, ref state));
323*1b3f573fSAndroid Build Coastguard Worker         }
324*1b3f573fSAndroid Build Coastguard Worker 
325*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
326*1b3f573fSAndroid Build Coastguard Worker         /// Reads a length for length-delimited data.
327*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
328*1b3f573fSAndroid Build Coastguard Worker         /// <remarks>
329*1b3f573fSAndroid Build Coastguard Worker         /// This is internally just reading a varint, but this method exists
330*1b3f573fSAndroid Build Coastguard Worker         /// to make the calling code clearer.
331*1b3f573fSAndroid Build Coastguard Worker         /// </remarks>
332*1b3f573fSAndroid Build Coastguard Worker         [MethodImpl(MethodImplOptions.AggressiveInlining)]
ReadLengthGoogle.Protobuf.ParseContext333*1b3f573fSAndroid Build Coastguard Worker         public int ReadLength()
334*1b3f573fSAndroid Build Coastguard Worker         {
335*1b3f573fSAndroid Build Coastguard Worker             return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
336*1b3f573fSAndroid Build Coastguard Worker         }
337*1b3f573fSAndroid Build Coastguard Worker 
CopyStateToGoogle.Protobuf.ParseContext338*1b3f573fSAndroid Build Coastguard Worker         internal void CopyStateTo(CodedInputStream input)
339*1b3f573fSAndroid Build Coastguard Worker         {
340*1b3f573fSAndroid Build Coastguard Worker             input.InternalState = state;
341*1b3f573fSAndroid Build Coastguard Worker         }
342*1b3f573fSAndroid Build Coastguard Worker 
LoadStateFromGoogle.Protobuf.ParseContext343*1b3f573fSAndroid Build Coastguard Worker         internal void LoadStateFrom(CodedInputStream input)
344*1b3f573fSAndroid Build Coastguard Worker         {
345*1b3f573fSAndroid Build Coastguard Worker             state = input.InternalState;
346*1b3f573fSAndroid Build Coastguard Worker         }
347*1b3f573fSAndroid Build Coastguard Worker     }
348*1b3f573fSAndroid Build Coastguard Worker }