Commit 92fcf353 authored by csharptest's avatar csharptest Committed by rogerk

Added the ability to instantiate a coded input with a pre-existing buffer

Added CodedInputStream.Position to return the current input stream position
parent 71e22f8b
...@@ -108,6 +108,14 @@ namespace Google.ProtocolBuffers ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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)
{ {
......
...@@ -326,10 +326,14 @@ namespace Google.ProtocolBuffers ...@@ -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);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment