aboutsummaryrefslogtreecommitdiff
path: root/csharp/ProtocolBuffers/CodedOutputStream.cs
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-08-14 20:33:30 +0100
committerJon Skeet <skeet@pobox.com>2008-08-14 20:33:30 +0100
commitfe7bb26214916d0eec25e7690ff3580477ede510 (patch)
tree814fad30050df141a0a38df71adc5b3d8326ff14 /csharp/ProtocolBuffers/CodedOutputStream.cs
parentc26b43d8cd182cfb5e0317b79c90f1f3f89759ba (diff)
downloadprotobuf-fe7bb26214916d0eec25e7690ff3580477ede510.tar.gz
protobuf-fe7bb26214916d0eec25e7690ff3580477ede510.tar.bz2
protobuf-fe7bb26214916d0eec25e7690ff3580477ede510.zip
Implemented AbstractMethod and split the descriptors into a new package
Diffstat (limited to 'csharp/ProtocolBuffers/CodedOutputStream.cs')
-rw-r--r--csharp/ProtocolBuffers/CodedOutputStream.cs105
1 files changed, 67 insertions, 38 deletions
diff --git a/csharp/ProtocolBuffers/CodedOutputStream.cs b/csharp/ProtocolBuffers/CodedOutputStream.cs
index 51d5d657..bb160319 100644
--- a/csharp/ProtocolBuffers/CodedOutputStream.cs
+++ b/csharp/ProtocolBuffers/CodedOutputStream.cs
@@ -16,6 +16,7 @@
using System;
using System.IO;
using System.Text;
+using Google.ProtocolBuffers.Descriptors;
namespace Google.ProtocolBuffers {
@@ -251,26 +252,26 @@ namespace Google.ProtocolBuffers {
WriteTag(WireFormat.MessageSetField.Item, WireFormat.WireType.EndGroup);
}
- public void WriteField(Descriptors.FieldDescriptor.Type fieldType, int fieldNumber, object value) {
+ public void WriteField(FieldType fieldType, int fieldNumber, object value) {
switch (fieldType) {
- case Descriptors.FieldDescriptor.Type.Double: WriteDouble(fieldNumber, (double)value); break;
- case Descriptors.FieldDescriptor.Type.Float: WriteFloat(fieldNumber, (float)value); break;
- case Descriptors.FieldDescriptor.Type.Int64: WriteInt64(fieldNumber, (long)value); break;
- case Descriptors.FieldDescriptor.Type.UInt64: WriteUInt64(fieldNumber, (ulong)value); break;
- case Descriptors.FieldDescriptor.Type.Int32: WriteInt32(fieldNumber, (int)value); break;
- case Descriptors.FieldDescriptor.Type.Fixed64: WriteFixed64(fieldNumber, (long)value); break;
- case Descriptors.FieldDescriptor.Type.Fixed32: WriteFixed32(fieldNumber, (int)value); break;
- case Descriptors.FieldDescriptor.Type.Bool: WriteBool(fieldNumber, (bool)value); break;
- case Descriptors.FieldDescriptor.Type.String: WriteString(fieldNumber, (string)value); break;
- case Descriptors.FieldDescriptor.Type.Group: WriteGroup(fieldNumber, (IMessage)value); break;
- case Descriptors.FieldDescriptor.Type.Message: WriteMessage(fieldNumber, (IMessage)value); break;
- case Descriptors.FieldDescriptor.Type.Bytes: WriteBytes(fieldNumber, (ByteString)value); break;
- case Descriptors.FieldDescriptor.Type.UInt32: WriteUInt32(fieldNumber, (uint)value); break;
- case Descriptors.FieldDescriptor.Type.SFixed32: WriteSFixed32(fieldNumber, (int)value); break;
- case Descriptors.FieldDescriptor.Type.SFixed64: WriteSFixed64(fieldNumber, (long)value); break;
- case Descriptors.FieldDescriptor.Type.SInt32: WriteSInt32(fieldNumber, (int)value); break;
- case Descriptors.FieldDescriptor.Type.SInt64: WriteSInt64(fieldNumber, (long)value); break;
- case Descriptors.FieldDescriptor.Type.Enum: WriteEnum(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number);
+ case FieldType.Double: WriteDouble(fieldNumber, (double)value); break;
+ case FieldType.Float: WriteFloat(fieldNumber, (float)value); break;
+ case FieldType.Int64: WriteInt64(fieldNumber, (long)value); break;
+ case FieldType.UInt64: WriteUInt64(fieldNumber, (ulong)value); break;
+ case FieldType.Int32: WriteInt32(fieldNumber, (int)value); break;
+ case FieldType.Fixed64: WriteFixed64(fieldNumber, (long)value); break;
+ case FieldType.Fixed32: WriteFixed32(fieldNumber, (int)value); break;
+ case FieldType.Bool: WriteBool(fieldNumber, (bool)value); break;
+ case FieldType.String: WriteString(fieldNumber, (string)value); break;
+ case FieldType.Group: WriteGroup(fieldNumber, (IMessage)value); break;
+ case FieldType.Message: WriteMessage(fieldNumber, (IMessage)value); break;
+ case FieldType.Bytes: WriteBytes(fieldNumber, (ByteString)value); break;
+ case FieldType.UInt32: WriteUInt32(fieldNumber, (uint)value); break;
+ case FieldType.SFixed32: WriteSFixed32(fieldNumber, (int)value); break;
+ case FieldType.SFixed64: WriteSFixed64(fieldNumber, (long)value); break;
+ case FieldType.SInt32: WriteSInt32(fieldNumber, (int)value); break;
+ case FieldType.SInt64: WriteSInt64(fieldNumber, (long)value); break;
+ case FieldType.Enum: WriteEnum(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number);
break;
}
}
@@ -617,26 +618,26 @@ namespace Google.ProtocolBuffers {
* {@link Message#getField(Descriptors.FieldDescriptor)} for
* this field.
*/
- public static int ComputeFieldSize(Descriptors.FieldDescriptor.Type fieldType, int fieldNumber, Object value) {
+ public static int ComputeFieldSize(FieldType fieldType, int fieldNumber, Object value) {
switch (fieldType) {
- case Descriptors.FieldDescriptor.Type.Double: return ComputeDoubleSize(fieldNumber, (double)value);
- case Descriptors.FieldDescriptor.Type.Float: return ComputeFloatSize(fieldNumber, (float)value);
- case Descriptors.FieldDescriptor.Type.Int64: return ComputeInt64Size(fieldNumber, (long)value);
- case Descriptors.FieldDescriptor.Type.UInt64: return ComputeUInt64Size(fieldNumber, (ulong)value);
- case Descriptors.FieldDescriptor.Type.Int32: return ComputeInt32Size(fieldNumber, (int)value);
- case Descriptors.FieldDescriptor.Type.Fixed64: return ComputeFixed64Size(fieldNumber, (long)value);
- case Descriptors.FieldDescriptor.Type.Fixed32: return ComputeFixed32Size(fieldNumber, (int)value);
- case Descriptors.FieldDescriptor.Type.Bool: return ComputeBoolSize(fieldNumber, (bool)value);
- case Descriptors.FieldDescriptor.Type.String: return ComputeStringSize(fieldNumber, (string)value);
- case Descriptors.FieldDescriptor.Type.Group: return ComputeGroupSize(fieldNumber, (IMessage)value);
- case Descriptors.FieldDescriptor.Type.Message: return ComputeMessageSize(fieldNumber, (IMessage)value);
- case Descriptors.FieldDescriptor.Type.Bytes: return ComputeBytesSize(fieldNumber, (ByteString)value);
- case Descriptors.FieldDescriptor.Type.UInt32: return ComputeUInt32Size(fieldNumber, (uint)value);
- case Descriptors.FieldDescriptor.Type.SFixed32: return ComputeSFixed32Size(fieldNumber, (int)value);
- case Descriptors.FieldDescriptor.Type.SFixed64: return ComputeSFixed64Size(fieldNumber, (long)value);
- case Descriptors.FieldDescriptor.Type.SInt32: return ComputeSInt32Size(fieldNumber, (int)value);
- case Descriptors.FieldDescriptor.Type.SInt64: return ComputeSInt64Size(fieldNumber, (long)value);
- case Descriptors.FieldDescriptor.Type.Enum: return ComputeEnumSize(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number);
+ case FieldType.Double: return ComputeDoubleSize(fieldNumber, (double)value);
+ case FieldType.Float: return ComputeFloatSize(fieldNumber, (float)value);
+ case FieldType.Int64: return ComputeInt64Size(fieldNumber, (long)value);
+ case FieldType.UInt64: return ComputeUInt64Size(fieldNumber, (ulong)value);
+ case FieldType.Int32: return ComputeInt32Size(fieldNumber, (int)value);
+ case FieldType.Fixed64: return ComputeFixed64Size(fieldNumber, (long)value);
+ case FieldType.Fixed32: return ComputeFixed32Size(fieldNumber, (int)value);
+ case FieldType.Bool: return ComputeBoolSize(fieldNumber, (bool)value);
+ case FieldType.String: return ComputeStringSize(fieldNumber, (string)value);
+ case FieldType.Group: return ComputeGroupSize(fieldNumber, (IMessage)value);
+ case FieldType.Message: return ComputeMessageSize(fieldNumber, (IMessage)value);
+ case FieldType.Bytes: return ComputeBytesSize(fieldNumber, (ByteString)value);
+ case FieldType.UInt32: return ComputeUInt32Size(fieldNumber, (uint)value);
+ case FieldType.SFixed32: return ComputeSFixed32Size(fieldNumber, (int)value);
+ case FieldType.SFixed64: return ComputeSFixed64Size(fieldNumber, (long)value);
+ case FieldType.SInt32: return ComputeSInt32Size(fieldNumber, (int)value);
+ case FieldType.SInt64: return ComputeSInt64Size(fieldNumber, (long)value);
+ case FieldType.Enum: return ComputeEnumSize(fieldNumber, ((Descriptors.EnumValueDescriptor)value).Number);
default:
throw new ArgumentOutOfRangeException("Invalid field type " + fieldType);
}
@@ -704,5 +705,33 @@ namespace Google.ProtocolBuffers {
RefreshBuffer();
}
}
+
+ /// <summary>
+ /// Verifies that SpaceLeft returns zero. It's common to create a byte array
+ /// that is exactly big enough to hold a message, then write to it with
+ /// a CodedOutputStream. Calling CheckNoSpaceLeft after writing verifies that
+ /// the message was actually as big as expected, which can help bugs.
+ /// </summary>
+ public void CheckNoSpaceLeft() {
+ if (SpaceLeft != 0) {
+ throw new InvalidOperationException("Did not write as much data as expected.");
+ }
+ }
+
+ /// <summary>
+ /// If writing to a flat array, returns the space left in the array. Otherwise,
+ /// throws an InvalidOperationException.
+ /// </summary>
+ public int SpaceLeft {
+ get {
+ if (output == null) {
+ return limit - position;
+ } else {
+ throw new InvalidOperationException(
+ "SpaceLeft can only be called on CodedOutputStreams that are " +
+ "writing to a flat array.");
+ }
+ }
+ }
}
} \ No newline at end of file