Browse Source

Added the ability to instantiate a coded input with a pre-existing buffer
Added CodedInputStream.Position to return the current input stream position

csharptest 12 năm trước cách đây
mục cha
commit
92fcf3537f

+ 30 - 2
src/ProtocolBuffers/CodedInputStream.cs

@@ -108,6 +108,14 @@ namespace Google.ProtocolBuffers
         {
         {
             return new CodedInputStream(input);
             return new CodedInputStream(input);
         }
         }
+        /// <summary>
+        /// Creates a new CodedInputStream reading data from the given
+        /// stream and a pre-allocated memory buffer.
+        /// </summary>
+        public static CodedInputStream CreateInstance(Stream input, byte[] buffer)
+        {
+            return new CodedInputStream(input, buffer);
+        }
 
 
         /// <summary>
         /// <summary>
         /// Creates a new CodedInputStream reading data from the given
         /// Creates a new CodedInputStream reading data from the given
@@ -142,8 +150,28 @@ namespace Google.ProtocolBuffers
             this.input = input;
             this.input = input;
         }
         }
 
 
+        private CodedInputStream(Stream input, byte[] buffer)
+        {
+            this.buffer = buffer;
+            this.bufferSize = 0;
+            this.input = input;
+        }
         #endregion
         #endregion
 
 
+        /// <summary>
+        /// Returns the current position in the input stream, or the position in the input buffer
+        /// </summary>
+        public long Position 
+        {
+            get
+            {
+                if (input != null)
+                    return input.Position - (bufferSize - bufferPos);
+                return bufferPos;
+            }
+        }
+
+
         void ICodedInputStream.ReadMessageStart() { }
         void ICodedInputStream.ReadMessageStart() { }
         void ICodedInputStream.ReadMessageEnd() { }
         void ICodedInputStream.ReadMessageEnd() { }
 
 
@@ -1608,7 +1636,7 @@ namespace Google.ProtocolBuffers
                 bufferPos += size;
                 bufferPos += size;
                 return bytes;
                 return bytes;
             }
             }
-            else if (size < BufferSize)
+            else if (size < buffer.Length)
             {
             {
                 // Reading more bytes than are in the buffer, but not an excessive number
                 // Reading more bytes than are in the buffer, but not an excessive number
                 // of bytes.  We can safely allocate the resulting array ahead of time.
                 // of bytes.  We can safely allocate the resulting array ahead of time.
@@ -1663,7 +1691,7 @@ namespace Google.ProtocolBuffers
 
 
                 while (sizeLeft > 0)
                 while (sizeLeft > 0)
                 {
                 {
-                    byte[] chunk = new byte[Math.Min(sizeLeft, BufferSize)];
+                    byte[] chunk = new byte[Math.Min(sizeLeft, buffer.Length)];
                     int pos = 0;
                     int pos = 0;
                     while (pos < chunk.Length)
                     while (pos < chunk.Length)
                     {
                     {

+ 4 - 0
src/ProtocolBuffersLite.Test/AbstractBuilderLiteTest.cs

@@ -326,10 +326,14 @@ namespace Google.ProtocolBuffers
             var input = CodedInputStream.CreateInstance(ms);
             var input = CodedInputStream.CreateInstance(ms);
             var builder = BucketOfBytes.CreateBuilder();
             var builder = BucketOfBytes.CreateBuilder();
             input.ReadMessage(builder, ExtensionRegistry.Empty);
             input.ReadMessage(builder, ExtensionRegistry.Empty);
+            Assert.AreEqual(3005L, input.Position);
             Assert.AreEqual(3000, builder.Value.Length);
             Assert.AreEqual(3000, builder.Value.Length);
             input.ReadMessage(builder, ExtensionRegistry.Empty);
             input.ReadMessage(builder, ExtensionRegistry.Empty);
+            Assert.AreEqual(5114, input.Position);
             Assert.AreEqual(1000, builder.Value.Length);
             Assert.AreEqual(1000, builder.Value.Length);
             input.ReadMessage(builder, ExtensionRegistry.Empty);
             input.ReadMessage(builder, ExtensionRegistry.Empty);
+            Assert.AreEqual(5217L, input.Position);
+            Assert.AreEqual(input.Position, ms.Length);
             Assert.AreEqual(100, builder.Value.Length);
             Assert.AreEqual(100, builder.Value.Length);
         }
         }
     }
     }